5.1 介绍
XLogMiner 是从 PostgreSQL 的 WAL(write ahead logs) 日志中解析出执行的 SQL 语句的工具,并能生成出对应的 undo SQL 语句。
5.2 配置要求
需要将数据库日志级别配置为logical模式, 并将表设置为full模式。例如,下面的语句将表t1设置为full模式:
alter table t1 replica identity FULL;
复制
PG版本支持
目前主要是在PostgreSQL 9.5.x上开发测试的,在9.6版本中仅做过简单验证,如果使用过程中发现问题欢迎向我们反馈。
5.3 编译安装
- 将xlogminer目录放置到编译通过的PG工程的"…/contrib/"目录下
- 进入xlogminer目录
- 执行命令
make && make install
复制
5.4 使用方法
场景一:从WAL日志产生的数据库中直接执行解析
1. 创建xlogminer的extension
create extension xlogminer;
复制
2. Add xlog日志文件
-- 增加wal文件: select xlogminer_xlogfile_add('/opt/test/wal'); -- 注:参数可以为目录或者文件
复制
3. Remove xlog日志文件
-- 移除wal文件: select xlogminer_xlogfile_remove('/opt/test/wal'); -- 注:参数可以为目录或者文件
复制
4. List xlog日志文件
-- 列出wal文件: select xlogminer_xlogfile_list();
复制
5. 执行解析
select xlogminer_start(’START_TIMSTAMP’,’STOP_TIMESTAMP’,’START_XID’,’STOP_XID’) ---如果分析全部日志: select xlogminer_start('null','null',0,0);
复制
- START_TIMESTAMP:指定输出结果中最早的记录条目,即从该时间开始输出分析数据;若该参数值为空,则以分析日志列表中最早数据开始输出;若该参数值指定时间没有包含在所分析xlog列表中,即通过分析发现全部早于该参数指定时间,则返回空值。
- STOP_TIMESTAMP:指定数据结果中最晚的记录条目,即输出结果如果大于该时间,则停止分析,不需要继续输出;如果该参数值为空,则从START_TIMESTAMP开始的所有日志都进行分析和输出。
- START_XID:作用与START_TIMESTAMP相同,指定开始的XID值;
- STOP_XID:作用与STOP_TIMESTAMP相同,指定结束的XID值
两组参数只能有一组为有效输入,否则报错。
6. 解析结果查看
select * from xlogminer_contents;
复制
7. 结束xlogminer操作
该函数作用为释放内存,结束日志分析,该函数没有参数。
select xlogminer_stop();
复制
场景二:从非WAL产生的数据库中执行WAL日志解析
要求执行解析的PostgreSQL数据库和被解析的为同一版本
于生产数据库
1.创建xlogminer的extension
create extension xlogminer;
复制
2.生成数据字典
select xlogminer_build_dictionary('/opt/proc/store_dictionary'); -- 注:参数可以为目录或者文件
复制
于测试数据库
1. 创建xlogminer的extension
create extension xlogminer;
复制
2. load数据字典
select xlogminer_load_dictionary('/opt/test/store_dictionary'); -- 注:参数可以为目录或者文件
复制
3. add xlog日志文件
-- 增加wal文件: select xlogminer_xlogfile_add('/opt/test/wal'); -- 注:参数可以为目录或者文件
复制
4. remove xlog日志文件
-- 移除wal文件: select xlogminer_xlogfile_remove('/opt/test/wal'); -- 注:参数可以为目录或者文件
复制
5. list xlog日志文件
-- 列出wal文件: select xlogminer_xlogfile_list(); -- 注:参数可以为目录或者文件
复制
6. 执行解析
select xlogminer_start(’START_TIMSTAMP’,’STOP_TIMESTAMP’,’START_XID’,’STOP_XID’)
复制
- START_TIMESTAMP:指定输出结果中最早的记录条目,即从该时间开始输出分析数据;若该参数值为空,则以分析日志列表中最早数据开始输出;若该参数值指定时间没有包含在所分析xlog列表中,即通过分析发现全部早于该参数指定时间,则返回空值。
- STOP_TIMESTAMP:指定数据结果中最晚的记录条目,即输出结果如果大于该时间,则停止分析,不需要继续输出;如果该参数值为空,则从START_TIMESTAMP开始的所有日志都进行分析和输出。
- START_XID:作用与START_TIMESTAMP相同,指定开始的XID值;
- STOP_XID:作用与STOP_TIMESTAMP相同,指定结束的XID值 两组参数只能有一组为有效输入,否则报错。
7. 解析结果查看
select * from xlogminer_contents;
复制
8.结束xlogminer操作,该函数作用为释放内存,结束日志分析,该函数没有参数。
select xlogminer_stop();
复制
注意:xlogminer_contents是xlogminer自动生成的临时表,因此当session断开再重新进入或其他session中解析数据不可见。这么做主要是基于安全考虑。 如果希望保留解析结果,可利用create xxx as select * from xlogminer_contents;写入普通表中。
5.5 使用限制
- 本版本只解析DML语句,不处理DDL语句
- 执行了删除表、truncate表、更改表的表空间、更改表字段的类型,这样的DDL语句后,发生DDL语句之前的此表相关的DML语句不会再被解析。
- 解析结果依赖于最新的数据字典。(举例:创建表t1,所有者为user1,但是中间将所有者改为user2。那解析结果中,所有t1相关操作所有者都将标示为user2)
- wal日志如果发生缺失,在缺失的wal日志中发生提交的数据,都不会在解析结果中出现
- 解析结果中undo字段的ctid属性是发生变更“当时”的值,如果因为vacuum等操作导致ctid发生变更,这个值将不准确。对于有可能存在重复行的数据,我们需要通过这个值确定undo对应的tuple条数,不代表可以直接执行该undo语句。
- 若没有将表设置为full模式,那么update、delete语句将无法被解析。(当然这很影响使用,下一版本就会对这个问题作出改进)
- 若没有将数据库日志级别设置为logical,解析结果会有无法预料的语句丢失
- 执行了表字段drop的DDL语句后,发生DDL语句之前的这个字段相关的值都会被解析为encode(‘AD976BC56F’,hex)的形式,另外自定义类型也会解析为这种形式
- 只能解析与数据字典时间线一致的xlog文件
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
外国CTO也感兴趣的开源数据库项目——openHalo
小满未满、
1273次阅读
2025-04-21 16:58:09
9.9 分高危漏洞,尽快升级到 pgAdmin 4 v9.2 进行修复
严少安
382次阅读
2025-04-11 10:43:23
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
367次阅读
2025-04-15 14:48:05
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
358次阅读
2025-04-07 12:14:29
转发有奖 | PostgreSQL 16 PGCM高级认证课程直播班招生中!
墨天轮小教习
173次阅读
2025-04-14 15:58:34
SQL 优化之 OR 子句改写
xiongcc
124次阅读
2025-04-21 00:08:06
中国PostgreSQL培训认证体系新增PGAI应用工程师方向
开源软件联盟PostgreSQL分会
110次阅读
2025-05-06 10:21:13
融合Redis缓存的PostgreSQL高可用架构
梧桐
109次阅读
2025-04-08 06:35:40
PostgreSQL拓展PGQ实现解析
chirpyli
107次阅读
2025-04-07 11:23:17
告别老旧mysql_fdw,升级正当时
NickYoung
96次阅读
2025-04-29 11:15:18
TA的专栏
热门文章
PostgreSQL 12.8 详解命令pg_rewind
2021-10-29 7157浏览
[译] Postgresql 清理更新频繁的表
2022-04-12 6405浏览
patroni 报错问题处理:CRITICAL: system ID mismatch, node pgsql_node1 belongs to a different cluster: 7052280560147471869 != 7052284163
2022-01-12 5253浏览
patroni 服务启报错:patroni.exceptions.PatroniFatalException
2022-01-10 4986浏览
数据库短连接风暴触发oracle bug 32164034
2021-11-18 4726浏览
目录