[pgsql-jp: 40261] Re: 複数DBのXID
ivp sasaki
sasaki @ ivp.co.jp
2010年 5月 7日 (金) 12:44:00 JST
板垣様
丁寧な説明感謝致します。
> 「DBのXID」は、一般的に良く知られた用語ではないと思われます。
> たぶん age(pg_database.datfrozenxid) のつもりではないかと推測しますが、
> 明確に定義したほうが誤解が避けられます。
おっしゃるとおりです。
SELECT datname, age(datfrozenxid) FROM pg_database;
これで取得できた値を見ています。
> 挙動については、以下の基本的な動作から推測は可能ですか?
> - 次に払い出される XID は、データベースクラスタ単位で管理されています。
> 複数のデータベース間で共有される値が使われることになります。
> - pg_database.datfrozenxid は、そのデータベースで VACUUM が
> 行われた際にのみ値が更新されます。
> - age() は、与えた XID と、現在の XID の差を計算します。
確かに単一のクラスタ内です。
> ちなみに、PostgreSQL ではトランザクションは複数のデータベースを
> 跨ることはできないので、一見、各データベースごとに独立した XID を
> 払い出しても良さそうに見えるかもしれませんが、実際にはデータベース間で
> 共有されるシステムカタログ (pg_database, pg_authid, pg_tablespace 等) に
> 対しては、各データベースからの XID が「混じる」ことがあります。
> そのため、クラスタ単位で一意のXIDを使う必要があるのです。
具体的な症状としましては、昨夜
SELECT datname, age(datfrozenxid) FROM pg_database;
これで見た時は、
datname | age
---------------+------------
postgres | 1088416781
aaaaaaaaa | 1088416515
bbbbbbbbb | 1088415054
ccccccccc | 1088414807
ddddddddd | 1088414068
eeeeeeeee | 1088413852
template0 | -395003575
ffffffff | 1088393557
ggggggg | 1088393402
template1 | 1088392874
このような値でした。その後深夜に定期vacuumが実行され、
今朝見てみると
datname | age
---------------+------------
postgres | 1077866122
aaaaaaaaa | 1077866005
bbbbbbbbb | 1077865664
ccccccccc | 1077865427
ddddddddd | 1077863768
eeeeeeeee | 1077863472
template0 | -386192448
ffffffff | 1077842531
ggggggg | 1077842428
template1 | 1077841985
このように減少していました。この中の「aaaaaaaaaaa」と
「eeeeeeee」は常時使用しているのですが、「bbbbbbbb」
「cccccccccc」「dddddddddd」は全く使用していません。
さらに分からないのはtemplate1の値も増えている点です。
これは、Postgresとしては正常な動きなのでしょうか?
システムカタログテーブルはこのような形で他のDBと
影響し合うものなのでしょうか?
質問ばかりで誠に恐縮なのですが、納得ゆく答えが見いだせず
悩んでおります。
助けて頂ければ非常に助かります。
pgsql-jp メーリングリストの案内