[pgsql-jp: 40240] Re: トランザクション ID の最大値
tanaka
tanaka_hideo @ yahoo.co.jp
2010年 3月 28日 (日) 23:40:49 JST
こんばんは、よろしくお願いします。
--- Takahiro Itagaki <itagaki.takahiro @ oss.ntt.co.jp> wrote:
>
> "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 を除く。後述)
1. age() は、元々 日付関数ですが、なぜ、xid をage()関数を使用して表現す
るのでしょうか?
2. なぜ、マイナスが未来を表すのでしょうか?(マイナスが未来を表す事に決め
たのでしょうか?)
http://www.postgresql.jp/document/8.1/html/functions-datetime.html#FUNCTIONS-DATETIME-TABLE
を見たのですが、どこに説明が書かれているのか わかりませんでした。
3. トランザクションIDの周回は、過去と未来が逆転してしまうので、周回が発生
しないように
定期的にvacuumを実行する必要がある という事でしょうか?
>
> > 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>
>
>
>
--------------------------------------
Get the new Internet Explorer 8 optimized for Yahoo! JAPAN
http://pr.mail.yahoo.co.jp/ie8/
pgsql-jp メーリングリストの案内