本文首发于「数据库干货铺」公众号,转载请联系授权
在 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),适用于数据恢复、变更审计、同步校验等场景。
主要特点包括:
1. 使用前提
在使用 my2sql 前,请确保满足以下条件:
[mysqld]
log-bin = mysql-bin
binlog_format = ROW
binlog_row_image=full
server-id = 1GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'user'@'%';获取目标 binlog 文件路径或名称(可通过 SHOW BINARY LOGS; 查看)
2. 安装方式
1) 安装Go环境:
yum install -y epel-release
yum install -y go git安装完成后验证
# go version
go version go1.20.12 linux/amd64

2) 拉取源码:
执行git clone https://github.com/liuhr/my2sql.git命令克隆源码仓库至本地。
# 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) 编译生成可执行文件:
进入源码目录并执行编译命令
cd my2sql && go build -o my2sql4) 编译完成后,目录下将生成my2sql二进制文件,可以验证一下是否有效
./my2sql -V
从GitHub Releases页面下载对应系统的二进制包,下载地址:https://github.com/liuhr/my2sql/blob/master/releases,目前有编译好的centos7的二进制包,下载后,赋予可执行权限,例如:
[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的核心功能通过命令行参数组合实现,语法结构如下:
./my2sql \
-host <MySQL地址> \
-port <端口> \
-user <用户名> \
-password <密码> \
-start-file <起始binlog文件> \
[其他选项]重要参数说明如下:
MySQL 主机地址(默认 127.0.0.1)三、 实战场景应用示例
场景1:解析指定时间范围binlog,生成执行SQL
[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
[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解析等经验及实战案例。
关注微信公众号「数据库干货铺」,获取更多数据库运维干货。