2010年5月 7日

[pgsql-jp: 40261] Re:複数DBのXID

板垣様

丁寧な説明感謝致します。

> 「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と
影響し合うものなのでしょうか?

質問ばかりで誠に恐縮なのですが、納得ゆく答えが見いだせず
悩んでおります。
助けて頂ければ非常に助かります。


投稿者 xml-rpc : 2010年5月 7日 12:44
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/95595
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。