データベースファイルの内部構造を探ってみた
Firebird日本ユーザー会
アナハイムテクノロジー
はやしつとむ
2008/12/12
ページファイルの中身(Basic page header)
さて、それぞれのページには先頭に16bytesのBasic page headerが配置されています。
Basic page header1byte目
先頭の1byte目は先に挙げたページタイプです。
2byte目
2byte目はページFlagと呼ばれ、現在のところ、BlobページとIndexページ(B木)でしか使用されていません。そのほかのヘッダページなどでは0が入っています。
3〜4byte目
続く2bytesはチェックサムと表記されていますが、現状では常に10進数で12345が入っています。16進数では0x3039となりますが、ファイル上のバイトオーダーはリトルエンディアンになっているので「39 30」と記録されています(以下同様)。
5〜8byte目
その次の4bytesはページのGeneration(世代)になります。これは、各ページに書き込みが行われるたびにインクリメントされます。作成したばかりのデータベースファイルのヘッダページのGenerationは0x04000000となっています。
9〜16byte目
最後の8bytesは、WriteAheadLog用のシーケンスナンバーとオフセットということでしたが、ODS 11になってから、つまりFirebrid 2.0以降のバージョンでは、WAL用のシーケンスナンバー部分をnbackupで利用するようになりました。最後のreservedは、いまも使われていません。ods.hの定義を以下に示します。
ods.h/* Basic page header */ struct pag { SCHAR pag_type; SCHAR pag_flags; USHORT pag_checksum; ULONG pag_generation; // We renamed pag_seqno for SCN number usage to avoid major ODS version bump ULONG pag_scn; // WAL seqno of last update, now used by nbackup ULONG reserved; /* Was used for WAL */ }; Header Page
各データベースファイルには必ずヘッダページが存在し、これは必ず先頭ページに置かれることになっています。
最初のファイルのヘッダページには、データベースのページサイズや次のトランザクションID、そのほかの設定などが書き込まれています。2次ファイル以降のヘッダページにはファイルのサイズと、自分の次のファイル名のみが書き込まれています。
以下に、Firebird 1.5で生成したページサイズ4096のデータベースファイルのヘッダを示します。
Header PageGLink
GLinkは、チェコ共和国のIvan Prenosil氏が公開しているC言語をベースとしたFirebird/InterBase用ユーティリティです。データベースの2次ファイル(2つ目、3つ目のファイルのことです)を配置変更したい場合、通常はバックアップ+リストアの作業を行わなくてはならないところを、直接ページヘッダを書き換えることでその手間を省こうというツールです。システムテーブルRDB$FILESの値は書き換えないので、IBOConsoleなどのGUIツールで2次ファイルを表示させると元のままになっているように見えますが、設定自体は有効になっています。データベースエンジンは停止した状態で使用しなくていけません。
本稿執筆時点での最新バイナリファイルは以下のリンクからダウンロードできます(2008年12月5日時点での最新版・Windows2000/XP/Vista対応)。
- Glink.exe(163840bytes)
- 木村明治氏による日本語訳サイト
GLink.exeの使用方法は以下のとおりです(コマンドラインプロンプトからオプションなしでGLink.exeを実行しても同様の内容が表示されます)。
GLink.exeの使い方Syntax: glink [switches] [db_file_name [new_name]] -h: print header -H: print full header -?: print this help text -z: print version information glink <db_file_name> will show name of next file in chain. glink <db_file_name> <new_name> will change name of next file.
2/3 |
データベースファイルの内部構造を探ってみた
Page types
Firebirdのページサイズ
ページサイズの選択肢が多い理由
メモリサイズの制限
ページタイプの種類と目的
・Glink
Glinkの実装を追いかける
謎の数値40587を探る
バイナリエディタでささっと調査
clumpletsの実装チェックと置き換え
update_db_header()
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」などを紹介していきます。今回は、「各種ガイドラインが示すコンプライアンス要件に、データベースのセキュリティはどのように記載されているのか」を解説します
|
|