バックアップサーバーをテストするために、postgresql構成でarchive_modeをオンにしました。また、walファイルは多くのディスク容量を必要としたため、テスト後にオフにして、walファイルも削除しました。 postgresqlを再起動しようとすると、次のエラーが発生しました。
root@hooshang:/etc/postgresql/9.1/main# /etc/init.d/postgresql restart
* Restarting PostgreSQL 9.1 database server
* The PostgreSQL server failed to start. Please check the log output:
2014-10-16 13:15:28 IRST LOG: database system was shut down at 2014-10-15 15:51:53 IRST
2014-10-16 13:15:28 IRST LOG: could not open file "pg_xlog/00000001000007DC00000037" (log file 2012, segment 55): No such file or directory
2014-10-16 13:15:28 IRST LOG: invalid primary checkpoint record
2014-10-16 13:15:28 IRST LOG: could not open file "pg_xlog/00000001000007DC00000029" (log file 2012, segment 41): No such file or directory
2014-10-16 13:15:28 IRST LOG: invalid secondary checkpoint record
2014-10-16 13:15:28 IRST PANIC: could not locate a valid checkpoint record
2014-10-16 13:15:28 IRST LOG: startup process (PID 17467) was terminated by signal 6: Aborted
2014-10-16 13:15:28 IRST LOG: aborting startup due to startup process failure
この問題を解決するにはどうすればよいですか?
データディレクトリ内から手動でファイルを削除して、データベースを破損しています。 なしデータディレクトリ内から手動でファイルを削除します。
WALを削除する場合は、CHECKPOINT
時にサーバーに実行させるか、 use pg_archivecleanup
を使用します。サーバーがWALを削除することに注意してください。
archive_mode
はオンになっていますが、 archive_command
が失敗しているため、サーバーは、アーカイブの試行が成功するか、管理者が介入するまで、アーカイブの試行を再試行し続けます。wal_keep_segments
によって引き続き保持されますこれらのいずれにも当てはまらない場合、CHECKPOINT
(自動またはSQLを介して手動で発行)は、現在不要なすべてのWALを削除します。したがって、手動で削除する必要はありません。
アーカイブが長時間失敗した後、WALの蓄積が原因でディスク容量が足りなくなった場合など、異常な状況ではpg_archivecleanup
を使用する必要がある場合があります。必要なWALを破棄した結果としてレプリカを再作成し、pg_archivecleanup
を使用してスペースを解放してマスターを実行する必要があることを受け入れる場合があります。
ただし、WALセグメントを手動で削除しないでください。
アーカイブされたWALを別の場所に保管した場合、ファイルをpg_xlog
にコピーして戻すか、recovery.conf
を使用してrestore_command
を作成します。詳細については、PITRとログ配布に関するマニュアルを参照してください。
これらのWALファイルのコピーがどこかにない場合、データベースが破損しているため、最新のバックアップがある場合は、バックアップから復元する必要があります。
バックアップがない場合は、 破損wikiページ およびデータベースの現在の状態の完全なコピーを作成した場合のみの指示に従ってください。 =、最後の手段のみとして、pg_resetxlog
を使用してトランザクションログを破棄し、DBを強制的に不完全なトランザクションから開始します。
次に、データベースをpg_dump
して停止し、新しいデータベースをinitdb
して、そこに復元する必要があります。実行しない破損したデータベースを引き続き使用します。 なしpg_resetxlog
を使用したデータベースを引き続き使用し、最後の手段として以外は使用しないでください。