🍜

PostgreSQLのレプリカにクエリを実行した時にconflict with recoveryが発生する場合の対処

2022/06/14に公開

エラー内容

ERROR: canceling statement due to conflict with recovery

Cloud SQLのfederated queriesを利用して、BigQueryからCloud SQL for PostgreSQLのレプリカに対してクエリを実行した時に発生したエラー。

原因と対処

マスター更新(WAL)のレプリカへの反映とレプリカの参照が同一リソースでコンフリクトすると発生します。

PostgreSQLではコンフリクトが発生して一定時間(デフォルトでは30秒)経過すると、
同一資源をアクセスしている参照処理をキャンセルし、マスター更新の反映を優先する仕組みになっています。

対処としては参照のトランザクションの処理を分割して、30秒以内に終わるように実行時間を短縮するか、マスター更新反映のための待ち時間を長く変更する方法があります。

今回は参照テーブルのレコード件数が1000万件を超えており、30秒以内は難しかったため、レプリカ側への反映の待ち時間を長く変更する対応を行いました。

Cloud SQLの編集画面のフラグから設定することができます。以下の設定を参照処理の時間に合わせて値を入力しましょう。

  • max_standby_streaming_delay
  • max_standby_archive_delay

参考記事

https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgres/article-index/streaming-replication-conflict-error/
https://qiita.com/fullsat_/items/e793379e9c10a25c2d1a

Discussion