首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >解析MySQL Binlog的利器:my2sql 使用指南

解析MySQL Binlog的利器:my2sql 使用指南

作者头像
俊才
发布2026-01-27 14:48:20
发布2026-01-27 14:48:20
1780
举报
文章被收录于专栏:数据库干货铺数据库干货铺

本文首发于「数据库干货铺」公众号,转载请联系授权

在 MySQL 运维和数据恢复场景中,二进制日志(binlog)是不可或缺的核心组件。当发生误操作、需要审计变更或进行数据回溯时,如何高效、准确地从 binlog 中提取出可读的 SQL 语句,成为 DBA 和开发人员关注的重点。

目前社区中有多种工具可用于解析 binlog,其中 my2sql 是近年来广受关注的一款开源工具。它由国内开发者使用 Go 语言编写,具备高性能、功能丰富、部署简单等特点。本文将详细介绍 my2sql 的使用方法,并简要说明其与同类工具(如 binlog2sql)在技术特性上的差异,帮助大家根据实际需求选择合适的方案。

一、my2sql 是什么?如何安装?

my2sql 是一个用于解析 MySQL ROW 格式 binlog 的命令行工具。它可以将 binlog 中的事件还原为原始的 DML(INSERT/UPDATE/DELETE)或 DDL(CREATE/ALTER/DROP)语句,同时也支持生成对应的回滚 SQL(Flashback),适用于数据恢复、变更审计、同步校验等场景。

主要特点包括:

  • 支持按时间、binlog 文件、数据库、表名等多维度过滤
  • 可输出原始 SQL 或回滚 SQL
  • 支持 GTID 模式下的事务定位
  • 同时解析 DML 与 DDL 语句
  • 无需依赖外部运行环境,提供静态编译的二进制文件
  • 开源免费,项目持续维护中

1. 使用前提

在使用 my2sql 前,请确保满足以下条件:

  • MySQL 已开启 binlog,且格式为ROW:
代码语言:javascript
复制
[mysqld]
log-bin = mysql-bin
binlog_format = ROW
binlog_row_image=full
server-id = 1
  • 连接账号具备必要权限:
代码语言:javascript
复制
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'user'@'%';

获取目标 binlog 文件路径或名称(可通过 SHOW BINARY LOGS; 查看)

2. 安装方式

  • 方式一:源码编译安装

1) 安装Go环境:

代码语言:javascript
复制
yum install -y epel-release
yum install -y go git

安装完成后验证

代码语言:javascript
复制
# go version
go version go1.20.12 linux/amd64

2) 拉取源码:

执行git clone https://github.com/liuhr/my2sql.git命令克隆源码仓库至本地。

代码语言:javascript
复制
# git clone https://github.com/liuhr/my2sql.git
Cloning into 'my2sql'...
remote: Enumerating objects: 738, done.
remote: Counting objects: 100% (189/189), done.
remote: Compressing objects: 100% (57/57), done.
remote: Total 738 (delta 149), reused 132 (delta 132), pack-reused 549 (from 1)
Receiving objects: 100% (738/738), 25.97 MiB | 10.10 MiB/s, done.
Resolving deltas: 100% (344/344), done.

3) 编译生成可执行文件:

进入源码目录并执行编译命令

代码语言:javascript
复制
cd my2sql && go build -o my2sql

4) 编译完成后,目录下将生成my2sql二进制文件,可以验证一下是否有效

代码语言:javascript
复制
./my2sql  -V
  • 方式二:二进制包安装

从GitHub Releases页面下载对应系统的二进制包,下载地址:https://github.com/liuhr/my2sql/blob/master/releases,目前有编译好的centos7的二进制包,下载后,赋予可执行权限,例如:

代码语言:javascript
复制
[root@vbox ~]# wget https://github.com/liuhr/my2sql/blob/master/releases/centOS_release_7.x/my2sql
--2026-01-23 01:44:28--  https://github.com/liuhr/my2sql/blob/master/releases/centOS_release_7.x/my2sql
Resolving github.com (github.com)... 20.205.243.166
Connecting to github.com (github.com)|20.205.243.166|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘my2sql’

    [  <=>                                                                                                                                                                                                                                ] 184,744      765KB/s   in 0.2s   

