Yet another OSS DB:Firebird(2)

データベースファイルの内部構造を探ってみた

 

ページファイルの中身(Basic page header)

 さて、それぞれのページには先頭に16bytesのBasic page headerが配置されています。

Basic page header fig2

1byte目

 先頭の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 Page

GLink

 GLinkは、チェコ共和国のIvan Prenosil氏が公開しているC言語をベースとしたFirebird/InterBase用ユーティリティです。データベースの2次ファイル(2つ目、3つ目のファイルのことです)を配置変更したい場合、通常はバックアップ+リストアの作業を行わなくてはならないところを、直接ページヘッダを書き換えることでその手間を省こうというツールです。システムテーブルRDB$FILESの値は書き換えないので、IBOConsoleなどのGUIツールで2次ファイルを表示させると元のままになっているように見えますが、設定自体は有効になっています。データベースエンジンは停止した状態で使用しなくていけません

 本稿執筆時点での最新バイナリファイルは以下のリンクからダウンロードできます(2008年12月5日時点での最新版・Windows2000/XP/Vista対応)。

 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 次のページへ

Index
Yet another OSS DB:Firebird(2)
データベースファイルの内部構造を探ってみた
    Page 1
・1つのバイナリファイル
   Page types
   Firebirdのページサイズ
   ページサイズの選択肢が多い理由
   メモリサイズの制限
   ページタイプの種類と目的
→ Page 2
・ページファイルの中身(Basic page header)
・Glink
   Page 3
・GlinkのソースコードからFirebirdの実装を見る
   Glinkの実装を追いかける
   謎の数値40587を探る
   バイナリエディタでささっと調査
   clumpletsの実装チェックと置き換え
   update_db_header()


Yet another OSS DB:Firebird



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

注目のテーマ

Database Expert 記事ランキング

本日月間