MySQL二进制日志挖掘器BinlogMiner 1.0发布了。
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发布了。的更多相关文章
- mysql 二进制日志后缀数字最大为多少
之前看到mysql二进制日志后面会加一个以数字递增为结尾的后缀,一直在想当尾数到达999999后会发生什么情况,先查了一下官网,对后缀有这样一句介绍:The server creates binary ...
- MySQL二进制日志总结
二进制日志简单介绍 MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句.二进制日志(binary log)中记录了对MySQL数据 ...
- MySQL二进制日志(binary log)总结
本文出处:http://www.cnblogs.com/wy123/p/7182356.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- MySQL二进制日志功能介绍
二进制日志记录所有更新数据的SQL语句,其中也包含可能更新数据的SQL语句,例如DELETE语句执行过程中无匹配的行.二进制日志中还包含了与执行SQL语句相关的内容,例如SQL语句执行的时间.错误代码 ...
- MySQl Study学习之--MySQl二进制日志管理
MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log) a.它包括的内容及作用例如以下: 包括了全部更新了数据或者已经潜在更新了数据(比方没 ...
- MySQL二进制日志的备份和恢复
二进制日志:记录数据库修改的相关操作,作用是即时点回复,主从复制 可以按时间滚动,也可以按大小滚动 server-id:服务器身份标识 一.二进制文件的删除方法,千万不要手动删除 PURGE BINA ...
- 删除MySQL二进制日志
服务器上的120G SSD硬盘空间用了92%,检查后发现,原来是 MySQL的二进制日志没有及时清除,占用了大量的空间, 于是直接用命令:reset master 一把删干净了. 1 reset ma ...
- 查看mysql二进制日志报错问题
在排查网站被黑时想通过Mysql二进制日志找出修改字段时间,但是使用mysqlbinlog报错: [root@zfszsw1 bin]# ./mysqlbinlog /opt/mysql-bin.00 ...
- Mysql 二进制日志备份还原
Mysql 二进制日志备份还原 一.开启二进制日志 1.进入配置文件[mysqld]下添加配置 方案一 vim /etc/my.cnf log-bin = /usr/local/mysql/logs/ ...
随机推荐
- DedeCMS V5.7 SP2前台文件上传漏洞(CVE-2018-20129)
DedeCMS V5.7 SP2前台文件上传漏洞(CVE-2018-20129) 一.漏洞描述 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统.Dedecms V5.7 SP2版本中的 ...
- Shell脚本书写规范
在日常的运维工作中,Shell脚本肯定是必不可少的工作内容.为方便问题排查.脚本执行历史问题追踪.方便大家共同维护,从网上搜罗结合以往的经验教训拟定以下Bash脚本书写规范.欢迎各位同学指正或补充. ...
- (十一)c#Winform自定义控件-列表
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (二十七)c#Winform自定义控件-多输入窗体
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- lxml解析网页
目录 1. 什么是lxml 2. 初次使用 3. xpath 3.2 标签定位 3.3 序列定位 3.4 轴定位 4. 实例 1. 什么是lxml lxml是干什么的?简单的说来,lxml是帮助我们解 ...
- 学习Vuex 个人的一些拙见。
首先说下什么是vuex?这个是对vue的状态的管理,这样说可能有点大,其实就是vue 里面 data 的管理,或者说是多个vue 组件共有的data 的一种管理, 在任何一个组件里面,都可以修改,访 ...
- html5 placeholder属性兼容ie11
placeholder 属性是html5的属性,用于提供描述输入字段预期值的提示信息(hint). 简单例子: <!DOCTYPE HTML> <html> <body& ...
- 常用linux的命令
常用但是容易忘记的命令 查看java项目的进程 ps -ef | grep java jps 根据进程查询端口 lsof -i | grep pid netstat -nap | grep pid p ...
- jjyq app登录接口报:“内容类型不支持”???已解决
1.在 app上进行登录操作,成功. 2.通过fiddler抓包得到jjyq登录接口的url.param.header. 3.在pycharm中使用requests发起请求,运行报错:内容类型不支持?
- Codeforces 1004D
题意略. 思路: 有两个点要注意一下: 1.这个菱形矩阵是8对称的,也即可以是沿45°对角线对称. 2.菱形矩阵上的数字表明了这个点到中心0点的距离,这对于确定位置有帮助. 这个题目简直刷新人生观,这 ...