XLogMiner

SQL 语法解析工具
授权协议 MIT
开发语言 C/C++
所属分类 开发工具、 语法解析工具
软件类型 开源软件
地区 国产
投 递 者 轩辕涵亮
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

XLogMiner 是从 PostgreSQL 的 WAL(write ahead logs) 日志中解析出执行的 SQL 语句的工具,并能生成出对应的 undo SQL 语句。

配置要求

需要将数据库日志级别配置为 logical 模式, 并将表设置为 full 模式。例如,下面的语句将表 t1 设置为 full 模式:

alter table t1 replica identity FULL;

PG版本支持

目前主要是在 PostgreSQL 9.5.x 上开发测试的,在 9.6 版本中仅做过简单验证。

编译安装

1.将 xlogminer 目录放置到编译通过的 PG 工程的 "../contrib/" 目录下

2.进入 xlogminer 目录

3.执行命令

make && make install


使用方法

从 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();

使用限制

  • 本版本只解析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文件

  • 开启数据库归档模式并设置归档路径 wal_level = logical   --注:此处设置为archive将无法完整挖掘操作记录,需设置为logical archive_mode = on archive_directory ='/home/lirui/arch'   create table test (id int,namevarchar(2)); insert into test val

  • os: ubuntu 16.04 db: postgresql 10.6 该 blog 是 http://postgres.cn/v2/news/viewone/1/417 的实践记录.读者可以看 https://gitee.com/movead/XLogMiner 的说明.翰高公司在postgresql上还有有相当实力的. XlogMiner 是从PostgreSQL的WAL(write ahe

  • 1、测试数据库版本 highgo=# select kernel_version();                               kernel_version ---------------------------------------------------------------------------  HighGo Database V4.1 Enterprise Ed

  • 本篇博客源自PostgreSQL中文社区李传成大神的博文,链接:http://www.postgres.cn/news/viewone/1/417 作者在此基础上做了案例模拟和参数讲解。 一、XLOGminer/WalMiner介绍 1、简单介绍 WalMiner是从PostgreSQL的WAL(write ahead logs)日志中解析出执行的SQL语句的工具,并能生成出对应的undo SQL

 相关资料
  • 词法解析、语法解析 这一节我们分析下PHP的解析阶段,即 PHP代码->抽象语法树(AST) 的过程。 PHP使用re2c、bison完成这个阶段的工作: re2c: 词法分析器,将输入分割为一个个有意义的词块,称为token bison: 语法分析器,确定词法分析器分割出的token是如何彼此关联的 例如: $a = 2 + 3; 词法分析器将上面的语句分解为这些token:$a、=、2、+、3

  • 我对ANTLR相对来说是新的,所以请原谅我。 但是当我试图解析下面的表达式时 我最终出现以下错误: 第1:38行:'''处的令牌识别错误 第1:42行:'''处的令牌识别错误 规则r没有方法或者它有参数 规则'r'的意思是什么?我怎么能理解问题的原因呢?任何帮助都将不胜感激!

  • 问题内容: 我想要一个类属性,该表达式允许在等号的右侧进行表达式。所有版本的PHP都会阻塞以下代码,但是这种编写方式是为了将来更容易扩展。 对我来说,这似乎是非常基本的语法,并且为什么PHP不允许这样的事情是不可理解的。谁能想到可以保持以下代码的可读性和将来可扩展性的解决方法? 问题答案: 在PHP中声明类常量或属性时,只能为默认值指定原始值。因此,例如,该类声明将不起作用: 但是该类声明将: 这

  • 问题内容: 有人可以告诉我如何在Python中解析法语日期吗?抱歉,问题是重复的,但我找不到。 这是我尝试使用解析器的内容: 编辑:添加一些上下文: 我正在解析日期,而不事先知道我的字符串格式。这个想法是在飞行中解析许多日期: 使用另一个库进行编辑: 使用parsedatime库和一些正则表达式来翻译法语单词,我可以得到: 也许我应该将其推广到整个法国月份? 问题答案: 模块可以解析问题中的日期:

  • 本文向大家介绍Java try-with-resource语法使用解析,包括了Java try-with-resource语法使用解析的使用技巧和注意事项,需要的朋友参考一下 背景 众所周知,所有被打开的系统资源,比如流、文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重大的生产事故。 在Java的江湖中,存在着一种名为finally的功夫,它可以保证

  • 问题内容: 我在SQL Server 2005中收到以下错误消息 消息120,级别15,状态1,过程usp_AttributeActivitiesForDateRange,行18。INSERT语句的选择列表包含的项目少于插入列表。SELECT值的数量必须与INSERT列的数量匹配。 我已经复制并粘贴了选择列表,然后将列表插入到excel中,并验证了每个列表中有相同数量的项目。这两个表的附加主键字段

  • 顾名思义,一个命令式语言是由一个个“命令”为单元组成,不过一般很少用命令这个词,而是细分一下,比较低级的语言用指令(instruction),高低的语言一般认为是一个语句(statement,以后简称stmt),词法分析只将一段高级语言代码分解成一个个词,接下来还要做语句层面的分析,最终目标是生成抽象语法树(ast) 代码: a = 1; s = 0; while (a <= 100)

  • 这是我第一次使用Android Studio,我收到错误 “无法解析符号AppCompat活动”和其他符号错误。 我如何解决它?我试过给gradle添加一些东西,但没有效果。还尝试了“使缓存失效/重新启动”,但也没有成功。 这是gradle文件中的依赖项