[pgsql-jp: 40172] Re: [SPAM] トランザクション ID の最大値

Takahiro Itagaki itagaki.takahiro @ oss.ntt.co.jp
2010年 2月 16日 (火) 14:20:48 JST


"tanaka" <tanaka_hideo @ yahoo.co.jp> wrote:

> ここに書かれている
> トランザクションIDの最大値は、
> 2^32 - 1 
> というのは、正しいですか?
> http://www.interdb.jp/techinfo/postgresql/p-2-06.html

XID は周回して再利用されるので、「最大値」というよりは
「ある時点で、同時に表現できる範囲」というニュアンスです。
定期的に VACUUM していれば、総トランザクション数が 2^32 を
超えても、問題なくデータベースを使い続けられます。

> トランザクションIDが、42億ぐらいになったときの表示が、マイナス表示になる
> のは正常な動作でしょうか?

XID そのものの表示はマイナスにはならないので、age() の結果の話でしょうか?
マイナスの age() は未来を表します。ただ、普通の使い方では未来 age を
目にすることはほとんどないので、いわゆる「トランザクションIDの周回エラー」が
発生している恐れがありますね。(ただし template0 を除く。後述)

> template0 , template1 も,ユーザが作成したデータベースの
> トランザクションIDと同じ値になっているのは
> なぜでしょうか?
> template0,template1は、普段、動作中でも使用されていると
> いう事ですか?

たぶん正常な動作です。
「トランザクションIDの周回エラーの防止」が参考になるのでは。
http://www.postgresql.jp/document/current/html/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND

注意があるとすれば、「template0 の age(datfrozenxid) は無視してよい」
ということですが、なぜかこのドキュメントには明記されてませんね……。
「検査する簡便な方法」にある SQL は、datallowconn を条件に
加えるべきだと思うのですが、どう思いますか? > みなさま
    SELECT datname, age(datfrozenxid) FROM pg_database WHERE datallowconn;

------------------------------------------------------------
NTT オープンソース ソフトウェア センタ
板垣貴裕 <itagaki.takahiro @ oss.ntt.co.jp>




pgsql-jp メーリングリストの案内