2. プロセスとメモリー
3.7 トランザクション ID の周回問題
ルに対してパラメーターautovacuum_freeze_max_age — vacuum_freeze_min_ageで計算 される数のトランザクションが発生すると、自動VACUUMが無効でもFREEZE処理が発 生します。自動 VACUUM は処理対象ブロックを Visibility Map を使って発見します。
Freeze 処 理 が 完 了 す る と 、 Visibility Map を 更 新 し ま す 。 パ ラ メ ー タ ー
vacuum_freeze_table_age で指定されたトランザクション数が実行されると、Visibility
MapからFreezeされていないブロックに対して検索を行います。
各テーブルのフリーズ対象となるトランザクション ID は、pg_class カタログの
relfrozenxid 列で定義されています。この列はテーブル内の XMIN 仮想列の最小値です
(FrozenXIDを除く)。またpg_classカタログのrelfrozenxidの最小値がpg_databaseカ
タログのdatfrozenxid列で確認できます。
□ 自動VACUUM処理が失敗した場合
何等かの原因でFREEZE処理が行われなかった場合、トランザクションIDの周回まで
に1,000万を切ると以下のメッセージが出力されます。
例 87 トランザクション周回の警告
WARNING: database “postgres” must be vacuumed within 9999999 transactions HINT: To avoid a database shutdown, execute a database-wide VACUUM in
“postgres”.
更に100万トランザクションを切ると、以下のログが出力され、システムは停止します。
例 88 トランザクション周回のエラー
ERROR: database is not accepting commands to avoid wraparound data loss in database “postgres”
HINT: Stop the postmaster and use a standalone backend to VACUUM in
“postgres”.
このような状態に陥ったデータベースはスタンドアロン・モードで起動し、VACUUM処 理を行います。下記の例ではpostgresデータベースに対してVACUUM処理を実行してい ます。
例 89 スタンドアロン・モードによる起動とVACUUM
3.7.2 FREEZE 処理に関するパラメーター
トランザクションIDのFREEZE動作に関するパラメーターは以下の通りです。
□ autovacuum_freeze_max_age
トランザクション ID の周回を防ぐために pg_class.relfrozenxid が到達できる最大の年 代(age)を指定します。自動VACUUMが無効の場合でも、VACUUMワーカー・プロセ スが起動します。デフォルト値は2億(200,000,000)です。最小値は1億(100,000,000)、 最大値は20億(2,000,000,000)です。
□ vacuum_freeze_min_age
VACUUMがテーブルスキャン時にトランザクション IDをFrozenXIDに置き換えるカ
ットオフ年代を指定します。デフォルト値は 5,000 万(50,000,000)です。値は 0 から
autovacuum_freeze_max_ageの50%までの値を指定できます。
□ vacuum_freeze_table_age
テーブルのpg_class.relfrozenxid がこの値で指定した時期に到達すると、VACUUM は より積極的にテーブルの走査を行い、FREEZE 処理を行います。デフォルト値は 1.5 億
( 150,000,000 ) で す 。 値 は 0 か ら 10 億 ( 1,000,000,000 ) ま た は
autovacuum_freeze_max_age の95%までの値を指定できます。
PostgreSQL 9.3.3以降には以下のパラメーターが追加されました。マルチトランザクショ
ンID(MultiXactId)とフリーズに関するパラメーターですが詳細は未確認です。
autovacuum_multixact_freeze_max_age
vacuum_multixact_freeze_min_age
vacuum_multixact_freeze_table_age
$ postgres --single -D data postgres
PostgreSQL stand-alone backend 9.6.2 backend> VACUUM
backend>