介绍一个自己开发的MySQL二进制日志挖掘器 - BinlogMiner

MySQL从2014年开始超越SQL Server, 占据DB-Engines数据库流行度排行榜第二名, 是一种非常流行的关系型数据库, 特别是在互联网领域, 是一种应该掌握的数据库系统。最近在学MySQL的二进制日志时, 顺手写了个"月光宝盒", 不对…是"BinlogMiner"。

BinlogMiner基于Java语言开发,提供了一套可用于MySQL二进制文件分析的API和基于这些API实现的二进制日志挖掘器。通过BinlogMiner的挖掘器, 可以实现数据库的重做/回滚(闪回)。虽然是边学边做,但整体的完成度还是很高的,花了不少时间精力。目前,BinlogMiner托管在github上,作为一个的开源项目(基于Apache License 2.0),准备持续维护下去,希望能在大家的使用和反馈过程中不断完善。

项目地址: https://github.com/Li-Xiang/BinlogMiner

BinlogMiner可以通过对二进制日志的分析,恢复被误修改数据(包括:delete/update/insert)。MySQL从3.23版本开始引入二进制日志用于数据复制,主要包括Statement/Statement/MIX这三种模式:

  • Statement格式记录的是SQL语句(记录在Query-Event);
  • Row格式记录的是行的实际变化(记录在Rows-Event);
  • MIX格式则是由MySQL自己决定用什么事件来记录DML变化;

所有的DDL语句都是记录在(Query-Event)中,只有ROW模式的二进制日志才能获取UNDO语句(不存在的东西,也没法挖掘出来)。实际来说大部分MySQL复制环境开的也是ROW模式,也就是将binlog_format设置为 ‘ROW’; 只有ROW模式的二进制的数据复制才是安全的(不丢数据的), 因为有些MySQL的函数, 在不同的环境或者条件下刻执行, 得到的结果可能是不同的(如USER()/UUID()/LIMIT等), 这不能保证这些语句的正确复制, 具体可以参考一个不错的文章:
https://www.databasejournal.com/features/mysql/article.php/3922266/Comparing-MySQL-Statement-Based-and-Row-Based-Replication.htm

BinlogMiner专注于误操作的快速恢复, BinlogMiner基于Java的NIO,有很高的分析效率;BinlogMiner可以将挖掘到的数据输出到指定的数据库表中, 这使得你可以通过SQL查询语句和过滤条件快速的获取你需要的数据。

BinlogMiner支持两种运行方式:命令行和参数文件模式。命令行模式只支持简单功能,主要是需要的参数太多,又不想引入第三方的命令行解析库。BinlogMiner还支持离线挖掘, 支持输出到多种数据库表中(SQLite/Derby/Oracle/MySQL), 具体的用法可以参考README.zh.md。

BinlogMiner支持广泛的硬件平台和MySQL版本, 支持MySQL 3.9到8.0, 支持little-endian和big-endian平台, 支持多种语言编码, 包括UTF8, GBK, gb2312, ucs2, 支持更多字符集的扩展。

通过解析MySQL的二进制日志还可以异构数据的复制,也就是将挖掘到的REDO数据放到其他类型的数据库执行,我在org.littlestar.mysql.binlog.demo.Demo3中做了个从MySQL到Oracle数据库复制的简单实现,只用了简单的几十有效代码。但实际能做到通用,还需要很大的代码量,主要难点是不同数据库间SQL语句的转换,不同的数据库平台的SQL语法还是有很大的差别,就如插入一个日期类型,MySQL使用的是’1996-01-30 00:00:00’, 而在Oracle是会报错的’ORA-01861’, 需要用to_date(…)。

不同的数据库支持的标准不同, 如很一些数据库支持SQL 2008标准, MySQL只支持到SQL 89以及SQL92的一部分, SQL OLAP 2003基本不支持。如, 比对数据过程中发现MySQL不支持minus集合操作, 只支持union, 需要使用外连接来等效转换, 如, 如SQLite不支持truncate操作,… DDL的差别就更大了。

在编写BinlogMiner过程中, 有许多收获, 以前都不懂还有个markdown, 在MySQL的二进制日志解析方面也有不少收获, 将来会在后续的博文中分享出来,总之希望BinlogMiner能对大家有用,希望通过分享,共同提高。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值