postgres サーバー (v9.0.1) をロードすると、パニックが発生して起動できなくなります。
パニック: 有効なチェックポイント レコードが見つかりませんでした
これをどうすれば修正できますか?
ベストアンサー1
Postgres は、おそらく存在しないか破損しているトランザクション ログ内のチェックポイント レコードを探しています。
先に進む前に、以下のことは事態を悪化させる可能性があるので注意が必要です運が悪ければ、pg_resetwal
データベースが不確定な状態になる可能性があり、PostgreSQLのドキュメントpg_resetwal
:
pg_resetwal
が の有効なデータを判別できないというエラーを出した場合でもpg_control
、(force) オプションを指定して強制的に続行することができます-f
。この場合、欠落したデータは妥当な値に置き換えられます。ほとんどのフィールドは一致すると予想されますが、次の OID、次のトランザクション ID とエポック、次のマルチトランザクション ID とオフセット、および WAL 開始位置フィールドについては手動による支援が必要になる場合があります。これらのフィールドは、以下で説明するオプションを使用して設定できます。これらすべてのフィールドの正しい値を判別できない場合でも、-f
は使用できますが、回復したデータベースは通常よりもさらに疑ってかかる必要があります。即時のダンプとリロードが必須です。ダンプする前にデータベースでデータ変更操作を実行しないでください。そのような操作は破損を悪化させる可能性があります。
次のコマンドを実行すると、これが当てはまるかどうかを確認できます。
# Postgres >= 10
pg_resetwal DATADIR
# Postgres < 10
pg_resetxlog DATADIR
トランザクション ログが破損している場合は、次のようなメッセージが表示されます。
The database server was not shut down cleanly.
Resetting the transaction log might cause data to be lost.
If you want to proceed anyway, use `-f` to force reset.
次に、指示に従って実行し、-f
強制的に更新を実行します。
# Postgres >= 10
pg_resetwal -f DATADIR
# Postgres < 10
pg_resetxlog -f DATADIR
これにより、トランザクション ログがリセットされます。ただし、前述のとおり、これはリスクのある操作です。専門家のアドバイスを求めたほうがよいでしょう。