web-dev-qa-db-ja.com

突然シャットダウンした後にPostgresが起動するようにするにはどうすればよいですか?

突然の停電により、ローカルマシンで実行されている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ファイルがありません。このような振る舞いの理由は何でしょうか、そしてもちろん解決策は何ですか?

17
crashekar

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 + で確認してください。

21
Tometzky

PostgreSQLメーリングリストのアーカイブで同様のメッセージをいくつか読んだ場合(「磁気ディスクでストレージの同期に失敗しました:そのようなファイルまたはディレクトリはありません」)は、単純な電源障害よりもはるかに深刻なハードウェア障害が発生していることを示しているようです。バックアップから復元する準備をする必要がある場合があります。

6
bortzmeyer

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
1
srghma

再起動の代わりに起動を実行します。以下のコマンドを実行します。

$pg_ctl -D /usr/local/pgsql/data start
0
Venu Madhav