• 検索結果がありません。

トランザクション ID の周回問題

ドキュメント内 PostgreSQL Internals (1) (ページ 111-114)

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>

ドキュメント内 PostgreSQL Internals (1) (ページ 111-114)