XIDを周回させてみよう

5,012 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,012
On SlideShare
0
From Embeds
0
Number of Embeds
67
Actions
Shares
0
Downloads
26
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

XIDを周回させてみよう

  1. 1. XIDを周回させてみよう 2011-08-09PostgreSQL勉強会@札幌 @iakio
  2. 2. 今日の話● PostgreSQLを長期間運用していると、突然有るはずの データが見えなくなってしまうという、XIDの周回問題と呼 ばれる現象があるらしい● でも滅多にお目にかかれません● じゃあ無理矢理にでもやってみよう
  3. 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. 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. 5. ● XIDは32bit(40億) ● T1に対してT2が新しいか 古いかは、T2-T1で決ま古い る ● XIDを20億ちょい進める 新しい と、新旧が逆転する
  6. 6. ● なので、現在のXIDを例えば30億ほど進めれば、いきなり 見えてたものが見えなくなります● でもそんなのはつまらないですよね● 見えなくなる瞬間を見たい。が、それにはいくつかの壁
  7. 7. XIDの周回を防止する仕組み1● 0から2は特殊なXID● 2がFrozenXIDと呼ばれ、どのXIDよりも古いとみなされる● 十分に古いXIDをFrozenXIDに置き換えることで、XIDの周 回を防止する● autovacuumがOFFでも実行される
  8. 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. 9. XIDの周回を防止する仕組み2● 残り1000万トランザクションで警告● 残り100万トランザクションでエラーとなり、新しいトラン ザクションを受け入れなくなる(standalone modeで起動し なおしてvacuumを行う必要がある)
  10. 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. 11. 参考● PostgreSQLドキュメント 「23.1.4. トランザクションIDの周回エラーの防止」 http://www.postgresql.jp/document/current/html/routine-vacuu

×