PostgreSQLスキルアップノート(自己啓発のための個人サイト)

データベースページの解析「pageinspect」その2・整形用スクリプト


【一覧に戻る】


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ データベースページの解析「pageinspect」その2・整形用スクリプト
■■■■
■■■■
■■■■ 使用環境:PostgreSQL9.2.3 (CentOS6.2)
         2013/03/23
                                                                   (C) 2013 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

pageinspectの出力はそのままでは解析がしづらいため簡単な整形用スクリプトを作成した。

・PostgreSQL9.2.3のpageinspectで確認。
・スクリプトは本サイト独自のもので、適切ではない部分があるかもしれません。


【マニュアル】

付録 F. 追加で提供されるモジュール・pageinspect→●[マニュアル]

【参考記事】
 −



■1■ 概要
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

このスクリプトはheap_page_itemsとget_raw_pageをセットで出力するためのもの。

指定したテーブル、ブロック番号に関する
・ラインポインタの一覧  (heap_page_items関数使用)
・ページ内容のダンプ    (get_raw_page関数使用)

なお、get_raw_page関数の出力は8K分のデータが1行となっておりそのままでは扱いづら
いため以下のように整形している。

 ・64バイト分ごとの改行。  1ページ8192バイトなので出力は128行/1実行。
 ・左端に先頭からのバイト位置を入れる。




■2■ 確認用テーブル作成
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

【□】 テーブル作成

┌────────────────────────────┐

\pset pager off
\timing on
DROP TABLE t1;
CREATE TABLE t1 (
    c1 text,
    c2 text,
    c3 text 
) WITH (FILLFACTOR=90); 
INSERT INTO t1 VALUES('11111111111111111111','22222222222222222222','33333333333333333333');
INSERT INTO t1 VALUES('44444444444444444444','55555555555555555555','66666666666666666666');
INSERT INTO t1 VALUES('77777777777777777777','88888888888888888888','99999999999999999999');

└────────────────────────────┘



■3■ スクリプト1・全データ出力版
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
スクリプトは本サイト独自のもので、適切ではない部分があるかもしれません。
そのような場合は、整形部分(awk部分)をカスタマイズしてご使用下さい。


指定したブロック番号の「ラインポインタの情報」と「データ内容」をすべて出力する。

出力は標準出力と、ファイル双方に出力。
出力ファイル: pageinspect_DB名_TBL名_fork_ブロック番号_YYYYMMDD_HHMMSS.txt


bashコマンドラインから、以下をコピー&ペーストによりまとめて一度に実行する。

【□】 

# ==ここから====
DBNAME=database1                # 対象のデータベース名を入力。
TBL=t1                          # 対象のテーブル名を入力。
BLKNO=0                         # 対象のブロック番号を入力。
FORK=main                       # main,fsm,vmのいずれか。
(
echo "database= ${DBNAME} table= ${TBL} fork= ${FORK} blk= ${BLKNO}   "`date "+%Y-%m-%d %H:%M:%S"`
echo ""
psql "$DBNAME" -P pager=off -c "SELECT * from heap_page_items(get_raw_page('$TBL','$FORK',$BLKNO))";
psql "$DBNAME" -P pager=off -t -A -c "SELECT get_raw_page('$TBL','$FORK',$BLKNO)"\
|awk '{skp=2;print substr($0,1,skp);i=skp+1;print "   OFFSET";\
       while (lin<=127) {printf("%4d-%4d %-128s\n",lin*64,lin*64+63,substr($0,i,128));lin++;i=i+128}}'\
)\
|tee page_${DBNAME}_${TBL}_${FORK}_${BLKNO}_`date "+%Y%m%d_%H%M%S"`.txt
# ==ここまで====





■4■ スクリプト2・出力抑制版
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

このスクリプトは1ブロックに数行だけ入れて、その都度確認するような検証用途に使います。
行がたくさん格納されている普通のテーブルにはあまりメリットはありません。

ベースは前項と同一ですが、0x00だけからなる行を出力しないようにしています。
最後のegrep -vのところで00が64個続く場合(つまり1行全部0x00)のものを排除。


【□】 

# ==ここから====
DBNAME=database1                # 対象のデータベース名を入力。
TBL=t1                          # 対象のテーブル名を入力。
BLKNO=0                         # 対象のブロック番号を入力。
FORK=main                       # main,fsm,vmのいずれか。
(
echo "database= ${DBNAME} table= ${TBL} fork= ${FORK} blk= ${BLKNO}   "`date "+%Y-%m-%d %H:%M:%S"`
echo ""
psql "$DBNAME" -P pager=off -c "SELECT * from heap_page_items(get_raw_page('$TBL','$FORK',$BLKNO))";
psql "$DBNAME" -P pager=off -t -A -c "SELECT get_raw_page('$TBL','$FORK',$BLKNO)"\
|awk '{skp=2;print substr($0,1,skp);i=skp+1;print "   OFFSET";\
       while (lin<=127) {printf("%4d-%4d %-128s\n",lin*64,lin*64+63,substr($0,i,128));lin++;i=i+128}}'\
)\
|egrep -v "(00){64}"\
|tee page_${DBNAME}_${TBL}_${FORK}_${BLKNO}_`date "+%Y%m%d_%H%M%S"`.txt
# ==ここまで====





■■ 全データ出力版 出力例
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

エディタの折り返しを広くとって確認のこと。



 lp | lp_off | lp_flags | lp_len | t_xmin | t_xmax | t_field3 | t_ctid | t_infomask2 | t_infomask | t_hoff | t_bits | t_oid
