kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

readerからのpg_dumpの途中で接続が切れる場合、max_standby_streaming_delay を上げると良いよ

タイトルで言いたいことだいたい言っちゃったんですが、

readerエンドポイントでpg_dump を実行していたら、大きめのテーブルをdumpしている時に接続がちょこちょこ途切れる現象が発生していました。 それで、DBのログを見てみたら以下のエラーがありました

FATAL:  terminating connection due to conflict with recovery
DETAIL:  User was holding a relation lock for too long.

これは、以下のサイトに詳しいのですが

www.fujitsu.com

「writer側の更新によるWAL(トランザクションログ)が、reader側に更新される」のと、「reader側の参照処理」がコンフリクトした場合に、一定時間が経過すると、参照側の接続が切られる という、psqlの機能のために発生しています

で、その待機時間を設定するためのオプションが、max_standby_streaming_delay です

max_standby_streaming_delay のポイント

  • postgreSQLのデフォルト値は30秒
  • Amazon Aurora PostgreSQL では、14秒
  • Amazon Aurora PostgreSQL で、設定できる最大値は 30秒

30秒で処理しきれない参照処理がある場合はどうしたら良いの?

  • 諦めてwriterエンドポイントで処理する
  • もしくは、SQLを分割するなど対策をする

参考

www.postgresql.jp