文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

支持pageinspect和pagehack工具

可获得性

本特性自MogDB 5.0.2版本开始引入。

特性简介

新增pageinspect和pagehack工具用于辅助相关问题定位。pageinspect是一款插件(extension),安装后创建插件使用,pagehack是一个可执行工具,需安装后在命令行使用。

客户价值

新增工具仅提供给一线维护人员、测试人员以及开发人员用于定位问题内部使用。

特性描述

pageinspect插件

本插件实现在行存表(astore)场景下查看数据文件和Btree索引文件相关page页面的相关内容信息,属于在线查询(MogDB用例alive),在SQL端执行相关命令查看信息。

pageinspect工具是一款插件(extension),需要手动安装,安装前请在官网下载页面下载已发行的Toolkits工具包,解压后将相应的文件拷贝到指定目录下并修改权限,登录数据库并创建extension即可。

# 使用root用户解压缩工具包
tar -xzvf Toolkits-5.0.2-Kylin-arm64.tar.gz

# 使用数据库实例用户(如omm)进入toolkits下的pageinspect文件夹,拷贝相应的文件到指定目录
cd pageinspect/
cp pageinspect--1.0.sql $GAUSSHOME/share/postgresql/extension
cp pageinspect.control $GAUSSHOME/share/postgresql/extension
cp pageinspect--unpackaged--1.0.sql $GAUSSHOME/share/postgresql/extension
cp pageinspect.so $GAUSSHOME/lib/postgresql

# 修改权限
cd $GAUSSHOME/share/postgresql/extension
chmod 644 pageinspect--1.0.sql pageinspect.control pageinspect--unpackaged--1.0.sql
cd $GAUSSHOME/lib/postgresql
chmod 755 pageinspect.so

# 登录数据库,创建extension
gsql -r
CREATE EXTENSION pageinspect;

该插件提供几个系统函数,使用固定格式进行查询,语法如下:

# 查看heap数据表中内容
SELECT * FROM heap_page_items(get_raw_page('table_name','main',page_no));
# 查看heap页面的header信息
SELECT * FROM page_header(get_raw_page('table_name','main',page_no));
# 查看meta page信息
SELECT * FROM bt_metap('index_name');
# 查看指定索引page页面号的内容
SELECT * FROM bt_page_items('index_name', page_no);

pagehack工具

pagehack工具用于对MogDB实例中创建的行存表和BTree索引产生的离线文件进行解析。pagehack是一个二进制可执行工具,直接在终端命令行执行,参数为需要解析的文件(支持行存表和BTree索引文件),显示文件中page页面具体数据内容。本工具需手动安装,方法如下:

# 使用root用户解压缩工具包
tar -xzvf Toolkits-5.0.2-Kylin-arm64.tar.gz

# 使用数据库实例用户(如omm)进入toolkits下的pagehack文件夹,拷贝相应的文件到指定目录
cd pagehack/
cp pagehack $GAUSSHOME/bin
cp pagehack.so $GAUSSHOME/lib/postgresql

# 修改权限
cd $GAUSSHOME/bin
chmod 755 pagehack
cd $GAUSSHOME/lib/postgresql
chmod 755 pagehack.so

安装完成后,直接执行以下命令即可使用工具:

pagehack -f 文件名

示例

pageinspect

# 创建pageinspect插件,然后创建行存表和BTree索引,在数据表中插入若干数据
MogDB=# CREATE EXTENSION pageinspect;
CREATE EXTENSION
MogDB=# CREATE TABLE t(id int, a text);
CREATE TABLE
MogDB=# CREATE INDEX idx_id on t(id);
CREATE INDEX
MogDB=# INSERT INTO t SELECT num, repeat('ABCD', 8) || num from generate_series(1, 500) as num;
INSERT 0 500
MogDB=# SELECT * FROM t LIMIT 32;
 id |                 a
----+------------------------------------
  1 | ABCDABCDABCDABCDABCDABCDABCDABCD1
  2 | ABCDABCDABCDABCDABCDABCDABCDABCD2
  3 | ABCDABCDABCDABCDABCDABCDABCDABCD3
 ......
 32 | ABCDABCDABCDABCDABCDABCDABCDABCD32
(32 rows)

# 查看heap数据表中内容
MogDB=# SELECT * FROM heap_page_items(get_raw_page('t','main',0));
 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 |   8128 |        1 |     62 |  14111 |      0 |        0 | (0,1)   |           2 |       2306 |     24 |        |
   2 |   8064 |        1 |     62 |  14111 |      0 |        0 | (0,2)   |           2 |       2306 |     24 |        |
   3 |   8000 |        1 |     62 |  14111 |      0 |        0 | (0,3)   |           2 |       2306 |     24 |        |
   4 |   7936 |        1 |     62 |  14111 |      0 |        0 | (0,4)   |           2 |       2306 |     24 |        |
   5 |   7872 |        1 |     62 |  14111 |      0 |        0 | (0,5)   |           2 |       2306 |     24 |        |

# 查看heap页面的header信息
MogDB=# SELECT * FROM page_header(get_raw_page('t','main',0));
    lsn    | tli | flags | lower | upper | special | pagesize | version | prune_xid
