[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 メーリングリストの案内