迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:WalMiner开源软件地址:https://gitee.com/movead/XLogMiner开源软件介绍:WalMiner3.0 Dev什么是WalMinerWalMiner是从PostgreSQL的WAL(write ahead logs)日志的解析工具,旨在挖掘wal日志所有的有用信息,从而提供PG的数据恢复支持。目前主要有如下功能:
walminer3.0更新内容
PG版本支持
编译安装编译一:PG源码编译如果你从编译pg数据库开始
编译二:依据PG安装编译如果你使用yum或者pg安装包安装了pg
使用方法-SQL解析场景一:从WAL日志产生的数据库中直接执行解析1. 创建walminer的extensioncreate extension walminer; 2. 添加要解析的wal日志文件-- 添加wal文件:select walminer_wal_add('/opt/test/wal');-- 注:参数可以为目录或者文件 3. Remove wal日志文件-- 移除wal文件:select walminer_wal_remove('/opt/test/wal');-- 注:参数可以为目录或者文件 4. List wal日志文件-- 列出wal文件:select walminer_wal_list(); 5. 执行解析 5.1 普通解析 --解析add的全部wal日志select walminer_all();或 select wal2sql();--在add的wal日志中查找对应时间范围的wal记录--可以参照walminer_time.sql回归测试中的使用用例--时间解析模式的解析结果可能比预期的解析结果要多,详情参照[walminer_decode.c]代码中的注释select walminer_by_time(starttime, endtime);或 select wal2sql(starttime, endtime);--在add的wal日志中查找对应lsn范围的wal记录--可以参照walminer_lsn.sql回归测试中的使用用例select walminer_by_lsn(startlsn, endlsn);或 select wal2sql(startlsn, endlsn);--在add的wal日志中查找对应xid的wal记录--可以参照walminer_xid.sql回归测试中的使用用例--前一个walminer版本对xid的支持是范围解析,但是xid的提交是不连续的--会导致各种问题,所以这个版本只支持单xid解析select walminer_by_xid(xid);或 select wal2sql(xid); 5.2 精确解析 --在add的wal日志中查找对应时间范围的wal记录select walminer_by_time(starttime, endtime,'true'); 或 select wal2sql(starttime, endtime,'true');--在add的wal日志中查找对应lsn范围的wal记录select walminer_by_lsn(startlsn, endlsn,'true'); 或 select wal2sql(startlsn, endlsn,'true');--在add的wal日志中查找对应xid的wal记录select walminer_by_xid(xid,'true'); 或 select wal2sql(xid,'true'); walminer的构建基础是,checkpoint之后对每一个page的更改会产生全页写(FPW),因此一个checkpoint之后的所有wal日志可以完美解析。注意checkpoint是指checkpoint开始的点,而不是checkpoint的wal记录的点,参照说明 普通解析会直接解析给定范围内的wal日志,因为可能没有找到之前的checkpoint点,所以会出现有些记录解析不全导致出现空的解析结果。 精确解析是指walminer程序会界定需要解析的wal范围,并在给定的wal范围之前探索一个checkpoint开始点c1,从c1点开始记录FPI,然后就可以完美解析指定的wal范围。如果在给定的wal段内没有找到c1点,那么此次解析会报错停止。 5.3 单表解析 --在add的wal日志中查找对应时间范围的wal记录select walminer_by_time(starttime, endtime,'false',reloid); 或 select wal2sql(starttime, endtime,'true',reloid);--在add的wal日志中查找对应lsn范围的wal记录select walminer_by_lsn(startlsn, endlsn,'true',reloid); 或 select wal2sql(startlsn, endlsn,'false',reloid);--在add的wal日志中查找对应xid的wal记录select walminer_by_xid(xid,'true',reloid);或 select wal2sql(xid,'true',reloid); 'true'和‘false’代表是否为精确解析模式,reloid为目标表的oid(注意不是relfilenode) 5.4 快捷解析 场景1中的加载数据字典和加载wal日志步骤可以省略,默认直接加载当前数据字典和当前wal路径下的所有wal文件。这个解析模式只在学习本工具时使用,在生产数据库中,可能会因为wal段切换而导致解析失败。 5.5 替身解析 如果一个表被drop或者被truncate等操作,导致新产生的数据字典不包含旧的数据库中所包含的relfilenode,那么使用新的数据字典无法解析出旧的wal日志中包含的的某些内容。在知晓旧表的表结构的前提下,可以使用替身解析模式。替身模式目前只适用于[场景一]。 -- 假设表t1被执行了vacuum full,执行vacuum full前的relfilenode为16384-- 新建表t1的替身表create table t1_avatar(i int);-- 执行替身映射select walminer_table_avatar(avatar_table_name, missed_relfilenode);-- 执行解析select wal2sql();-- 查看解析结果时,会发现,对t1表的数据都以t1_avatar表的形式展现在输出结果中 6. 解析结果查看select * from walminer_contents; -- 表walminer_contents ( sqlno int, --本条sql在其事务内的序号 xid bigint, --事务ID topxid bigint, --如果为子事务,这是是其父事务;否则为0 sqlkind int, --sql类型1->insert;2->update;3->delete(待优化项目) minerd bool, --解析结果是否完整(缺失checkpoint情况下可能无法解析出正确结果) timestamp timestampTz, --这个SQL所在事务提交的时间 op_text text, --sql undo_text text, --undo sql complete bool, --如果为false,说明有可能这个sql所在的事务是不完整解析的 schema text, --目标表所在的模式 relation text, --目标表表名 start_lsn pg_lsn, --这个记录的开始LSN commit_lsn pg_lsn --这个事务的提交LSN)
7. 结束walminer操作该函数作用为释放内存,结束日志分析,该函数没有参数。 select walminer_stop(); 场景二:从非WAL产生的数据库中执行WAL日志解析
于生产数据库1.创建walminer的extensioncreate extension walminer; 2.生成数据字典select walminer_build_dictionary('/opt/proc/store_dictionary');-- 注:参数可以为目录或者文件 于测试数据库1. 创建5walminer的extensioncreate extension walminer; 2. load数据字典select walminer_load_dictionary('/opt/test/store_dictionary');-- 注:参数可以为目录或者文件 3. add wal日志文件-- 增加wal文件:select walminer_wal_add('/opt/test/wal');-- 注:参数可以为目录或者文件 4. remove wal日志文件-- 移除wal文件:select walminer_wal_remove('/opt/test/wal');-- 注:参数可以为目录或者文件 5. list wal日志文件-- 列出wal文件:select walminer_wal_list();-- 注:参数可以为目录或者文件 6. 执行解析同上 7. 解析结果查看select * from walminer_contents; 8.结束walminer操作,该函数作用为释放内存,结束日志分析,该函数没有参数。select walminer_stop();
场景三:自apply解析(开发中的功能,慎用)场景一和场景二中的解析结果是放到结果表中的,场景三可以将解析结果直接apply到解析数据库中。命令执行的流程与场景一和场景二相同。 -- 参数意义参考walminer_by_lsn()接口select walminer_apply(startlsn, endlsn,'true', reloid); 此功能可以处理主备切换延迟数据当主库A发生故障,从库B切换为主库之后。
自apply解析功能说明
场景四:DDL解析系统表变化解析 目前walminer支持解析系统表的变化。也就是说如果在PG执行了DDL语句,walminer可以分析出DDL语句引起的系统表的变化。 -- 在执行解析之前,先执行如下语句,即可开启系统表解析功能select wal2sql_with_catalog(); DDL解析 -- 在执行解析之前,先执行如下语句,即可开启DDL解析功能select wal2sql_with_ddl();
使用限制
使用方法-数据页挽回(坏块修复)1. 环境搭建创建extension,创建数据地点,加载wal日志的方法与[SQL解析]中描述的方法一致。 2. 执行数据挽回select page_collect(relfilenode, reloid, pages) relfilenode:需要解析的wal日志中的relfilenode reloid:解析库中存在的表的OID,此命令将会将从wal中找到的page覆盖到reloid制定的表中 pages:是字符串类型,制定想要挽回的目标page。格式为'0,1,2,7'或者'all'。 具体使用方法可以从pc_base.sql测试用例文件中获取。 此功能持续开发中,后续会添加基于基础备份的数据页挽回 使用限制1.将部分page恢复到其他表后,查询时可能会出现报错的情况。这是因为恢复后的page可能依赖其他page数据,而其依赖的page没有恢复到这个表中。 2.执行此命令后请立即备份,因为此命令对数据的操作不会记录在wal中。 联系我发现bug或者有好的建议可以通过邮箱([email protected])联系我。 ![]() |
请发表评论