pg_repackコマンドの実行時に、バキューム処理が長時間化する事象について
Enterprise Postgresのよくあるご質問を検索できます。
Enterprise Postgres の技術情報はこちら
- pg_repackコマンドでテーブルの再編成を実行したとき、-Tオプションと-Dオプションを指定していますが、他処理との競合が発生しても処理がスキップされずバキューム処理が長時間化してしまいます。
原因と対処方法を教えてください。 - [原因]
pg_repackコマンドのテーブル再編成の開始以前から、継続して存在しているロングトランザクション(長時間トランザクション)が残存していることが原因です。
pg_repackの-Tオプションは操作対象テーブルでロック競合が発生した場合にほかのトランザクションをキャンセルするまで待機する時間であり、ロングトランザクションの完了を待機している状態には効果がありません。
pg_repackのテーブル再編成では、操作対象テーブルの一時的な作業テーブルを作成します。
操作対象テーブルへトリガを設定し、更新ログ表へ再編成中の更新処理を記録しておきます。
再編成完了後、その差分情報を作業テーブルに反映し、対象テーブルと切り替えます。
差分情報を作業テーブルに反映する際に、それ以前に開始したすべてのトランザクションが完了するまで待ちます。
このトランザクション完了の待機についてタイムアウトを設定するオプションはありません。
[対処方法]
pg_repack実行中に動作させるトランザクションは必要な処理が完了次第commitまたはrollbackを行う、バッチ処理等のロングトランザクションの傾向がある業務とpg_repackの実施時刻を分けるなどpg_repackの動作中にロングトランザクションが発生しないようにしてください。
製品・サービス情報 |
|
||||
---|---|---|---|---|---|
アンサー種別 | 運用/保守 |