前言
walminer工具可以帮助dba挖掘wal日志中的内容,看到某时间对应数据库中的具体操作。例如挖掘日志后可以看到数据库某时间有哪些dml语句。
walminer的限制与约束
- WalMiner工具的使用必须以数据库超级用户执行。
- 数据库能正常运行。
- full_page_writes必须为开启状态。
- 拥有完整连续的WAL日志。
- 能导出正常使用的数据字典。
- 解析过程中,日志所需数据字典没有发生改变。
- 不支持DDL的解析。
解析wal日志
测试环境为KESV8R6C007
1.解析本库WAL日志无需添加日志和数据字典
创建扩展
TEST=# create extension walminer;
CREATE EXTENSION
按时间范围解析
TEST=# select walminer_by_time('2023-04-09 11:27:00', '2023-04-10 11:37:00');
NOTICE: Add wal from current pg_wal directory, do not suggest use this way in produce
NOTICE: Switch wal to 000000010000000100000078 on time 2023-04-10 15:54:17.088751+08
walminer_by_time
---------------------
pg_minerwal success
(1 row)
普通解析
TEST=# select walminer_all();
LSN范围解析
select walminer_by_lsn('0/010000A0', '0/016E6578');
单表解析
select walminer_by_time('2023-09-08 11:27:00', '2023-09-08 11:37:00', 'false', 16452);
查看分析结果:
TEST=# select * from walminer_contents;
sqlno | xid | topxid | sqlkind | minerd | timestamp | op_text | undo_text |
complete | schema | relation | start_lsn | commit_lsn
-------+------+--------+---------+--------+-------------------------------+-------------------------------------------------------------------------------+--------------------------------------------------+
----------+--------+----------+------------+------------
1 | 1516 | 0 | 1 | t | 2023-03-31 15:22:05.701811+08 | INSERT INTO public.u1(id ,info) VALUES(1 ,'ec79d8fc388c6aadb81c04890efcb587') | DELETE FROM public.u1 WHERE id=1 |
t | public | u1 | 1/7898B1F8 | 1/78991750
结束分析:
select walminer_stop();
结束分析后还可以查到walminer_contents视图中相关记录,如果以后不需要查看可以truncate该视图。
异地解析wal日志的限制
1.执行了删除表、truncate表、更改表的表空间、更改表字段的类型、vacuum full,这样的DDL语句后,发生DDL语句之前的此表相关的DML语句不会再被解析。
应对措施:建议在执行表结构变更之前,先保存一份数据字典,用来保证可以解析历史wal日志。
2.解析结果依赖于数据字典。(举例:创建表t1,所有者为user1,但是中间将所有者改为user2。那解析结果中,所有t1相关操作所有者都将标示为user2)
应对措施:建议在执行表结构变更之前,先保存一份数据字典,用来保证可以准确解析历史wal日志。
3.只能解析与数据字典时间线一致的wal文件
4.不建议使用walminer解析大量copy语句(在同一个事务中插入大量数据行)产生的wal日志,
这会导致解析过程中的效率低下。
2.解析其他数据库的WAL日志
解析其他库的日志暂不支持解析自定义数据类型,如果其他库的WAL日志中存在自定义数据类型,而本库没有对应的数据类型则会解析失败。
从其他数据库导出数据字典
select walminer_build_dictionary('/home/kingbase/dict');
导出的数据字典名称为:dict
将生成的数据字典和需要解析的wal日志放到其他库可以获取的路径。
导入其他数据库的数据字典
-- 导入数据字典
select walminer_load_dictionary('/home/kingbase/dict/dict');
添加日志文件
select walminer_wal_add('/home/kingbase/sys_wal/000000010000000000000001');
日志解析,同本地wal解析方式相同,包括普通解析,时间范围解析, LSN范围解析,单表解析
-- 查看分析结果
select * from walminer_contents;
-- 结束分析,结束分析会删除分析过程中生成的中间文件、导入的数据字典、WAL日志文件以及分析结果
select walminer_stop();
3.本地wal加密方式使用walminer
wal加密后使用walminer解析时,不需要打开透明存储加密的钱夹功能,不需要加密密钥。
TEST=# CLOSEUP WALLET WITH PASSWORD "654321";
CLOSE WALLET
alter system set wal_encryption to true;
select sys_reload_conf();
TEST=# show wal_encryption ;
wal_encryption
----------------
on
(1 row)
TEST=# create extension walminer ;
CREATE EXTENSION
TEST=#
TEST=# select walminer_all();
NOTICE: Add wal from current pg_wal directory, do not suggest use this way in produce
NOTICE: Switch wal to 000000010000000100000078 on time 2023-04-10 16:38:12.105553+08
walminer_all
---------------------
pg_minerwal success
(1 row)
TEST=#
TEST=# select * from walminer_contents;
sqlno | xid | topxid | sqlkind | minerd | timestamp | op_text | undo_text |
complete | schema | relation | start_lsn | commit_lsn
-------+------+--------+---------+--------+-------------------------------+-------------------------------------------------------------------------------+--------------------------------------------------+
----------+--------+----------+------------+------------
1 | 1516 | 0 | 1 | t | 2023-03-31 15:22:05.701811+08 | INSERT INTO public.u1(id ,info) VALUES(1 ,'ec79d8fc388c6aadb81c04890efcb587') | DELETE FROM public.u1 WHERE id=1 |
t | public | u1 | 1/7898B1F8 | 1/78991750
总结
在KingbaseESV8R6C7中支持walminer日志挖掘,此功能插件有些功能限制需要注意,例如支持DDL语句的挖掘。
在本地测试加密wal日志不需要对应解密密钥就可以使用walminer挖掘日志。