pg_filedumpを使ってみる

pg_filedumpというファイル(heap、index、control file)の中身を読みやすく出力してくれるツールがあることを知ったので試してみた。
http://sources.redhat.com/rhdb/utilities.html

ダウンロードしてPostgreSQLファイルのソースのcontribディレクトリに展開してmakeすると簡単にインストールできる。

tar xvf pg_filedump-8.3.tar
cd pg_filedump-8.3
make -f Makefile.contrib
make -f Makefile.contrib install

pg_filedumpコマンドが実行できればインストール成功。

試してみる。
まず新規にテーブルを作りそのファイル名を取得する。

test=# create table hoge (a int, b varchar(10));
CREATE TABLE
test=# insert into hoge (a, b) values (1, 'test');
INSERT 0 1
test=# insert into hoge (a, b) values (2, 'aaa');
INSERT 0 1
test=# checkpoint;
CHECKPOINT
test=# select relfilenode from pg_class where relname = 'hoge';
 relfilenode
-------------
       16466
(1 row)

データをファイルに書かせるために明示的にcheckpointしておく。

次にファイル名を指定してpg_filedumpを実行する。

$ pg_filedump -f /usr/local/pgsql/data/base/16384/16466

でた。

*******************************************************************
* PostgreSQL File/Block Formatted Dump Utility - Version 8.3.0
*
* File: /usr/local/pgsql/data/base/16384/16466
* Options used: -f
*
* Dump created on: Wed Feb  4 08:18:55 2009
*******************************************************************

Block    0 ********************************************************
<Header> -----
 Block Offset: 0x00000000         Offsets: Lower      32 (0x0020)
 Block: Size 8192  Version    4            Upper    8124 (0x1fbc)
 LSN:  logid      0 recoff 0x005d2640      Special  8192 (0x2000)
 Items:    2                      Free Space: 8092
 TLI: 0x0001  Prune XID: 0x00000000  Flags: 0x0000 ()
 Length (including item array): 32

  0000: 00000000 40265d00 01000000 2000bc1f  ....@&]..... ...
  0010: 00200420 00000000 dc9f4200 bc9f4000  . . ......B...@.

<Data> ------
 Item   1 -- Length:   33  Offset: 8156 (0x1fdc)  Flags: NORMAL
  1fdc: 3d020000 00000000 00000000 00000000  =...............
  1fec: 01000200 02081800 01000000 0b746573  .............tes
  1ffc: 74                                   t

 Item   2 -- Length:   32  Offset: 8124 (0x1fbc)  Flags: NORMAL
  1fbc: 3e020000 00000000 00000000 00000000  >...............
  1fcc: 02000200 02081800 02000000 09616161  .............aaa



*** End of File Encountered. Last Block Read: 0 ***

ItemのOffsetを見るとItemが後ろから追加されているのがわかる。データも見える。
内部を知るのに便利そう。