目录
-- 可添加文件夹或文件 -- 可多次执行,会自动去重 -- 添加文件时,会对文件进行判断,如果不是WAL日志,则会报错 select walminer_wal_add('$KBDATA/sys_wal/'); select walminer_wal_add('$KBDATA/sys_wal/000000010000000000000001');
可以多次添加多个不同的目录,WalMiner会自动根据日志文件名称进行排序和去重。比如可以同时添加在线日志目录和归档日志目录。
如果不执行日志导入,直接执行日志分析,则默认会添加$KBDATA目录下的sys_wal目录,使用在线日志进行解析时会提示警告信息:
NOTICE: Add wal from current sys_wal directory, do not suggest use this way in produce
-- 展示已添加的WAL日志列表 select walminer_wal_list();
-- 可删除文件和文件夹 -- 可多次执行 select walminer_wal_remove('$KBDATA/sys_wal/'); select walminer_wal_remove('$KBDATA/sys_wal/000000010000000000000001');
-- 可传入目录或文件全路径 -- 如果传入目录,数据字典默认名称为dictionary.d select walminer_build_dictionary('$KBDATA/sys_walminer/wm_datadict'); select walminer_build_dictionary('$KBDATA/sys_walminer/wm_datadict/dictionary.d');
如果不导入数据字典就执行解析的话,会默认使用在线数据字典。
导入数据字典函数可以多次执行,会自动覆盖前一次加载的数据字典。
-- 可传入目录或文件全路径 -- 如果传入目录,会在目录下找dictionary.d文件,如果文件不存在,则报错 select walminer_load_dictionary('$KBDATA/sys_walminer/wm_datadict'); select walminer_load_dictionary('$KBDATA/sys_walminer/wm_datadict/dictionary.d');
-- 解析已加入的所有WAL日志 -- 如果没有添加WAL日志,则解析data/sys_wal目录下所有WAL日志 -- 解析过程中遇到WAL日志错误、或WAL日志不连续,会在错误或不连续的地方停止解析 select walminer_all(); -- 根据时间范围解析 -- 在add的WAL日志中查找对应时间范围的WAL记录 select walminer_by_time(startTime text, endTime text); -- 根据LSN范围解析 -- 在add的WAL日志中查找对应LSN范围的WAL记录 select walminer_by_lsn(startLSN sys_lsn, endLSN sys_lsn);
解析完成后会自动删除生成的中间文件、已添加的WAL日志、已导入的数据字典等。
在时间范围解析中,如果开始时间设置为空,则从已加入的WAL日志列表中第一个日志的第一个LSN开始解析。
在时间范围解析中,如果结束时间设置为空,则在已加入的WAL日志列表中最后一个日志的最后一个LSN结束解析。
解析时,会从给定的范围开始解析,会从找到的第一个checkpoint点开始缓存FPW,所以如果在日志的开始部分没有找到checkpoint,在解析这部分日志时可能会提示警告信息:
Can not find for FPW for relnode 16789, blkno 3, ignore redo.
本示例中的16789表示文件名,3表示数据块号,具体数值视实际应用场景而变化。
精确解析是指WalMiner程序会自动界定需要解析的WAL日志列表,并在给定的解析开始点(开始LSN或开始时间)往前探索一个checkpoint开始点c1,从c1点开始记录FPW,然后就可以完美解析指定的范围(LSN范围或时间范围)。如果在给定的WAL日志列表内没有找到c1点,那么此次解析会报错停止。
-- 根据时间范围解析 -- 在add的WAL日志中查找对应时间范围的WAL记录 -- true/false 代表是否精准解析 select walminer_by_time(startTime text, endTime text, 'true'); -- 根据LSN范围解析 -- 在add的WAL日志中查找对应LSN范围的WAL记录 -- true/false 代表是否精准解析 select walminer_by_lsn(startLSN sys_lsn, endLSN sys_lsn, 'true');
解析完成后会自动删除生成的中间文件、已添加的WAL日志、已导入的数据字典等。
-- 根据时间范围解析 -- 在add的WAL日志中查找对应时间范围的WAL记录 -- true/false 代表是否精准解析 -- reloid 表示需要解析的表OID select walminer_by_time(startTime text, endTime text, 'true', reloid oid); select walminer_by_time(startTime text, endTime text, 'false', reloid oid); -- 根据LSN范围解析 -- 在add的WAL日志中查找对应LSN范围的WAL记录 -- true/false 代表是否精准解析 -- reloid 表示需要解析的表OID select walminer_by_lsn(startLSN sys_lsn, endLSN sys_lsn, 'true', reloid oid); select walminer_by_lsn(startLSN sys_lsn, endLSN sys_lsn, 'false', reloid oid);
解析完成后会自动删除生成的中间文件、已添加的WAL日志、已导入的数据字典等。
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 | pg_lsn | 事务开始的LSN号 |
commit_lsn | pg_lsn | 事务提交时的LSN号 |
-- 会清空解析过程中生成的中间文件 select walminer_stop();