トランザクションログで、おそらく存在しないか破損しているチェックポイントレコードを探しています。次のコマンドを実行することで、これが当てはまるかどうかを判断できます。
# Postgres >= 10
pg_resetwal DATADIR
# Postgres < 10
pg_resetxlog DATADIR
トランザクションログが破損している場合は、次のようなメッセージが表示されます:
データベースサーバーが正常にシャットダウンされませんでした。トランザクションログをリセットすると、データが失われる可能性があります。とにかく続行する場合は、
-f
を使用します 強制的にリセットします。
その後、指示に従い、-f
で実行できます。 更新を強制するには:
# Postgres >= 10
pg_resetwal -f DATADIR
# Postgres < 10
pg_resetxlog -f DATADIR
これによりトランザクションログがリセットされますが、pg_resetwal
のPostgreSQLドキュメントで説明されているように、データベースが不確定な状態になる可能性があります。 :
pg_resetwal
の場合pg_control
の有効なデータを判別できないと文句を言う 、-f
を指定することで、とにかく続行するように強制できます。 (強制)オプション。この場合、欠落しているデータの代わりにもっともらしい値が使用されます。ほとんどのフィールドは一致すると予想できますが、次のOID、次のtransactionIDとエポック、次のマルチトランザクションIDとオフセット、およびWAL開始位置フィールドに対して手動の支援が必要になる場合があります。これらのフィールドは、以下で説明するオプションを使用して設定できます。これらすべてのフィールドの正しい値を判別できない場合は、-f
引き続き使用できますが、リカバリされたデータベースは通常よりもさらに疑わしい方法で処理する必要があります。ただちにダンプしてリロードする必要があります。ダンプする前に、データベースでデータ変更操作を実行しないでください。このような操作を行うと、破損が悪化する可能性があります。