金仓数据库KingbaseES中WalMiner的使用
WalMiner的限制与约束
- WalMiner工具的使用必须以数据库超级用户执行。
- 数据库能正常运行。
- full_page_writes必须为开启状态。
- 拥有完整连续的WAL日志。
- 能导出正常使用的数据字典。
- 解析过程中,日志所需数据字典没有发生改变。
- 不支持DDL的解析。
- 日志文件或history文件损坏的情况下,有可能解析不出数据。
一、创建扩展
在对应的database下安装walminer扩展。
mydb=>create extension walminer;
CREATE EXTENSION
二、添加日志
添加日志时,可以添加文件夹或文件,可以多次添加多个不同的目录,WalMiner会自动根据日志文件名称进行排序和去重。比如可以同时添加在线日志目录和归档日志目录。添加文件时,会对文件进行判断,如果不是WAL日志,则会报错。
如下,添加了wal和归档两个目录下的日志
mydb=# select walminer_wal_add('sys_wal');
walminer_wal_add
--------------------
5 file add success
(1 row) mydb=# select walminer_wal_add('/Kingbase/arch');
walminer_wal_add
--------------------
3 file add success
(1 row)
三、展示日志列表
mydb=# select walminer_wal_list();
walminer_wal_list
--------------------------------------------------------- (/Kingbase/arch/00000001000000000000000A)
(/Kingbase/arch/00000001000000000000000B) (/Kingbase/arch/00000001000000000000000C)
(/Kingbase/ES/V9/data/sys_wal/00000001000000000000000D) (/Kingbase/ES/V9/data/sys_wal/00000001000000000000000E) (/Kingbase/ES/V9/data/sys_wal/00000001000000000000000F)
(/Kingbase/ES/V9/data/sys_wal/000000010000000000000010) (/Kingbase/ES/V9/data/sys_wal/000000010000000000000011)
(8 rows)
#删除已经添加的日志,可以删除单个文件,也可以删除文件夹,可以多次执行
select walminer_wal_remove('sys_wal/000000010000000000000011');
或者
select walminer_wal_remove('sys_wal');
四、数据解析
1. 普通解析
walminer_al会解析已加入的所有WAL日志,如果没有添加WAL日志,则解析data/sys_wal目录下所有WAL日志,解析过程中遇到WAL日志错误、或WAL日志不连续,会在错误或不连续的地方停止解析。
mydb=# select walminer_all(); walminer_all ------------------- sys_miner success
(1 row)
2. 时间范围解析
根据时间范围解析,在add的WAL日志中查找对应时间范围的WAL记录。
select walminer_by_time('2026-01-08 15::30', '2026-01-08 16:10:00');
在时间范围解析中,如果开始时间设置为空,则从已加入的WAL日志列表中第一个日志的第一个LSN开始解析。
3. LSN范围解析
根据LSN范围解析,在add的WAL日志中查找对应LSN范围的WAL记录。
select walminer_by_lsn('0/010000A0', '0/016E6578');
4. 单表解析
--开始时间/LSN --结束时间/LSN 是否精准解析 --表OID。单表解析时,必须指定是否为精准解析。
select walminer_by_time('2026-01-08 15::30', '2026-01-08 16:10:00','false', 16452);
解析完成后会自动删除生成的中间文件、已添加的WAL日志、已导入的数据字典等。
五、查看解析结果
mydb=# select * from walminer_contents;

walminer_contents表字段描述信息:
|
字段名称 |
字段类型 |
字段描述 |
|
sqlno |
integer |
SQL语句在事务里的编号 |
|
xid |
bigint |
当前事务的xid |
|
topxid |
bigint |
父事务的xid |
|
sqlkind |
integer |
SQL语句类型(INSERT/DELETE/UPDATE) |
|
minerd |
boolean |
是否能解析 |
|
timestamp |
timestamp with time zone |
事务提交时间 |
|
op_text |
text |
redo语句 |
|
undo_text |
text |
undo语句 |
|
complete |
boolean |
事务是否已完成 |
|
schema |
text |
模式名 |
|
relation |
text |
表名 |
|
start_lsn |
sys_lsn |
事务开始的LSN号 |
|
commit_lsn |
sys_lsn |
事务提交时的LSN号 |
最终,结束解析,结束解析时,会清空解析过程中生成的中间文件。
六、释放内存和临时资源
mydb=# select walminer_stop(); walminer_stop ------------------ walminer stoped!
(1 row)
七、解析其他数据库的WAL日志
解析其他库的日志暂不支持解析自定义数据类型,如果其他库的WAL日志中存在自定义数据类型,而本库没有对应的数据类型则会解析失败。
1. 从其他数据库导出数据字典
-- 导出数据字典
kingbase=# select walminer_build_dictionary('/kingbase/dict');
walminer_build_dictionary
---------------------------
Dictionary build success!
(1 row)
导出的数据字典名称为:dict
[kingbase@opengaussdb Kingbase]$ ll /Kingbase/dict
total 1292
-rw------- 1 kingbase kingbase 1322744 Jan 8 14:42 dictionary.d
2. 导入其他数据库的数据字典
-- 导入数据字典
kingbase=# select walminer_load_dictionary('/kingbase/dict');
walminer_load_dictionary
--------------------------
Dictionary load success!
(1 row)
导入其他数据库的wal日志解析,除了增加本章节1、2步骤导出导入数据字典步骤外,其他步骤与第1、2、3、4、5、6章节相同,不再重复赘述。
总结
Walminer是一个功能强大的工具,用于解析和分析数据库的wal日志文件,以提取有用的事务信息和数据操作,无论是故障恢复、数据版本控制还是数据分析,Walminer接口都是一个强大的工具。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)