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