web-dev-qa-db-ja.com

walファイルを削除した後にpostgresqlの問題を解決するにはどうすればよいですか?

バックアップサーバーをテストするために、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

この問題を解決するにはどうすればよいですか?

6
Sina

データディレクトリ内から手動でファイルを削除して、データベースを破損しています。 なしデータディレクトリ内から手動でファイルを削除します。

WALを安全に削除する

WALを削除する場合は、CHECKPOINT時にサーバーに実行させるか、 use pg_archivecleanup を使用します。サーバーがWALを削除することに注意してください。

  • archive_modeはオンになっていますが、 archive_command が失敗しているため、サーバーは、アーカイブの試行が成功するか、管理者が介入するまで、アーカイブの試行を再試行し続けます。
  • wal_keep_segments によって引き続き保持されます
  • (9.4)まだレプリケーションスロットで必要です。

これらのいずれにも当てはまらない場合、CHECKPOINT(自動またはSQLを介して手動で発行)は、現在不要なすべてのWALを削除します。したがって、手動で削除する必要はありません。

アーカイブが長時間失敗した後、WALの蓄積が原因でディスク容量が足りなくなった場合など、異常な状況ではpg_archivecleanupを使用する必要がある場合があります。必要なWALを破棄した結果としてレプリカを再作成し、pg_archivecleanupを使用してスペースを解放してマスターを実行する必要があることを受け入れる場合があります。

ただし、WALセグメントを手動で削除しないでください。

アーカイブされたWALでの復旧

アーカイブされたWALを別の場所に保管した場合、ファイルをpg_xlogにコピーして戻すか、recovery.confを使用してrestore_commandを作成します。詳細については、PITRとログ配布に関するマニュアルを参照してください。

アーカイブされたWALなしでの回復

これらのWALファイルのコピーがどこかにない場合、データベースが破損しているため、最新のバックアップがある場合は、バックアップから復元する必要があります。

バックアップがない場合は、 破損wikiページ およびデータベースの現在の状態の完全なコピーを作成した場合のみの指示に従ってください。 =、最後の手段のみとして、pg_resetxlogを使用してトランザクションログを破棄し、DBを強制的に不完全なトランザクションから開始します。

次に、データベースをpg_dumpして停止し、新しいデータベースをinitdbして、そこに復元する必要があります。実行しない破損したデータベースを引き続き使用します。 なしpg_resetxlogを使用したデータベースを引き続き使用し、最後の手段として以外は使用しないでください。

18
Craig Ringer