VACUUMによるデッドタプル削除を妨げているxmin horizonの保持者を特定
PostgreSQLメンテナンスコマンド
SELECT 'session' AS source, pid::text AS id, usename::text AS owner, state AS detail,
age(backend_xmin) AS xmin_age
FROM pg_stat_activity
WHERE backend_xmin IS NOT NULL AND pid <> pg_backend_pid()
UNION ALL
SELECT 'prepared_xact', gid, owner::text, prepared::text, age(transaction)
FROM pg_prepared_xacts
UNION ALL
SELECT 'replication_slot', slot_name::text, slot_type, active::text,
greatest(age(xmin), age(catalog_xmin))
FROM pg_replication_slots
WHERE xmin IS NOT NULL OR catalog_xmin IS NOT NULL
UNION ALL
SELECT 'standby_feedback', application_name, usename::text, state, age(backend_xmin)
FROM pg_stat_replication
WHERE backend_xmin IS NOT NULL
ORDER BY xmin_age DESC NULLS LAST;概要
デッドタプルのクリーンアップを妨げる可能性のある4つの要因を、xminの経過順に一覧表示する: スナップショットを保持するセッション、プリペアドトランザクション、レプリケーションスロット、hot_standby_feedbackを送信するスタンバイ。
使用する場面
VACUUM VERBOSEが'dead row versions cannot be removed yet'を報告し、肥大化が進み続け、XIDの経過が減らないときに。
注意
最も古いxminがクリーンアップのホライズンを決める。レプリケーションスロットとスタンバイのフィードバックはすべてのデータベースに影響する。プリペアドトランザクションは再起動後も残るため、所有者を確認し、COMMIT PREPARED / ROLLBACK PREPARED '<gid>'で終了する。未使用のスロットを削除するとその下流(スタンバイ、CDC)が壊れるため、先に所有者を確認する。スタンバイで実行すると、そのスタンバイのセッションのみが表示される。