-----------+-----+-------+-------+-------+---------+----------+---------+-----------
 0/C4DC510 |   0 |     0 |   516 |   576 |    8192 |     8192 |       6 |     14108
(1 row)

# 查看BTree索引的meta page信息
MogDB=# SELECT * FROM bt_metap('idx_id');
 magic  | version | root | level | fastroot | fastlevel
--------+---------+------+-------+----------+-----------
 340322 |       2 |    3 |     1 |        3 |         1
(1 row)

# 查看指定索引page页面号的内容
MogDB=# SELECT * FROM bt_page_items('idx_id', 1);
 itemoffset |  ctid   | itemlen | nulls | vars |          data
------------+---------+---------+-------+------+-------------------------
          1 | (3,9)   |      16 | f     | f    | 6e 01 00 00 00 00 00 00
          2 | (0,1)   |      16 | f     | f    | 01 00 00 00 00 00 00 00
          3 | (0,2)   |      16 | f     | f    | 02 00 00 00 00 00 00 00
          4 | (0,3)   |      16 | f     | f    | 03 00 00 00 00 00 00 00
          5 | (0,4)   |      16 | f     | f    | 04 00 00 00 00 00 00 00

pagehack

# 如前示例,MogDB数据库实例已经生成行存表/BTree索引数据文件,而且数据已经写到文件中(如果没有下盘可以强制执行checkpoint或者创建其他表并插入数据使事务推进)
# 获取对象OID
MogDB=# \d+
                                    List of relations
 Schema | Name | Type  | Owner  | Size  |             Storage              | Description
--------+------+-------+--------+-------+----------------------------------+-------------
 public | t    | table | omm    | 72 kB | {orientation=row,compression=no} |
(1 row)

MogDB=# \d+ t
                           Table "public.t"
 Column |  Type   | Modifiers | Storage  | Stats target | Description
--------+---------+-----------+----------+--------------+-------------
 id     | integer |           | plain    |              |
 a      | text    |           | extended |              |
Indexes:
    "idx_id" btree (id) TABLESPACE pg_default
Has OIDs: no
Options: orientation=row, compression=no

# 查询到表t的oid=17092,索引idx_id的oid=17098
MogDB=# select pg_relation_filepath('t');
 pg_relation_filepath
----------------------
 base/15318/17092
(1 row)

MogDB=# select pg_relation_filepath('idx_id');
 pg_relation_filepath
----------------------
 base/15318/17098
(1 row)

# 在命令行执行以下命令,解析行存表的heap数据
[omm@mogdb-kernel-001 toolkits]$ pagehack -f /opt/mogdb/data/base/15318/17092 | head -n 32
page information of block 0/5
        pd_lsn: 0/C4DC510
        pd_checksum: 0xB4FA, verify success
        pd_flags:
        pd_lower: 516, non-empty
        pd_upper: 576, old
        pd_special: 8192, size 0
        Page size & version: 8192, 6
        pd_xid_base: 14108, pd_multi_base: 0
        pd_prune_xid: 14108

        Heap tuple information on this page

                Tuple #1 is normal: length 62, offset 8128
                        t_xmin/t_xmax/t_cid: 14111/0/0
                        ctid:(block 0/0, offset 1)
                        t_infomask: HEAP_HASVARWIDTH HEAP_XMIN_COMMITTED HEAP_XMAX_INVALID HEAP_HAS_NO_UID
                        t_infomask2: Attrs Num: 2
                        t_hoff: 24
                        t_bits:
                                NNNNNNNN


                Tuple #2 is normal: length 62, offset 8064
                        t_xmin/t_xmax/t_cid: 14111/0/0
                        ctid:(block 0/0, offset 2)
                        t_infomask: HEAP_HASVARWIDTH HEAP_XMIN_COMMITTED HEAP_XMAX_INVALID HEAP_HAS_NO_UID
                        t_infomask2: Attrs Num: 2
                        t_hoff: 24
                        t_bits:
                                NNNNNNNN

# 解析BTree索引的数据
[omm@mogdb-kernel-001 toolkits]$ pagehack -f /opt/mogdb/data/base/15318/17098 | head -n 32
page information of block 0/4
        pd_lsn: 0/C4EBD58
        pd_checksum: 0xF9AA, verify success
        pd_flags:
        pd_lower: 48, non-empty
        pd_upper: 8168, old
        pd_special: 8168, size 24
        Page size & version: 8192, 5
        pd_xid_base: 8590274914, pd_multi_base: 4294967299
        pd_prune_xid: 8590274914

        Heap tuple information on this page

                Tuple #1 is redirected: length 2, offset 12642
                Tuple #2 is unused

                Tuple #3 is unused

                Tuple #4 is unused

                Tuple #5 is unused

                Tuple #6 is unused
        Summary (6 total): 5 unused, 0 normal, 0 dead

Normal Heap Page, special space is 0

page information of block 1/4
        pd_lsn: 0/C4EBD58
        pd_checksum: 0x95F3, verify success
        pd_flags:
        pd_lower: 1488, non-empty
Copyright © 2011-2024 www.enmotech.com All rights reserved.