• Like
XIDを周回させてみよう
Upcoming SlideShare
Loading in...5
×

XIDを周回させてみよう

  • 2,759 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
2,759
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
18
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. XIDを周回させてみよう 2011-08-09PostgreSQL勉強会@札幌 @iakio
  • 2. 今日の話● PostgreSQLを長期間運用していると、突然有るはずの データが見えなくなってしまうという、XIDの周回問題と呼 ばれる現象があるらしい● でも滅多にお目にかかれません● じゃあ無理矢理にでもやってみよう
  • 3. トランザクションIDとはINSERT INTO r(i) VALUES(1);INSERT INTO r(i) VALUES(2);INSERT INTO r(i) VALUES(3);SELECT xmin, xmax, i FROM r; xmin xmax i 664 0 1 665 0 2 666 0 3
  • 4. トランザクションIDとはINSERT INTO r(i) VALUES(1);INSERT INTO r(i) VALUES(2);INSERT INTO r(i) VALUES(3);SELECT xmin, xmax, i FROM r;DELETE FROM r WHERE i = 1;UPDATE r SET i = 4 WHERE i = 2; xmin xmax i 664 667 1 665 668 2 666 0 3 668 0 4
  • 5. ● XIDは32bit(40億) ● T1に対してT2が新しいか 古いかは、T2-T1で決ま古い る ● XIDを20億ちょい進める 新しい と、新旧が逆転する
  • 6. ● なので、現在のXIDを例えば30億ほど進めれば、いきなり 見えてたものが見えなくなります● でもそんなのはつまらないですよね● 見えなくなる瞬間を見たい。が、それにはいくつかの壁
  • 7. XIDの周回を防止する仕組み1● 0から2は特殊なXID● 2がFrozenXIDと呼ばれ、どのXIDよりも古いとみなされる● 十分に古いXIDをFrozenXIDに置き換えることで、XIDの周 回を防止する● autovacuumがOFFでも実行される
  • 8. XIDの周回を防止する仕組み1● 前回のFreezeからXIDが2億進んだら (autovacuum_freeze_max_age)● 5千万より前のXIDをFrozenXIDにおきかえる (vacuum_freeze_min_age)● どこまで凍結したかをpg_class.relfrozenxidに記録する 2億 5千万 2億 5千万
  • 9. XIDの周回を防止する仕組み2● 残り1000万トランザクションで警告● 残り100万トランザクションでエラーとなり、新しいトラン ザクションを受け入れなくなる(standalone modeで起動し なおしてvacuumを行う必要がある)
  • 10. これがXIDを周回させる方法だ● データベースを停止● pg_resetxlogでXIDを2^31に進める ● pg_resetxlog -x 0x80000000● standaloneモードで起動し、pg_database.datfrozenxidと pg_class.relfrozenxidを2^31に進める● データベースを起動● ちまちまXIDを消費(SELECT txid_current())
  • 11. 参考● PostgreSQLドキュメント 「23.1.4. トランザクションIDの周回エラーの防止」 http://www.postgresql.jp/document/current/html/routine-vacuu