仕組みを「見える化」してみた
アナハイムテクノロジー
はやしつとむ
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 | コミット済み |
Firebirdは2相コミットをサポートしているので、Limbo(注)というヘンテコリンな状態になることがあり得ます。
2相コミットというのは、複数のデータベースにまたがってトランザクションをかけるための仕組みです。クライアントから複数のサーバに対して「準備いいですか〜?」と聞くと、それぞれのサーバが第1相を完了してトランザクションをLimbo状態にします。その後、「オーケーだよ〜!」と返事をします。クライアント側は、すべてのサーバの準備ができたら「コミットしてね〜っ!」と声を掛けて、すべてのサーバで第2相が完了すると正常終了となる仕組みです(こんなに簡単に書くことじゃないかもしれませんが……)。
ということで、2相コミット処理の途中で何らかの問題が発生すると、各サーバのトランザクションはLimbo状態のままとなってしまう可能性があるわけです。Limbo状態を解消するために、Firebirdには、gfixというユーティリティが付属しています。
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 |
- Oracleライセンス「SE2」検証 CPUスレッド数制限はどんな仕組みで制御されるのか (2017/7/26)
データベース管理システムの運用でトラブルが発生したらどうするか。DBサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は、Oracle SE2の「CPUスレッド数制限」がどんな仕組みで行われるのかを検証します - ドメイン参加後、SQL Serverが起動しなくなった (2017/7/24)
本連載では、「SQL Server」で発生するトラブルを「どんな方法で」「どのように」解決していくか、正しい対処のためのノウハウを紹介します。今回は、「ドメイン参加後にSQL Serverが起動しなくなった場合の対処方法」を解説します - さらに高度なSQL実行計画の取得」のために理解しておくべきこと (2017/7/21)
日本オラクルのデータベーススペシャリストが「DBAがすぐ実践できる即効テクニック」を紹介する本連載。今回は「より高度なSQL実行計画を取得するために、理解しておいてほしいこと」を解説します - データベースセキュリティが「各種ガイドライン」に記載され始めている事実 (2017/7/20)
本連載では、「データベースセキュリティに必要な対策」を学び、DBMSでの「具体的な実装方法」や「Tips」などを紹介していきます。今回は、「各種ガイドラインが示すコンプライアンス要件に、データベースのセキュリティはどのように記載されているのか」を解説します
|
|