2026-01-23 01:44:30 (765 KB/s) - ‘my2sql’ saved [184744]

[root@vbox ~]# ll -h 
total 192K
-rw-------. 1 root root 1.3K Jan 13 20:25 anaconda-ks.cfg
-rw-r--r--  1 root root  943 Jan 22 01:43 deadlock.sh
-rw-r--r--  1 root root 181K Jan 23 01:44 my2sql
[root@vbox ~]# chmod +x my2sql 
[root@vbox ~]# ll -h 
total 192K
-rw-------. 1 root root 1.3K Jan 13 20:25 anaconda-ks.cfg
-rw-r--r--  1 root root  943 Jan 22 01:43 deadlock.sh
-rwxr-xr-x  1 root root 181K Jan 23 01:44 my2sql
[root@vbox ~]# 

执行./my2sql -v命令,若终端输出版本信息,说明安装成功。(我测了一下当前的在centos7.9上运行异常,因此大家可以优先考虑编译安装的版本)

二、 如何使用my2sql

my2sql的核心功能通过命令行参数组合实现,语法结构如下:

代码语言:javascript
复制
./my2sql \
  -host <MySQL地址> \
  -port <端口> \
  -user <用户名> \
  -password <密码> \
  -start-file <起始binlog文件> \
  [其他选项]

重要参数说明如下:

代码语言:javascript
复制
MySQL 主机地址(默认 127.0.0.1)

三、 实战场景应用示例

场景1:解析指定时间范围binlog,生成执行SQL

代码语言:javascript
复制
[root@vbox my2sql]#  ./my2sql -host 127.0.0.1 -port 3306 -user test -password 123456  \
 -start-file mysql-bin.000001   \
 -start-datetime "2026-01-01 10:00:00" \
 -stop-datetime "2026-02-01 11:00:00"   \
 -databases testdb   -work-type 2sql   \
 -output-dir ./

内容如下:

场景2:解析指定时间范围binlog,生成回滚SQL

