SlideShare a Scribd company logo
5
Most read
10
Most read
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

More Related Content

PDF
Vacuum徹底解説
PDF
PostgreSQL: XID周回問題に潜む別の問題
PPTX
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
Inside vacuum - 第一回PostgreSQLプレ勉強会
PDF
PostgreSQLの運用・監視にまつわるエトセトラ
PDF
アーキテクチャから理解するPostgreSQLのレプリケーション
PDF
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
Vacuum徹底解説
PostgreSQL: XID周回問題に潜む別の問題
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Inside vacuum - 第一回PostgreSQLプレ勉強会
PostgreSQLの運用・監視にまつわるエトセトラ
アーキテクチャから理解するPostgreSQLのレプリケーション
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)

What's hot (20)

PDF
いまさら聞けないPostgreSQL運用管理
PDF
PostgreSQL 13でのpg_stat_statementsの改善について(第12回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
PPTX
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
PDF
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
NTT DATA と PostgreSQL が挑んだ総力戦
PPTX
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PDF
あなたの知らないPostgreSQL監視の世界
PDF
PostgreSQL 15 開発最新情報
PPTX
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
PPTX
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PDF
PostgreSQL 15の新機能を徹底解説
PPTX
PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PDF
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PDF
シンプルでシステマチックな Linux 性能分析方法
PPTX
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQLの関数属性を知ろう
いまさら聞けないPostgreSQL運用管理
PostgreSQL 13でのpg_stat_statementsの改善について(第12回PostgreSQLアンカンファレンス@オンライン 発表資料)
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA と PostgreSQL が挑んだ総力戦
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
あなたの知らないPostgreSQL監視の世界
PostgreSQL 15 開発最新情報
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQL 15の新機能を徹底解説
PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
シンプルでシステマチックな Linux 性能分析方法
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLの関数属性を知ろう
Ad

Similar to XIDを周回させてみよう (7)

PDF
AVX命令を用いたLJの力計算のSIMD化
PDF
ツイートID生成とツイッターリアルタイム検索システムの話
PDF
これからのコンピューティングとJava(Hacker Tackle)
PDF
C++ Transactional Memory言語拡張の紹介
PDF
Halide による画像処理プログラミング入門
PDF
コルーチンを使おう
PDF
PostgreSQL13 新機能紹介
AVX命令を用いたLJの力計算のSIMD化
ツイートID生成とツイッターリアルタイム検索システムの話
これからのコンピューティングとJava(Hacker Tackle)
C++ Transactional Memory言語拡張の紹介
Halide による画像処理プログラミング入門
コルーチンを使おう
PostgreSQL13 新機能紹介
Ad

More from Akio Ishida (12)

PDF
Prophecyを使ったユニットテスト
PDF
よりよいPHPUnitの実行方法を求めて
PDF
phpspecで学ぶLondon School TDD
PDF
PostgreSQLの範囲型と排他制約
PDF
Getting start with knockout.js
PDF
Local php-100828 2
PDF
Rubysapporo Stringsearch
PDF
Ruby Postgres 2009
PDF
使いこなそうGUC
PDF
textsearch_jaで全文検索
PDF
PostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
PDF
Ruby Postgres
Prophecyを使ったユニットテスト
よりよいPHPUnitの実行方法を求めて
phpspecで学ぶLondon School TDD
PostgreSQLの範囲型と排他制約
Getting start with knockout.js
Local php-100828 2
Rubysapporo Stringsearch
Ruby Postgres 2009
使いこなそうGUC
textsearch_jaで全文検索
PostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
Ruby Postgres

XIDを周回させてみよう

  • 1. XIDを 周回させてみよう 2011-08-09 PostgreSQL勉強会@札幌 @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