web-dev-qa-db-ja.com

致命的なエラーの後にPostgresレプリケーションスレーブを回復する方法

4つのDebian 8 Jessieサーバーに、PostgreSQL 9.4.3マスター+ 3つのスレーブがあります。マスターで大幅なデータ変更を行った後、スレーブログに次のエラーが表示されました。

LOG: started streaming WAL from primary at 182/0 on timeline 1 FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000018200000000 has already been removed

スレーブを復元/再構築するにはどのような手順が必要ですか?

4
Yurik

archive_commandを設定し、WALセグメントを別の場所に保存している場合は、WALアーカイブの各セカンダリのrestore_commandrecovery.confを指定するだけで、それらを取得できます。次に必要なセグメントと幸せに続けます。

archive_commandを設定していない場合は、セカンダリのそれぞれでpg_basebackupを取得する必要があります。そのWALセグメントがないと、セカンダリに追いつくことができないためです。 9.4を使用しているので、レプリケーションスロットもセットアップすることをお勧めします。これにより、プライマリがストリーミングレプリカに必要なWALセグメントをリサイクルできなくなります。

レプリケーションスロット のドキュメントでこれについて詳しく知ることができます。

それ以外の場合は、WALを他の場所に保存して追いつくためにarchive_commandを設定する必要があります。または、システムの高負荷時にファイルをリサイクルしないように、プライマリでwal_keep_segmentsを十分に高く調整する必要があります。

archive_commandでのpostgresql.confの設定については、 継続的なアーカイブとポイントインタイムリカバリ のドキュメントで説明しています。

現在の状況と同様の状況の例とそれを防ぐための1つの潜在的な解決策については、 オフサイトレプリケーションの問題とその解決方法 で説明しています。

うまくいけば、これはレプリカを動作状態に戻すのに十分な情報です。 =)

6
Kassandry