Postgresサーバー(v9.0.1)をロードすると、起動を妨げるパニックが発生します。
パニック:有効なチェックポイントレコードを見つけることができませんでした
どうすれば修正できますか?
トランザクションログで、おそらく存在しないか破損しているチェックポイントレコードを探しています。次のコマンドを実行すると、これが事実かどうかを判断できます。
# Postgres < 10.0
pg_resetxlog DATADIR
# Postgres >= 10.0
pg_resetwal DATADIR
トランザクションログが破損している場合、次のようなメッセージが表示されます。
データベースサーバーが正常にシャットダウンされませんでした。トランザクションログをリセットすると、データが失われる可能性があります。それでも続行したい場合は、-fを使用して強制的にリセットします。
その後、指示に従って-f
を使用して実行し、更新を強制できます。
# Postgres < 10.0
pg_resetxlog -f DATADIR
# Postgres >= 10.0
pg_resetwal -f DATADIR
これによりトランザクションログがリセットされますが、 PostgreSQLドキュメントのpg_resetxlog
で説明されているように、データベースが不確定な状態のままになる可能性があります。
Pg_resetxlogがpg_controlの有効なデータを決定できないと苦情を言った場合は、
-f
(force)スイッチを指定することで強制的に続行できます。この場合、欠落しているデータの代わりにもっともらしい値が使用されます。ほとんどのフィールドは一致すると予想されますが、次のOID、次のトランザクションIDとエポック、次のマルチトランザクションIDとオフセット、およびWAL開始アドレスフィールドについては、手動による支援が必要になる場合があります。これらのフィールドは、以下で説明するスイッチを使用して設定できます。これらのすべてのフィールドの正しい値を決定できない場合は、-f
を引き続き使用できますが、リカバリしたデータベースは通常よりもさらに疑いを持って処理する必要があります。即時のダンプとリロードが必須です。ダンプする前にデータベースでデータ変更操作を実行しないでください。そのようなアクションは破損を悪化させる可能性が高いためです。
9.1.7を実行していますが、次が正常に実行されました。
/usr/lib/postgresql/9.1/bin/pg_resetxlog -f /var/lib/postgresql/9.1/main
pg_resetxlog
コマンドの最後の引数は、postgresがデータベースデータを保存するディスク上の場所です。
ここに示す pg_resetxlogは実行しないでください。これを参照する答えは悪いアドバイスです。コピー/レプリケーションインスタンスのコンテキストでエラーが発生したと仮定すると、リンクはpg_basebackup
継続的なアーカイブを行っていますか?その時点でバックアップしている場合は、backup_labelを削除する方が賢明かもしれません。 pg_resetxlog
は厳しいものです。
ログが言っているように:有効なチェックポイントレコードを見つけることができませんでした。Postgresは$ PGDATA/pg_xlog /ディレクトリの下で適切なWALを見つけることができません。 pg_resetxlogを使用してみてください