----+--------+----------+--------+--------+--------+----------+--------+-------------+------------+--------+--------+-------
  1 |   8104 |        1 |     87 |   2621 |      0 |        0 | (0,1)  |           3 |       2050 |     24 |        |
  2 |   8016 |        1 |     87 |   2622 |      0 |        0 | (0,2)  |           3 |       2050 |     24 |        |
  3 |   7928 |        1 |     87 |   2623 |      0 |        0 | (0,3)  |           3 |       2050 |     24 |        |
(3 行)


\x
   0-  63 0a00000090a8f87b010000002400f81e0020042000000000a89fae00509fae00f89eae0000000000000000000000000000000000000000000000000000000000
  64- 127 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 128- 191 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 192- 255 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 256- 319 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 320- 383 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 384- 447 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 448- 511 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 512- 575 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 576- 639 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 640- 703 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 704- 767 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 768- 831 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 832- 895 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 896- 959 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 960-1023 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1024-1087 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1088-1151 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1152-1215 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1216-1279 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1280-1343 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1344-1407 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1408-1471 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1472-1535 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1536-1599 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1600-1663 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1664-1727 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1728-1791 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1792-1855 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1856-1919 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1920-1983 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1984-2047 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2048-2111 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2112-2175 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2176-2239 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2240-2303 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2304-2367 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2368-2431 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2432-2495 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2496-2559 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2560-2623 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2624-2687 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2688-2751 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2752-2815 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2816-2879 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2880-2943 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2944-3007 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3008-3071 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3072-3135 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3136-3199 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3200-3263 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3264-3327 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3328-3391 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3392-3455 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3456-3519 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3520-3583 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3584-3647 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3648-3711 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3712-3775 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3776-3839 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3840-3903 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3904-3967 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3968-4031 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4032-4095 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4096-4159 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4160-4223 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4224-4287 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4288-4351 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4352-4415 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4416-4479 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4480-4543 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4544-4607 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4608-4671 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4672-4735 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4736-4799 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4800-4863 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4864-4927 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4928-4991 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
4992-5055 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5056-5119 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5120-5183 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5184-5247 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5248-5311 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5312-5375 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5376-5439 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5440-5503 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5504-5567 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5568-5631 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5632-5695 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5696-5759 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5760-5823 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5824-5887 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5888-5951 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5952-6015 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6016-6079 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6080-6143 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6144-6207 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6208-6271 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6272-6335 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6336-6399 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6400-6463 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6464-6527 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6528-6591 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6592-6655 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6656-6719 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6720-6783 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6784-6847 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6848-6911 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6912-6975 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6976-7039 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7040-7103 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7104-7167 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7168-7231 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7232-7295 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7296-7359 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7360-7423 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7424-7487 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7488-7551 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7552-7615 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7616-7679 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7680-7743 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7744-7807 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7808-7871 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
7872-7935 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f0a000000000000
7936-7999 000000000000000003000300020818002b37373737373737373737373737373737373737372b38383838383838383838383838383838383838382b3939393939
8000-8063 393939393939393939393939393939003e0a000000000000000000000000000002000300020818002b34343434343434343434343434343434343434342b3535
8064-8127 3535353535353535353535353535353535352b3636363636363636363636363636363636363636003d0a00000000000000000000000000000100030002081800
8128-8191 2b31313131313131313131313131313131313131312b32323232323232323232323232323232323232322b333333333333333333333333333333333333333300

行データは下の位置から埋まっていくことがわかる。

INSERTしたデータは以下のため、比べるとわかりやすい。
INSERT INTO t1 VALUES('11111111111111111111','22222222222222222222','33333333333333333333');
INSERT INTO t1 VALUES('44444444444444444444','55555555555555555555','66666666666666666666');
INSERT INTO t1 VALUES('77777777777777777777','88888888888888888888','99999999999999999999');




■■ 出力抑制版 出力例
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

エディタの折り返しを広くとって確認のこと。


 lp | lp_off | lp_flags | lp_len | t_xmin | t_xmax | t_field3 | t_ctid | t_infomask2 | t_infomask | t_hoff | t_bits | t_oid
----+--------+----------+--------+--------+--------+----------+--------+-------------+------------+--------+--------+-------
  1 |   8104 |        1 |     87 |   2621 |      0 |        0 | (0,1)  |           3 |       2050 |     24 |        |
  2 |   8016 |        1 |     87 |   2622 |      0 |        0 | (0,2)  |           3 |       2050 |     24 |        |
  3 |   7928 |        1 |     87 |   2623 |      0 |        0 | (0,3)  |           3 |       2050 |     24 |        |
(3 行)


\x
   0-  63 0a00000090a8f87b010000002400f81e0020042000000000a89fae00509fae00f89eae0000000000000000000000000000000000000000000000000000000000
7872-7935 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f0a000000000000
7936-7999 000000000000000003000300020818002b37373737373737373737373737373737373737372b38383838383838383838383838383838383838382b3939393939
8000-8063 393939393939393939393939393939003e0a000000000000000000000000000002000300020818002b34343434343434343434343434343434343434342b3535
8064-8127 3535353535353535353535353535353535352b3636363636363636363636363636363636363636003d0a00000000000000000000000000000100030002081800
8128-8191 2b31313131313131313131313131313131313131312b32323232323232323232323232323232323232322b333333333333333333333333333333333333333300


                                                                                                            
以上 
inserted by FC2 system