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. DedeCMS V5.7 SP2前台文件上传漏洞(CVE-2018-20129)

    DedeCMS V5.7 SP2前台文件上传漏洞(CVE-2018-20129) 一.漏洞描述 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统.Dedecms V5.7 SP2版本中的 ...

  2. Shell脚本书写规范

    在日常的运维工作中,Shell脚本肯定是必不可少的工作内容.为方便问题排查.脚本执行历史问题追踪.方便大家共同维护,从网上搜罗结合以往的经验教训拟定以下Bash脚本书写规范.欢迎各位同学指正或补充. ...

  3. (十一)c#Winform自定义控件-列表

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  4. (二十七)c#Winform自定义控件-多输入窗体

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  5. lxml解析网页

    目录 1. 什么是lxml 2. 初次使用 3. xpath 3.2 标签定位 3.3 序列定位 3.4 轴定位 4. 实例 1. 什么是lxml lxml是干什么的?简单的说来,lxml是帮助我们解 ...

  6. 学习Vuex 个人的一些拙见。

    首先说下什么是vuex?这个是对vue的状态的管理,这样说可能有点大,其实就是vue 里面 data  的管理,或者说是多个vue 组件共有的data 的一种管理, 在任何一个组件里面,都可以修改,访 ...

  7. html5 placeholder属性兼容ie11

    placeholder 属性是html5的属性,用于提供描述输入字段预期值的提示信息(hint). 简单例子: <!DOCTYPE HTML> <html> <body& ...

  8. 常用linux的命令

    常用但是容易忘记的命令 查看java项目的进程 ps -ef | grep java jps 根据进程查询端口 lsof -i | grep pid netstat -nap | grep pid p ...

  9. jjyq app登录接口报:“内容类型不支持”???已解决

    1.在 app上进行登录操作,成功. 2.通过fiddler抓包得到jjyq登录接口的url.param.header. 3.在pycharm中使用requests发起请求,运行报错:内容类型不支持?

  10. Codeforces 1004D

    题意略. 思路: 有两个点要注意一下: 1.这个菱形矩阵是8对称的,也即可以是沿45°对角线对称. 2.菱形矩阵上的数字表明了这个点到中心0点的距离,这对于确定位置有帮助. 这个题目简直刷新人生观,这 ...