トランザクションIDの周回リスクを測定(データベースおよび表ごとのXID経過)
PostgreSQLメンテナンスコマンド
-- Per database: distance to autovacuum_freeze_max_age and the ~2^31 limit
SELECT datname,
age(datfrozenxid) AS xid_age,
mxid_age(datminmxid) AS mxid_age,
round(100.0 * age(datfrozenxid) / current_setting('autovacuum_freeze_max_age')::int, 1) AS pct_of_freeze_max_age,
round(100.0 * age(datfrozenxid) / 2147483647, 1) AS pct_of_wraparound
FROM pg_database
ORDER BY age(datfrozenxid) DESC;
-- Oldest tables in the current database (including TOAST)
SELECT c.oid::regclass AS table_name,
greatest(age(c.relfrozenxid), age(t.relfrozenxid)) AS xid_age,
mxid_age(c.relminmxid) AS mxid_age,
pg_size_pretty(pg_total_relation_size(c.oid)) AS total_size,
s.last_autovacuum,
s.last_vacuum
FROM pg_class c
LEFT JOIN pg_class t ON t.oid = c.reltoastrelid
LEFT JOIN pg_stat_all_tables s ON s.relid = c.oid
WHERE c.relkind IN ('r', 'm')
ORDER BY 2 DESC
LIMIT 20;概要
各データベースの最も古い未凍結XIDとmultixactの経過を、autovacuum_freeze_max_ageと周回上限に対する割合で表示する。現在のデータベースでは、最も古い表(TOASTを含む)をサイズと最終vacuum時刻とともに表示する。
使用する場面
定期監視(一般的なしきい値: pct_of_wraparound 50%で警告 / 75%で重大)、ログに'must be vacuumed within N transactions'が表示されたとき、凍結作業の優先順位付けに。
注意
pct_of_freeze_max_ageが100を超える表では、autovacuumが強制(周回防止)vacuumを開始する。I/O負荷が高く、終了させても再起動する。経過が減らない場合、原因はほぼ常にxmin horizonを引き止めているもの(長いトランザクション、プリペアドトランザクション、レプリケーションスロット、hot_standby_feedback)である。先にそれを解消しないと、VACUUM FREEZEでも経過を下げられない。上限に近づくとサーバーはまず警告し、残りが数百万になると新しいXIDの割り当て(書き込み)を拒否する。対象を絞った凍結: VACUUM (FREEZE, VERBOSE) <table>;