🍜
PostgreSQLのレプリカにクエリを実行した時にconflict with recoveryが発生する場合の対処
エラー内容
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
参考記事
Discussion