この記事のポイント
VACUUM コマンドや 自動VACUUM は成功するのだけれども(コマンド応答にもログにも ERROR などは出ないけれども)、実際にはデッドタプルが回収されない状況が発生することがあります。
VACUUMが期待通りに動作しない場合、以下を確認することで原因特定が可能です。
- ログに「are dead but not yet removable」が出ているか(*)
- ログの「removable cutoff / oldest xmin」の数字が進んでいないか(*)
- 以下のビューを確認する(ストリーミングレプリケーション環境の場合はスタンバイ側も)
- pg_stat_activity
- pg_replication_slots
- pg_prepared_xacts
主な原因は以下の3つです。
- ロングトランザクション
- レプリケーションスロット
- プリペアドトランザクション
対策の本質は 「oldest xminを固定している要因を解消すること」 です。
(*) log_autovacuum_min_duration パラメータを0や正の数で設定して自動VACUUM実行結果をログに出力する必要があります。
