2017-10-19 31 views
0

「PostgreSQL Replication by Hans-Jurgen Schonig」と、archive_commandの実行中にアーカイブWALファイルを上書きしないことをお勧めします。これの理由は?次のシナリオがWAL上書きに有効な場合Postgresql WAL archive_commandファイルの比較

Iは、個々のWALアーカイブ手順は、次のハイレベル・ロジックを実行するスクリプトを書いた:要するに

if (/archive/00000001000000F700000067 exists and is readable) and (00000001000000F700000067 is byte by byte equal to /archive/00000001000000F700000067) 
    exit with status 0 
else 
    if (copy 00000001000000F700000067 to /archive/00000001000000F700000067 is successful) 
    if (/archive/00000001000000F700000067 exists and is readable) and (00000001000000F700000067 is byte by byte equal to /archive/00000001000000F700000067) 
     exit with status 0 
    else 
     exit with status non-zero 
    else 
    exit with status non-zero 

を、このアプローチは、元のWALファイルは、少なくともシナリオに対して防御したいと考えています誤ってアーカイブされました。コピーには有効なファイル名がありますが、破損しています(ハードウェア障害など)。この例ではWALアーカイブプロセスの私の理解:

  • にarchive_commandは、私たちはコピー手順が偽の成功応答を持っていると仮定してみましょう(コピー手順の後にバイト用-BYEの比較の際にゼロ以外の終了ステータスを返します。 )
  • 文書によると、非ゼロの時にEXIT_STATUS WALアーカイブは無期限に再試行されます - WALアーカイブの第二の試みは
  • にarchive_commandを発生する必要があり、既存のアーカイブWALは、現在のWALバイトと一致しないことを認識するだろう-wise
  • コピー手順は2回目です。うまくいけば
  • EXIT_STATUS 0は、ファイルの成功の比較の際に破損したファイルを書き込み、それ以外の場合は、このプロセスは

を繰り返すことになる私は、MD5チェックに更新することができ、比較(に関わる非常にマイナーなオーバーヘッドがあります)、誰もそのようなアプローチから生じる可能性のある問題を見ることができますか?またはさらに何かをお勧めしますか?

は私が正しくあなたの擬似コードを読めば、彼らはWALツーこと-アーカイブされ、現在に同一でない場合、あなたはアーカイブにWALセグメントを上書きしますあなたの

答えて

1

ありがとうございます。

問題は、WALアーカイブは非常に重要な情報であり、誰かが以前に書いたアーカイブWALセグメントに筆記していることです。 2つのPostgreSQLクラスタが誤って同じアーカイブディレクトリに書き込まれている構成が間違っていると、WALアーカイブが壊れてしまいます。

この場合、アーカイブを停止して管理者に警告する方がよいでしょう。

+0

もちろん、華麗です。ありがとうございます。私の場合、これは単一のpostgresqlサーバへのローカルストレージです。 – abstractx1

関連する問題