暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MogDB 支持pageinspect和pagehack工具

原创 MogDB 2024-08-06
252

可获得性

本特性自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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论