PG_RESETXLOG(1)

NAME
pg_resetxlog - PostgreSQLデータベースクラスタのログ先行書き込みやその他の制御情報の初期化

SYNOPSIS

pg_resetxlog [ -f ] [ -n ] [ -o oid ] [ -x xid ] [ -l timelineid,fileid,seg ] datadir

説明

pg_resetxlogは、先行書き込みログ(WAL)を消去し、更にオプションで(pg_controlファイル内に保存された)制御情報の一部を初期化します。 この機能は、これらのファイルが破壊された場合に必要になることがあります。 そのような破壊のためにサーバを起動できない場合の最後の手段としてのみ、この機能を使用してください。

このコマンドを実行するとサーバを開始できるようになるはずです。 ただし、不完全にコミットされたトランザクションが原因でデータベースのデータに矛盾が起こる可能性があることに注意してください。 データを直ちにダンプし、initdbを実行し、リロードする必要があります。 リロード後、矛盾がないか検査し、必要に応じて修復を行なってください。

このユーティリティの実行にはデータディレクトリへの読み込み/書き込みアクセス権限が必要となるため、サーバをインストールしたユーザのみが実行できます。 安全のため、データディレクトリをコマンドラインで指定する必要があります。 pg_resetxlogは、PGDATA環境変数を使用しません。

pg_resetxlogがpg_controlに対する有効なデータを判別できない場合には、-f(強制)スイッチを指定して強制的に処理を進めることができます。 その場合、欠落したデータには代用できる無難な値が使用されます。 ほとんどフィールドは適切であると思われますが、次のOID、次のトランザクションID、WAL開始アドレスおよびデータベースロケールフィールドについては、手動の操作が必要な場合があります。 最初の3つについては下記で説明するスイッチを使用して設定することができます。 pg_resetxlog自身の環境がロケールフィールドを想定するための基礎となるのでLANGなどの値がinitdbが実行された環境と一致するよう注意してください。 これらのフィールド用の正しい値を全て決定できない場合にも-fを使用することができますが、回復したデータベースは通常より更に注意深く検査する必要があります。 必ず、直ちにダンプおよびリロードを行なってください。 決して、ダンプを行なう前にデータベースでデータ変更などの操作を行なってはなりません。 これを行なうと、破損状態がさらに悪化します。

-o、-x、および-lの各スイッチを使用して、次のOID、次のトランザクションID、そしてWAL開始アドレスの値を手動で設定することができます。 この操作は、pg_resetxlogがpg_controlを読み込むことによって適切な値を判別できない場合にのみ必要です。 次のトランザクションIDのための安全な値を決定するには、以下のようにします。 まず、データディレクトリ以下の/pg_clog内で最も大きな数字を持つファイル名の値を見つけ、それに1を加え、1048576で乗算します。 ファイル名は、16進数です。 通常、スイッチの値も16進数で指定するのが簡単な方法です。 例えば、0011がpg_clogで最も大きなエントリであれば、-x 0x1200000となります(後のゼロ5つにより適切な乗数となります)。 WAL開始アドレスは、データディレクトリ以下のpg_xlogに現在存在するファイルのどの番号よりも大きくならなければなりません。 このアドレスも16進数で、3つの部分に分かれます。 最初の部分は``時系列ID''で、通常は同じ値が使用され続けます。 第3部分には255 (0xFF)より大きい値を付けてはなりません。 第2部分に1を加え、そして、第3部分を0に戻してください。 例えば、pg_xlog内で最大のエントリが00000001000000320000004Aである場合は、-l 0x1,0x32,0x4Bは問題ありません。 しかし、最大のエントリが000000010000003A000000FFの場合は、-l 0x1,0x3B,0x0以上を選択してください。 データベース内で最大のOIDを越える、次のOIDを決定するには、このような簡単な方法はありません。 しかし幸い、次のOIDが正しく設定されているかどうかは、それほど重要ではありません。

-n(操作なし)スイッチは、pg_resetxlogに対しpg_controlから再構築された値を出力するよう指示し、何も変更せずに終了します。 これは主にデバッグと目的としたツールですが、pg_resetxlogを実際に進める前の検査としても有用な場合があります。

注釈

このコマンドは、サーバの稼動中に使用してはなりません。 pg_resetxlogは、データディレクトリにサーバのロックファイルがあると、始動しません。 サーバがクラッシュした際にロックファイルがそのまま残される場合があります。 その場合は、ロックファイルを削除してpg_resetxlogを実行することができます。 ただしこれを行う前に、まだ活動中のpostmaster、あるいはバックエンドのサーバプロセスが一切ないことを慎重に確認してください。