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能对大家有用,希望通过分享,共同提高。

MySQL二进制日志挖掘器BinlogMiner 1.0发布了。的更多相关文章

  1. mysql 二进制日志后缀数字最大为多少

    之前看到mysql二进制日志后面会加一个以数字递增为结尾的后缀,一直在想当尾数到达999999后会发生什么情况,先查了一下官网,对后缀有这样一句介绍:The server creates binary ...

  2. MySQL二进制日志总结

    二进制日志简单介绍 MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句.二进制日志(binary log)中记录了对MySQL数据 ...

  3. MySQL二进制日志(binary log)总结

    本文出处:http://www.cnblogs.com/wy123/p/7182356.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  4. MySQL二进制日志功能介绍

    二进制日志记录所有更新数据的SQL语句,其中也包含可能更新数据的SQL语句,例如DELETE语句执行过程中无匹配的行.二进制日志中还包含了与执行SQL语句相关的内容,例如SQL语句执行的时间.错误代码 ...

  5. MySQl Study学习之--MySQl二进制日志管理

    MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log)   a.它包括的内容及作用例如以下:     包括了全部更新了数据或者已经潜在更新了数据(比方没 ...

  6. MySQL二进制日志的备份和恢复

    二进制日志:记录数据库修改的相关操作,作用是即时点回复,主从复制 可以按时间滚动,也可以按大小滚动 server-id:服务器身份标识 一.二进制文件的删除方法,千万不要手动删除 PURGE BINA ...

  7. 删除MySQL二进制日志

    服务器上的120G SSD硬盘空间用了92%,检查后发现,原来是 MySQL的二进制日志没有及时清除,占用了大量的空间, 于是直接用命令:reset master 一把删干净了. 1 reset ma ...

  8. 查看mysql二进制日志报错问题

    在排查网站被黑时想通过Mysql二进制日志找出修改字段时间,但是使用mysqlbinlog报错: [root@zfszsw1 bin]# ./mysqlbinlog /opt/mysql-bin.00 ...

  9. Mysql 二进制日志备份还原

    Mysql 二进制日志备份还原 一.开启二进制日志 1.进入配置文件[mysqld]下添加配置 方案一 vim /etc/my.cnf log-bin = /usr/local/mysql/logs/ ...

随机推荐

  1. java并发编程(十七)----(线程池)java线程池架构和原理

    前面我们简单介绍了线程池的使用,但是对于其如何运行我们还不清楚,Executors为我们提供了简单的线程工厂类,但是我们知道ThreadPoolExecutor是线程池的具体实现类.我们先从他开始分析 ...

  2. Compatibility模式安装windows7后改为AHCI模式无法启动Windows7的解决办法

    在用Compatibility模式安装Windows 7后,再在BIOS中去开启SATA硬盘的AHCI功能的话,就会出现无法启动的情况.只有改回Compatibility模式后,系统才恢复正常.经过试 ...

  3. 2019牛客暑期多校训练营(第十场)F-Popping Balloons

    >传送门< 题意:现在给你n个点 ,让你横着划三条线间距为r 然后竖着划三条线间距同样为r ,求经过最多的点数 思路:比赛看到这题的时候觉得能做,但是一看时间限制是5s,搞得我有不敢去碰了 ...

  4. print,cat打印格式及字符串引号格式,去掉字符串空格 in R

    print 函数的打印格式: ##no quote print out > x <- letters[1:5] > print(x,quote=F,);print(x,quote=T ...

  5. 表结构查询 Sql

    select row_number() over(order by a.column_id) rownumber, a.name, case ),a.),a.scale) +')' ),a.max_l ...

  6. python使用zabbix的API接口

    一.实验环境 python3.6.6 zabbix 3.0.9 二.实验目的 了解Zabbix的API接口格式 通过python实现登陆zabbix服务,获得登陆token 通过python检索zab ...

  7. iView表格行验证问题

    iView Table 3.2.0 版本 需求: 验证前两行的姓名不能为空: 解决方案: 判断是否前两行,如是则增加校验规则: 需在<FormItem>前加<Form>标签否则 ...

  8. 『深度应用』NLP机器翻译深度学习实战课程·壹(RNN base)

    深度学习用的有一年多了,最近开始NLP自然处理方面的研发.刚好趁着这个机会写一系列NLP机器翻译深度学习实战课程. 本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:(更新 ...

  9. xss实体绕过示例

    知识点: 倘若是在script.input标签当中,即可突破. Payload ' oninput=alert`1` // 当要在input中输入内容时触发事件 ' oninput=alert`1` ...

  10. Java中不得不谈的值传递和地址传递

    个人的一些认识,希望能对初学Java的你,或者困惑于方法参数传递的你祈祷一丝帮助! 下面是一些作者的个人观点,如果有错,欢迎各位大牛指出错误,灰常感谢您的观看与支持... -------------- ...