可获得性
本特性自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
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