代码语言:javascript
复制
[root@vbox my2sql]#  ./my2sql -host 127.0.0.1 -port 3306 -user test -password 123456   -start-file mysql-bin.000001   -start-datetime "2026-01-01 10:00:00" -stop-datetime "2026-02-01 11:00:00"   -databases testdb   -work-type rollback   -output-dir ./
[2026/01/23 03:02:44] [info] binlogsyncer.go:164 create BinlogSyncer with config {1113306 mysql 127.0.0.1 3306 test   utf8 false false <nil> false Local false 0 0s 0s 0 false false 0 <nil> 0xc0001a8000 0x635100}
[2026/01/23 03:02:44] [info] binlogsyncer.go:400 begin to sync binlog from position (mysql-bin.000001, 4)
[2026/01/23 03:02:44] [info] events.go:61 start thread 1 to generate redo/rollback sql
[2026/01/23 03:02:44] [info] events.go:61 start thread 2 to generate redo/rollback sql
[2026/01/23 03:02:44] [info] events.go:221 start thread to write redo/rollback sql into file
[2026/01/23 03:02:44] [info] stats_process.go:166 start thread to analyze statistics from binlog
[2026/01/23 03:02:44] [info] repl.go:16 start to get binlog from mysql
[2026/01/23 03:02:44] [info] binlogsyncer.go:816 rotate to (mysql-bin.000001, 4)
[2026/01/23 03:02:44] [info] binlogsyncer.go:816 rotate to (mysql-bin.000002, 4)
[2026/01/23 03:02:44] [info] binlogsyncer.go:816 rotate to (mysql-bin.000003, 4)
[2026/01/23 03:02:44] [info] binlogsyncer.go:816 rotate to (mysql-bin.000004, 4)
[2026/01/23 03:02:44] [info] binlogsyncer.go:816 rotate to (mysql-bin.000005, 4)
[2026/01/23 03:02:44] [info] binlogsyncer.go:816 rotate to (mysql-bin.000006, 4)
[2026/01/23 03:02:44] [info] binlogsyncer.go:816 rotate to (mysql-bin.000007, 4)
[2026/01/23 03:02:44] [info] binlogsyncer.go:816 rotate to (mysql-bin.000008, 4)
[2026/01/23 03:02:44] [info] binlogsyncer.go:816 rotate to (mysql-bin.000009, 4)
[2026/01/23 03:02:44] [info] binlogsyncer.go:816 rotate to (mysql-bin.000010, 4)
[2026/01/23 03:02:44] [info] binlogsyncer.go:816 rotate to (mysql-bin.000011, 4)
[2026/01/23 03:02:49] [info] repl.go:84 deadline exceeded.
[2026/01/23 03:02:49] [info] repl.go:18 finish getting binlog from mysql
[2026/01/23 03:02:49] [info] events.go:196 exit thread 1 to generate redo/rollback sql
[2026/01/23 03:02:49] [info] stats_process.go:266 exit thread to analyze statistics from binlog
[2026/01/23 03:02:49] [info] events.go:196 exit thread 2 to generate redo/rollback sql
[2026/01/23 03:02:49] [info] events.go:270 finish writing rollback sql into tmp files, start to revert content order of tmp files
[2026/01/23 03:02:49] [info] rollback_process.go:15 start thread 1 to revert rollback sql files
[2026/01/23 03:02:49] [info] rollback_process.go:41 start to revert tmp file .rollback.8.sql into rollback.8.sql
[2026/01/23 03:02:49] [info] rollback_process.go:156 finish reverting tmp file .rollback.8.sql into rollback.8.sql
[2026/01/23 03:02:49] [info] rollback_process.go:25 exit thread 1 to revert rollback sql files
[2026/01/23 03:02:49] [info] events.go:283 finish reverting content order of tmp files
[2026/01/23 03:02:49] [info] events.go:288 exit thread to write redo/rollback sql into file

会生成一个回滚文件

内容如下,逆向的结果:

其他场景可以参考官方案例进行试用

https://github.com/liuhr/my2sql?tab=readme-ov-file

四、工具对比

在社区中,binlog2sql 是较早被广泛使用的 binlog 解析工具。两者在设计目标上有相似之处,但在实现细节和能力覆盖上存在差异:

对比维度

my2sql

binlog2sql

开发语言

Go语言,编译型,性能优异

Python,解释型,性能一般

解析速度

较快,支持10GB及以上大binlog分批解析,内存占用低

较慢,处理大binlog时易出现卡顿、内存溢出问题,需手动拆分文件

核心功能

支持SQL/JSON/CSV格式解析、回滚SQL生成、主从延迟分析、大事务识别

支持SQL解析、回滚SQL生成,功能较为基础

兼容性

支持MySQL 5.6~8.0+版本,适配TiDB等国产数据库

支持MySQL 5.6~5.7版本,对8.0+新版本特性适配滞后

上手难度

中等,二进制包可直接部署使用,参数丰富需掌握核心用法

较低,基于Python脚本开发,参数简洁,适合新手入门

依赖环境

二进制包无额外依赖,源码编译需Go环境

需依赖Python 2.7+环境,同时需安装pymysql等依赖库

适用场景

生产环境、大binlog解析、主从架构优化、复杂业务审计

测试环境、小体量binlog解析、简单数据恢复场景

五、结语

my2sql 作为一款现代、轻量、功能完整的 binlog 解析工具,正在被越来越多的团队采纳。它不仅提升了数据恢复的效率,也为变更审计和故障排查提供了可靠支持。

无论你是 DBA、运维工程师,还是后端开发,掌握这类工具都能在关键时刻“力挽狂澜”。

🔗 项目地址:https://github.com/liuhr/my2sql 📥 下载地址:GitHub Releases 提供 Linux/macOS/Windows 全平台支持

欢迎留言交流你的数据恢复、binlog解析等经验及实战案例。

关注微信公众号「数据库干货铺」,获取更多数据库运维干货。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据库干货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档