pg_resetxlog — PostgreSQLデータベースクラスタの先行書き込みログやその他の制御情報を初期化する
pg_resetxlog [-c xid,xid] [-f] [-n] [-o oid] [-x xid] [-e xid_epoch] [-m mxid,mxid] [-O mxoff] [-l xlogfile] {[-D] datadir}
pg_resetxlogは、先行書き込みログ(WAL)を消去し、さらにオプションでpg_controlファイル内に保存された制御情報の一部を初期化します。
この機能は、これらのファイルが破損した場合に必要になることがあります。
このような破損などが原因でサーバを起動できない場合の最後の手段としてのみ、この機能を使用してください。
このコマンドを実行すると、サーバが開始できるようになるはずです。
ただし、不完全にコミットされたトランザクションが原因でデータベースのデータに矛盾が起こる可能性があることに注意してください。
コマンドの実行後は、ただちにデータをダンプし、initdbを実行し、リロードすべきです。
リロード後、矛盾がないか検査し、必要に応じて修復を行ってください。
このユーティリティの実行にはデータディレクトリへの読み込み/書き込みアクセス権限が必要となるため、サーバをインストールしたユーザのみが実行できます。
安全のため、データディレクトリをコマンドラインで指定する必要があります。
pg_resetxlogは、環境変数PGDATAを使用しません。
pg_resetxlogがpg_controlに対する有効なデータを判別できない場合、-f(force,強制)オプションを指定すれば強制的に処理を進めることができます。
その場合、欠落したデータは無難な値で代用されます。
ほとんどフィールドでは適切な値が使用されますが、次のOID、次のトランザクションIDとエポック時間、マルチトランザクションIDとそのオフセット、WAL開始アドレスの値については、手動の操作が必要な場合があります。
これらの値は下記で説明するオプションを使用して設定することができます。
すべてに対して正しい値を決定できない場合でも-fを使用することができますが、この場合は回復したデータベースを通常よりさらに注意深く検査する必要があります。
必ず、ただちにダンプおよびリロードを行ってください。
決して、ダンプを行う前にデータ変更などの操作を行ってはなりません。
そのような操作は、破損状態をさらに悪化させます。
-o、-x、-e、-m、-O、-lの各オプションを使用すると、次のOID、次のトランザクションID、次のトランザクションIDのエポック時間、次および最古のマルチトランザクションID、次のマルチトランザクションのオフセット、コミット時刻が取り出せる最古および最新のトランザクションID、WAL開始アドレスの値を手動で設定することができます。
この操作は、pg_resetxlogがpg_controlの読み込みによって適切な値を判別できない場合にのみ必要です。
安全な値を得るには、以下のようにします。
次のトランザクションID(-x)用の安全な値は、データディレクトリ以下のpg_clogディレクトリ内で最も大きな数字を持つファイル名を探し、その値に1を加え、1048576で乗算することで決定できます。
ファイル名は16進数ですので、通常、オプションの値も16進数で指定した方が簡単です。
例えば、0011がpg_clogで最も大きなエントリであれば、-x 0x1200000となります(後ろにゼロを5つ付けると、正しく乗算したことになります)。
次のマルチトランザクションID(-mの最初の部分)用の安全な値は、データディレクトリ以下のpg_multixact/offsetsディレクトリ内で最も大きな数字を持つファイル名を探し、その値に1を加え、65536で乗算することで決定できます。
反対に最古のマルチトランザクションID(-mの第二部分)は、同じディレクトリの中で数値的に最小のファイル名を見つけ、65536で乗算することで決定できます。
上と同様、ファイル名は16進数ですので、通常、オプションの値も16進数で指定した方が簡単です。
ここでは、4個のゼロを付けてください。
次のマルチトランザクションオフセット(-O)用の安全な値は、データディレクトリ以下のpg_multixact/membersディレクトリ内で最も大きな数字を持つファイル名を探し、その値に1を加え、52352で乗算することで決定できます。
上と同様、ファイル名は16進数ですので、通常、オプションの値も16進数で指定した方が簡単ですが、上のような0をつけるだけの簡単な計算はありません。
コミット時刻が取り出せる最古のトランザクションIDとして安全な値(-cの1番目の部分)はデータディレクトリの下のpg_commit_tsディレクトリの中で、数値的に最小のファイル名を探すことで決定できます。
逆に、コミット時刻が取り出せる最新のトランザクションIDとして安全な値(-cの2番目の部分)は同じディレクトリの中で、数値的に最大のファイル名を探すことで決定できます。
上と同じく、ファイル名は16進数になっています。
WAL開始アドレス(-l)は、データディレクトリ以下のpg_xlogに現在存在するWALセグメントファイル名のどの番号よりも大きくならなければなりません。
この名前も16進数で、3つの部分に分かれています。
最初の部分は「時系列ID」で、通常、この値は変更すべきではありません。
例えば、pg_xlog内で最大のエントリが00000001000000320000004Aである場合は、-l 00000001000000320000004B以上を使用してください。
pg_resetxlog自体はpg_xlog内のファイルを参照し、既存のファイル名の最後を超えた値をデフォルトの-l設定として選択します。
したがって、手作業による-lの調整は、オフラインアーカイブ内の項目などpg_xlogに現存しないWALセグメントファイルに注意する場合、または、pg_xlogの内容が完全に失われている場合にのみ必要とされます。
データベース内のOIDの最大値よりも大きな次のOIDを決定するには、上記のような簡単な方法はありません。 しかし、幸いにも、次のOIDの設定をが正しく取得することは、それほど重要ではありません。
pg_resetxlogで設定されるフィールドを除き、トランザクションIDのエポック時間は実際にはデータベース内に格納されません。
そのため、データベース自身が問題としない限り、任意の値で動作するでしょう。
Slony-IやSkytoolsなどのレプリケーションシステムが確実に正しく動作するように、この値を調整しなければならない可能性があります。
その場合、適切な値はレプリケーションシステムの下流で複製されたデータベースの状態から得られるはずです。
-n(no operation,操作なし)オプションを指定すると、pg_resetxlogはpg_controlから再構築した値、および変更される値を出力して、何も変更せずに終了します。
これは主にデバッグと目的としたツールですが、pg_resetxlogを実際に進める前の検査としても有用な場合があります。
-Vおよび--versionオプションはpg_resetxlogのバージョンを表示し、終了します。
-?および--helpオプションはサポートする引数を表示し、終了します。
このコマンドは、サーバの稼動中に使用してはいけません。
pg_resetxlogは、データディレクトリにサーバのロックファイルがあると、実行されません。
サーバがクラッシュした場合、ロックファイルがそのまま残される場合があります。
その場合は、ロックファイルを削除すればpg_resetxlogを実行することができます。
ただし、このコマンドを実行する時は、起動中のサーバプロセスが一切ないことを慎重に確認してください。