1. ホーム

[解決済み】PostgreSQL ERROR:リカバリーと競合するため、ステートメントをキャンセルする

2022-04-12 05:57:43

質問

スタンバイモードのPostgreSQL dbでクエリを実行すると、以下のエラーが発生します。エラーの原因となるクエリは、1ヶ月間は問題なく動作しますが、1ヶ月以上クエリを実行するとエラーが発生します。

ERROR: canceling statement due to conflict with recovery
Detail: User query might have needed to see row versions that must be removed

解決方法について、何かご提案があれば教えてください。ありがとうございます。

解決方法を教えてください。

なぜなら、クエリ実行中にプライマリで必要な行が更新または削除される可能性があるからです。プライマリはセカンダリでクエリが開始されたことを知らないので、古いバージョンの行をクリーンアップ(バキューム)できると思っています。そして、セカンダリはこのクリーンアップを再生し、これらの行を使用するすべてのクエリを強制的にキャンセルしなければならなくなります。

長いクエリは、より頻繁にキャンセルされることになります。

プライマリで繰り返し読み取りトランザクションを開始し、ダミークエリを実行した後、セカンダリで実際のクエリが実行されている間、アイドル状態にしておくことでこの問題を回避することができます。このトランザクションがあることで、プライマリで古いバージョンの行がバキュームされるのを防ぐことができます。

この件に関する詳細やその他の回避策については ホットスタンバイ - クエリの競合の処理 のセクションを参照してください。