Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
XIDを周回させてみよう
Search
ISHIDA Akio
August 09, 2011
Programming
0
8
XIDを周回させてみよう
ISHIDA Akio
August 09, 2011
Tweet
Share
More Decks by ISHIDA Akio
See All by ISHIDA Akio
SQLを実行したときに、PostgreSQLはどのようにデータにアクセスしているのか
iakio
0
280
Prophecyを使った ユニットテスト
iakio
0
7
phpspecで学ぶLondon School TDD
iakio
0
2
PostgreSQLの範囲型と排他制約
iakio
0
8
使いこなそうGUC
iakio
0
4
Other Decks in Programming
See All in Programming
CSC307 Lecture 07
javiergs
PRO
1
560
AIフル活用時代だからこそ学んでおきたい働き方の心得
shinoyu
0
140
AI巻き込み型コードレビューのススメ
nealle
2
880
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
140
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
1
980
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.5k
AtCoder Conference 2025
shindannin
0
1.1k
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
140
今から始めるClaude Code超入門
448jp
8
9k
KIKI_MBSD Cybersecurity Challenges 2025
ikema
0
1.3k
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
7
3.9k
Fluid Templating in TYPO3 14
s2b
0
130
Featured
See All Featured
Become a Pro
speakerdeck
PRO
31
5.8k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
The Pragmatic Product Professional
lauravandoore
37
7.1k
Color Theory Basics | Prateek | Gurzu
gurzu
0
200
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Technical Leadership for Architectural Decision Making
baasie
2
250
Making Projects Easy
brettharned
120
6.6k
Evolving SEO for Evolving Search Engines
ryanjones
0
130
Claude Code のすすめ
schroneko
67
210k
The Cost Of JavaScript in 2023
addyosmani
55
9.5k
Six Lessons from altMBA
skipperchong
29
4.2k
Transcript
XIDを 周回させてみよう 2011-08-09 PostgreSQL勉強会@札幌 @iakio
今日の話 • PostgreSQLを長期間運用していると、突然有るはずの データが見えなくなってしまうという、XIDの周回問題と呼 ばれる現象があるらしい • でも滅多にお目にかかれません • じゃあ無理矢理にでもやってみよう
トランザクション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
トランザクション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
古い 新しい • XIDは32bit(40億) • T1に対してT2が新しいか 古いかは、T2-T1で決ま る • XIDを20億ちょい進める
と、新旧が逆転する
• なので、現在のXIDを例えば30億ほど進めれば、いきなり 見えてたものが見えなくなります • でもそんなのはつまらないですよね • 見えなくなる瞬間を見たい。が、それにはいくつかの壁
XIDの周回を防止する仕組み1 • 0から2は特殊なXID • 2がFrozenXIDと呼ばれ、どのXIDよりも古いとみなされる • 十分に古いXIDをFrozenXIDに置き換えることで、XIDの周 回を防止する • autovacuumがOFFでも実行される
XIDの周回を防止する仕組み1 • 前回のFreezeからXIDが2億進んだら (autovacuum_freeze_max_age) • 5千万より前のXIDをFrozenXIDにおきかえる (vacuum_freeze_min_age) • どこまで凍結したかをpg_class.relfrozenxidに記録する 2億
5千万 2億 5千万
XIDの周回を防止する仕組み2 • 残り1000万トランザクションで警告 • 残り100万トランザクションでエラーとなり、新しいトラン ザクションを受け入れなくなる(standalone modeで起動し なおしてvacuumを行う必要がある)
これがXIDを周回させる方法だ • データベースを停止 • pg_resetxlogでXIDを2^31に進める • pg_resetxlog -x 0x80000000 •
standaloneモードで起動し、pg_database.datfrozenxidと pg_class.relfrozenxidを2^31に進める • データベースを起動 • ちまちまXIDを消費(SELECT txid_current())
参考 • PostgreSQLドキュメント 「23.1.4. トランザクションIDの周回エラーの防止」 http://www.postgresql.jp/document/current/html/routine-vacuu