突然の停電により、ローカルマシンで実行されているPostGres
サーバーが突然シャットダウンしました。再起動後、postgresを再起動しようとすると、次のエラーが発生します。
$ pg_ctl -D /usr/local/pgsql/data restart
pg_ctl: PID file "/usr/local/pgsql/data/postmaster.pid" does not exist
Is server running?
starting server anyway
server starting
$:/usr/local/pgsql/data$ LOG: database system shutdown was interrupted at 2009-02-28 21:06:16
LOG: checkpoint record is at 2/8FD6F8D0
LOG: redo record is at 2/8FD6F8D0; undo record is at 0/0; shutdown FALSE
LOG: next transaction ID: 0/1888104; next OID: 1711752
LOG: next MultiXactId: 2; next MultiXactOffset: 3
LOG: database system was not properly shut down; automatic recovery in progress
LOG: redo starts at 2/8FD6F918
LOG: record with zero length at 2/8FFD94A8
LOG: redo done at 2/8FFD9480
LOG: could not fsync segment 0 of relation 1663/1707047/1707304: No such file or directory
FATAL: storage sync failed on magnetic disk: No such file or directory
LOG: startup process (PID 5465) exited with exit code 1
LOG: aborting startup due to startup process failure
データディレクトリにpostmaster.pid
ファイルがありません。このような振る舞いの理由は何でしょうか、そしてもちろん解決策は何ですか?
pg_resetxlog する必要があります。ただし、この後、データベースが不整合な状態になる可能性があるため、pg_dumpall
でダンプし、再作成してインポートしてください。
この原因は次のとおりです。
ディスクのハードウェア書き込みキャッシュをオフにしていないため、OSがアプリケーションへの書き込みが成功したことを報告する前に、データが確実に書き込まれることを妨げていることがよくあります。確認する
hdparm -I /dev/sda
「書き込みキャッシュ」の前に「*」が表示されている場合は、これが原因である可能性があります。 PostgreSQLのソース には、データをディスクと同期する速度をテストするプログラムsrc/tools/fsync/test_fsync.cがあります。それを実行します-たとえば、ディスクがOSにあるよりも3秒よりもずっと短いと報告する場合-7500rpmディスクでは、同じ場所への1000回の書き込みのテストが完了するまでに少なくとも8秒必要です(1000 /(7500rpm/60s))ルートごとに1回だけ書き込むことができるため。データベースが/ var/tmpパーティション以外のディスクにある場合は、このtest_fsync.cを編集する必要があります-変更
#define FSYNC_FILENAME "/var/tmp/test_fsync.out"
に
#define FSYNC_FILENAME "/usr/local/pgsql/data/test_fsync.out"
ディスクに障害があり、不良ブロックがあります。 badblocks で確認してください。
RAMが不良です。少なくとも8時間 memtest86 + で確認してください。
PostgreSQLメーリングリストのアーカイブで同様のメッセージをいくつか読んだ場合(「磁気ディスクでストレージの同期に失敗しました:そのようなファイルまたはディレクトリはありません」)は、単純な電源障害よりもはるかに深刻なハードウェア障害が発生していることを示しているようです。バックアップから復元する準備をする必要がある場合があります。
Dbの破損もあった、私の行動
docker run -it --rm -v /path/to/db:/var/lib/postgresql/data postgres:10.3 bash
su - postgres
/usr/lib/postgresql/10/bin/pg_resetwal -D /var/lib/postgresql/data -f
再起動の代わりに起動を実行します。以下のコマンドを実行します。
$pg_ctl -D /usr/local/pgsql/data start