Yet another OSS DB:Firebird(3)

仕組みを「見える化」してみた

Firebird日本ユーザー会
アナハイムテクノロジー
はやしつとむ
2009/2/19
 

PageType=2:ページインベントリページ(Page Inventory Page)

 PageType=2は、PIP(Page Inventory Page:ページインベントリページ)です。PIPには、使用されているページと、未使用のページのそれぞれの位置情報が格納されています。ほかのページも同様ですが、ページ先頭にはBasic Page Header(前回解説しましたね)が格納されています。PIPのヘッダの追加情報としては、PIP上で最も小さい未使用のページへのオフセットが格納されています。

 PIPの中身はデータベース中の各ページの状態が1bitで表現されて格納されています。各bitが1の場合はそのページは未使用の状態、0の場合は使用中ということになっています。

 PIPは、データベースの1ページ目から数えて、定期的に現れます。なぜかというと、PIPの最後のbitが次のPIPを指すようになっているからです。こうすることで、ページサイズが決まるとPIPの位置が決まるようになっているわけです。1番目のPIPが2ページ目にあって、16384bytesのページサイズだと、ヘッダが20bytesあるのでそれを引いて、130912ページ目に2番目のPIPが作成されるわけです。

●ページインベントリページ

 16384bytesのページサイズで130000ページを超えるデータベースだと2Gbytes以上になってしまうので、4096bytesのページサイズで(4096−20)×8=32608ページ以上のデータベースを作ってみました。PIPの出現予想位置は、0x7F5Fになります。VisualODSで見てみると、そのとおりになっていますから、確認してみてください。

●2ページ目にはじめのPIPが出現している

●スクロールしていくと予想どおりの位置にオレンジ色(PageType=2)が出現した


PageType=3:トランザクションインベントリページ(Transaction Inventory Page)

 PageType=3は、TIP(Transaction Inventory Page:トランザクションインベントリページ)です。TIPのヘッダの追加情報としては、次のTIPのページ番号が含まれています。

 TIPの中身は各トランザクションの状態を示す2bitの配列で埋まっています。各bitの状態とトランザクションの状態は以下のようになっています。

状態 補足
00 = 0 Active トランザクションはアクティブまたは未スタート
01 = 1 Limbo リンボー状態、2相コミットの第2相で失敗している
10 = 2 Rolled Back ロールバックされた
11 = 3 Commited コミット済み

 2相コミットとLimbo

 Firebirdは2相コミットをサポートしているので、Limbo(注)というヘンテコリンな状態になることがあり得ます。

 2相コミットというのは、複数のデータベースにまたがってトランザクションをかけるための仕組みです。クライアントから複数のサーバに対して「準備いいですか〜?」と聞くと、それぞれのサーバが第1相を完了してトランザクションをLimbo状態にします。その後、「オーケーだよ〜!」と返事をします。クライアント側は、すべてのサーバの準備ができたら「コミットしてね〜っ!」と声を掛けて、すべてのサーバで第2相が完了すると正常終了となる仕組みです(こんなに簡単に書くことじゃないかもしれませんが……)。

 ということで、2相コミット処理の途中で何らかの問題が発生すると、各サーバのトランザクションはLimbo状態のままとなってしまう可能性があるわけです。Limbo状態を解消するために、Firebirdには、gfixというユーティリティが付属しています。

注:天国と地獄の中間にあって「辺獄」とも呼ばれています。詳しくはダンテの『神曲』を読もう。僕はデビルマンの印象が強烈だったので、きっとダンテの『神曲』は恐ろしい話なんだろうと思って読んだんですが、実はイタリア語の原題は「La Divina Commedia」、つまり「Commedia(喜劇)」で、いまでいう風刺漫画のような内容です。

前のページへ 2/4 次のページへ

Index
仕組みを「見える化」してみた

Page 1
・はじめに
 VisualODSの使い方
 ISQLでサンプルデータベースを作成
→ Page 2
 PageType=2:ページインベントリページ(Page Inventory Page)
 PageType=3:トランザクションインベントリページ(Transaction Inventory Page)

Page 3
 PageType=4:ポインタページ(Pointer Page)
 PageType=5:データページ(Data Page)
 PageType=6:インデックスルートページ(Index Root Page)
 PageType=7:インデックスページ(Index<B-tree> Page)

Page 4
 PageType=8:Blobデータページ(Blob Page)
 PageType=9:ジェネレータページ(Generator Page)
・最後に
Yet another OSS DB:Firebird


Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間