Postgresが起動しない時の対応方法

事象:
お客様の方でUPSの音を消す為にPCサポート業者の誤った助言でUPSをシャットダウンしてしまい、
ストレージサーバ一体型の仮想ホストサーバー(DRBDでレプリケーション)が電源断。
仮想ホストサーバが起動しなくなり、待機系の仮想ホストサーバに切り替えを実施。
仮想サーバーが無事に起動したと思ったら、仮想サーバ上のPostgresが下記のようなログを出力して
起動しなくなってしまった。

2015-11-07 12:45:56 JST LOG: データベースシステムは中断されました: 今回は 2015-11-06 21:45:19 JST までは到達しています
2015-11-07 12:45:56 JST LOG: could not remove cache file “global/pg_internal.init”: Invalid argument
2015-11-07 12:45:56 JST LOG: could not remove cache file “base/16395/pg_internal.init”: Invalid argument
2015-11-07 12:45:56 JST LOG: ファイル”pg_xlog/000000010000001A00000096″(ログファイル26、セグメント150)をオープンできませんでした: No such file or directory
2015-11-07 12:45:56 JST LOG: プライマリチェックポイントレコードが無効です
2015-11-07 12:45:56 JST LOG: ファイル”pg_xlog/000000010000001A00000096″(ログファイル26、セグメント150)をオープンできませんでした: No such file or directory
2015-11-07 12:45:56 JST LOG: セカンダリチェックポイントレコードが無効です
2015-11-07 12:45:56 JST PANIC: 有効なチェックポイントに移動できませんでした
2015-11-07 12:45:56 JST FATAL: データベースシステムは起動しています
2015-11-07 12:45:56 JST LOG: 起動プロセス (PID 6424)は終了コード3で終了しました
2015-11-07 12:45:56 JST LOG: 起動プロセスの失敗のため起動を中断しています

原因:
どうやらデータ領域の一部のファイルが破損してしまった事が原因のようです。

対処方法:
下記のコマンドで対応できました。
pg_resetxlog — PostgreSQLデータベースクラスタの先行書き込みログやその他の制御情報を初期化する

このコマンドを実行すると、サーバが開始できるようになるはずです。
ただし、不完全にコミットされたトランザクションが原因でデータベースのデータに矛盾が起こる可能性があることに注意してください。
コマンドの実行後は、データをただちにダンプし、initdbを実行し、リロードすべきです。
リロード後、矛盾がないか検査し、必要に応じて修復を行ってください。

D:PostgreSQL9.2datapg_clog�000 が最大の番号の場合、1を足した、
-x 0x0100000 を指定する

実際に投入したコマンド
pg_resetxlog.exe -f -x 0x0100000 D:PostgreSQL9.2data

無事にPostgresサービスを起動する事が出来ました。

ただし、ここからが問題。
「コマンドの実行後は、データをただちにダンプし、initdbを実行し、リロードすべきです。
リロード後、矛盾がないか検査し、必要に応じて修復を行ってください。」
とあります。
ダンプ>initdb>リストアまではやれるとして、データの整合性の確認は開発者に行ってもらう必要があります。
担当営業に相談したところ、「そんなの開発者でも確認しようが無いと思いますよ」との事。
あと、ダンプを取ると、毎日130MBのダンプサイズが80MBに減っていました。
データの整合性の確認が出来ないという事で安全策を取って結局、障害発生日のAM2:30にpgdump_allしたバックアップを使用して、AM2:30まで巻き戻す事にしました。

Comments are closed.