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
10
XIDを周回させてみよう
ISHIDA Akio
August 09, 2011
Tweet
Share
More Decks by ISHIDA Akio
See All by ISHIDA Akio
SQLを実行したときに、PostgreSQLはどのようにデータにアクセスしているのか
iakio
0
290
Prophecyを使った ユニットテスト
iakio
0
9
phpspecで学ぶLondon School TDD
iakio
0
4
PostgreSQLの範囲型と排他制約
iakio
0
10
使いこなそうGUC
iakio
0
6
Other Decks in Programming
See All in Programming
Geminiをパートナーに神社DXシステムを個人開発した話(いなめぐDX 開発振り返り)
fujiba
0
100
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
1.1k
2026-03-27 #terminalnight 変数展開とコマンド展開でターミナル作業をスマートにする方法
masasuzu
0
160
Kubernetesでセルフホストが簡単なNewSQLを求めて / Seeking a NewSQL Database That's Simple to Self-Host on Kubernetes
nnaka2992
0
180
テレメトリーシグナルが導くパフォーマンス最適化 / Performance Optimization Driven by Telemetry Signals
seike460
PRO
2
170
最初からAWS CDKで技術検証してもいいんじゃない?
akihisaikeda
4
170
KagglerがMixSeekを触ってみた
morim
0
310
Codex CLIのSubagentsによる並列API実装 / Parallel API Implementation with Codex CLI Subagents
takatty
2
470
Java 21/25 Virtual Threads 소개
debop
0
270
実践ハーネスエンジニアリング #MOSHTech
kajitack
7
3.9k
Redox OS でのネームスペース管理と chroot の実現
isanethen
0
440
今年もTECHSCOREブログを書き続けます!
hiraoku101
0
130
Featured
See All Featured
Context Engineering - Making Every Token Count
addyosmani
9
770
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
120
Joys of Absence: A Defence of Solitary Play
codingconduct
1
320
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
140
Writing Fast Ruby
sferik
630
63k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.1k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
130
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Become a Pro
speakerdeck
PRO
31
5.9k
Building Adaptive Systems
keathley
44
3k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
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