トランザクションID

VACUUM処理が阻害されるケースとその原因・検知・対策

この記事のポイント

VACUUM コマンドや 自動VACUUM は成功するのだけれども(コマンド応答にもログにも ERROR などは出ないけれども)、実際にはデッドタプルが回収されない状況が発生することがあります。
VACUUMが期待通りに動作しない場合、以下を確認することで原因特定が可能です。

  • ログに「are dead but not yet removable」が出ているか(*)
  • ログの「removable cutoff / oldest xmin」の数字が進んでいないか(*)
  • 以下のビューを確認する(ストリーミングレプリケーション環境の場合はスタンバイ側も)
    • pg_stat_activity
    • pg_replication_slots
    • pg_prepared_xacts

主な原因は以下の3つです。

  1. ロングトランザクション
  2. レプリケーションスロット
  3. プリペアドトランザクション

対策の本質は 「oldest xminを固定している要因を解消すること」 です。
(*) log_autovacuum_min_duration パラメータを0や正の数で設定して自動VACUUM実行結果をログに出力する必要があります。

続きを読む

トランザクションID周回問題について

この記事はSRA Advent Calender 2025 19日目の記事です。

PostgreSQLを使用している方は、トランザクションIDの周回問題という言葉を聞いたことがあるかと思います。トランザクションIDの周回問題は、発生する頻度が少ない一方で、一度発生するとサービスの提供に重大な悪影響を及ぼします。本記事では、PostgreSQLを使用する方にぜひ押さえていただきたい、トランザクションIDの周回問題について解説します。

続きを読む