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/ ...
随机推荐
- Mac OS 上的一些骚操作
本帖记录个人在使用 Mac 操作系统上的一些骚操作,不断更新,以飨读者. 快速移动网页到顶部或底部 用双指上下划触摸板吗?NO,我们有更骚的操作: command + ↑ 回到顶部 command + ...
- react-native 入门基础介绍
目录 安装 项目 主要目录结构 入口 Home模块 Coobook模块 List模块 novel模块 相关参考 一个简单的demo,用于介绍react-native相关基础信息,主要是针对有兴趣的同学 ...
- (三十三)c#Winform自定义控件-日期控件
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- python小白手册之远程链接转换
访问顺序补充
- Sqlserver 使用.net查询被事务锁住处理
在有些应用场景中.事务开了后或能需要再去调用某个DAL读取表中的数据.但DAL里又是新开的链接,由于外面有事务所以这里读的时候就读不到.这种情况下可以在这个DAL的查询里开一个新的事务级别设为允许脏读 ...
- net core Webapi基础工程搭建(二)——创建工程
目录 前言 创建工程 工程文件概述(个人理解) 运行 小结 前言 前面介绍了开发工具及net core版本,后端工程的框架结构开发工具及环境,因为是基础工程,所以没考虑太复杂的框架,如果有架构师请勿喷 ...
- NOIP前的模板复习和注意事项
联赛除去今天刚好只有一个星期了,最后一个星期也很关键,要吃好睡好保持心情愉悦.当然也免不了最后的复习计划. 首先是模板,之前还有很多模板没有复习到,这些东西是一定要落实到位的. 每天往后面写一点... ...
- MySQL-InnoDB锁(二)
上篇文章中对InnoDB存储引擎中的锁进行学习,本文是实践部分,根据索引和查询范围,探究加锁范围的情况. 在本实例中,创建简单表如下: mysql> select * from t; +---- ...
- rabbitmq集群操作与启停
一.rabbitmq集群必要条件 1.1. 绑定实体ip,即ifconfig所能查询到的绑定到网卡上的ip,以下是绑定方法 1.2. 配置域名映射到实体ip 二.启动停止 2.1 停止 2.2 启动 ...
- Visual Studio 中 Build、Rebuild 、 Clean 之间的区别是什么?
今天翻看c-sharpcorner技术网站看到了这样一篇小记,标题为:What Is The Difference Between Build, Rebuild And Clean In Visual ...