一、核心功能
my2sql 是基于 Go 语言开发的 MySQL Binlog 解析工具,主要用于以下场景:
- 数据恢复
- 通过解析 Binlog 生成可执行的 SQL 语句(如
INSERT
、UPDATE
、DELETE
) - 支持生成回滚语句(Rollback SQL)直接恢复误操作数据
- 数据审计
- 按时间、表名、操作类型等条件过滤 Binlog
- 支持输出为 SQL 文件或 JSON 格式
- 高效率处理
- 原生 Go 实现,无需依赖 MySQL 客户端
- 支持并行解析(Go 协程优化)
- 兼容性强
- 支持 MySQL 5.6+ 和 MariaDB 10.0+
- 兼容 Row/Statement/Mixed 格式的 Binlog
二、安装 Go 与 my2sql
1. 安装 Go 环境(以 Linux 为例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| wget https://golang.org/dl/go1.21.3.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.3.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin
source ~/.bashrc
go version
|
2. 编译 my2sql
1 2 3 4 5 6 7 8 9
| git clone https://github.com/shanbay/my2sql.git cd my2sql
go build -o my2sql main.go
./my2sql --help
|
三、工具注意事项与核心参数
⚠️ 注意事项
MySQL 配置要求
权限要求
MySQL 用户需具备
权限:
1
| GRANT REPLICATION SLAVE ON *.* TO 'my2sql_user'@'%' IDENTIFIED BY 'password';
|
时间范围限制
- Binlog 默认保留周期由
expire_logs_days
控制,需确保误操作时间在有效范围内。
DDL 不可逆
- 无法恢复
DROP TABLE
等操作,需依赖备份。
🔧 核心参数说明
参数名 | 说明 |
---|
--start-file | 起始 Binlog 文件名(如 mysql-bin.000001 ) |
--start-position | 起始位置(配合 --start-file 使用) |
--stop-file | 结束 Binlog 文件名 |
--stop-position | 结束位置 |
--start-datetime | 起始时间(格式:YYYY-MM-DD HH:MM:SS ) |
--stop-datetime | 结束时间 |
--database | 过滤指定数据库(支持通配符 * ) |
--table | 过滤指定表(支持通配符 * ) |
--output | 输出文件路径(默认输出到终端) |
--rollback | 生成回滚语句(Rollback SQL) |
--help | 查看完整参数列表 |
四、详细实战教程:误删数据恢复与统计分析
环境准备
- MySQL 配置
1 2 3 4 5 6 7 8
| SET GLOBAL binlog_format = 'ROW'; SET GLOBAL log_bin = ON;
CREATE USER 'my2sql_user'@'%' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLAVE ON *.* TO 'my2sql_user'@'%'; FLUSH PRIVILEGES;
|
- 创建测试数据库与数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| CREATE DATABASE test_db; USE test_db;
CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), email VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com'), ('Bob', 'bob@example.com'), ('Charlie', 'charlie@example.com'), ('David', 'david@example.com'), ('Eve', 'eve@example.com');
SHOW MASTER STATUS;
|
模拟误删操作
- 执行误删操作
1 2
| DELETE FROM users WHERE id > 2;
|
- 确认误删结果
使用 my2sql 生成回滚 SQL
- 获取 Binlog 信息
- 生成回滚 SQL
1 2 3 4 5 6 7 8
| ./my2sql \ --start-file="mysql-bin.000005" \ --start-datetime="2023-10-01 12:00:00" \ --stop-datetime="2023-10-01 12:05:00" \ --database="test_db" \ --table="users" \ --rollback \ --output="/tmp/rollback_users.sql"
|
- 检查生成的回滚 SQL
1 2 3 4
| INSERT INTO `test_db`.`users`(`id`, `name`, `email`, `created_at`) VALUES (3, 'Charlie', 'charlie@example.com', '2023-10-01 12:03:45'); INSERT INTO `test_db`.`users`(`id`, `name`, `email`, `created_at`) VALUES (4, 'David', 'david@example.com', '2023-10-01 12:03:46'); INSERT INTO `test_db`.`users`(`id`, `name`, `email`, `created_at`) VALUES (5, 'Eve', 'eve@example.com', '2023-10-01 12:03:47');
|
- 执行回滚恢复
1
| mysql -u root -p test_db < /tmp/rollback_users.sql
|
- 验证恢复结果
生成标准 SQL(非回滚)
- 生成原始操作 SQL
1 2 3 4 5 6 7
| ./my2sql \ --start-file="mysql-bin.000005" \ --start-datetime="2023-10-01 12:00:00" \ --stop-datetime="2023-10-01 12:05:00" \ --database="test_db" \ --table="users" \ --output="/tmp/original_sql.sql"
|
- 检查生成的 SQL
1 2 3 4
| DELETE FROM `test_db`.`users` WHERE `id` = 3 AND `name` = 'Charlie' AND `email` = 'charlie@example.com' AND `created_at` = '2023-10-01 12:03:45'; DELETE FROM `test_db`.`users` WHERE `id` = 4 AND `name` = 'David' AND `email` = 'david@example.com' AND `created_at` = '2023-10-01 12:03:46'; DELETE FROM `test_db`.`users` WHERE `id` = 5 AND `name` = 'Eve' AND `email` = 'eve@example.com' AND `created_at` = '2023-10-01 12:03:47';
|
生成统计信息
- 生成操作统计报告
1 2 3 4 5 6 7
| ./my2sql \ --start-file="mysql-bin.000005" \ --start-datetime="2023-10-01 12:00:00" \ --stop-datetime="2023-10-01 12:05:00" \ --database="test_db" \ --table="users" \ --statistics
|
- 输出示例
1 2 3 4 5 6 7 8
| [INFO] 解析时间范围: 2023-10-01 12:00:00 至 2023-10-01 12:05:00 [INFO] 数据库: test_db, 表: users [INFO] 操作类型统计: - DELETE: 3 条 - INSERT: 0 条 - UPDATE: 0 条 [INFO] 总操作数: 3 [INFO] 涉及行数: 3
|
跨 Binlog 文件恢复(进阶)
场景:误删操作跨越多个 Binlog 文件
1 2 3 4 5 6 7 8 9
| ./my2sql \ --start-file="mysql-bin.000005" \ --start-position=1234 \ --stop-file="mysql-bin.000006" \ --stop-position=5678 \ --database="test_db" \ --table="users" \ --rollback \ --output="/tmp/cross_binlog_rollback.sql"
|
JSON 格式输出(可选)
生成 JSON 格式的变更记录
1 2 3 4 5 6 7 8
| ./my2sql \ --start-file="mysql-bin.000005" \ --start-datetime="2023-10-01 12:00:00" \ --stop-datetime="2023-10-01 12:05:00" \ --database="test_db" \ --table="users" \ --output="/tmp/changelog.json" \ --format=json
|
JSON 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [ { "type": "DELETE", "database": "test_db", "table": "users", "data": { "id": 3, "name": "Charlie", "email": "charlie@example.com", "created_at": "2023-10-01 12:03:45" } }, ... ]
|
注意事项与最佳实践
- 时间精度问题
- 使用
--start-datetime
和 --stop-datetime
时,建议时间范围略大于实际操作时间,防止遗漏事件。
- ID 冲突处理
- 如果误删后已插入相同 ID 的新数据,回滚可能导致主键冲突。需先删除新数据或调整 ID。
- 增量备份策略
- 定期使用
mysqldump
或 XtraBackup
备份数据库,并记录 Binlog 位置,形成完整的恢复链。
- 生产环境验证
- 在测试环境验证回滚 SQL 的正确性后再执行,避免二次破坏。
通过以上步骤,您可以完整掌握 my2sql 在数据恢复、SQL 生成和统计分析中的使用方法。建议结合 MySQL 官方工具(如 mysqlbinlog
)进行交叉验证,确保数据一致性。
五、类似工具对比
工具名称 | 语言 | 是否开源 | 核心优势 | 限制/缺点 |
---|
my2sql | Go | ✅ | 高性能、支持 Rollback、跨平台 | 社区较小,文档较少 |
mysqlbinlog | C++ | ✅ | MySQL 官方工具,兼容性好 | 需要安装 MySQL 客户端 |
binlog2sql | Python | ✅ | 功能全面,支持 DDL 解析 | 依赖较多,性能较低 |
canal | Java | ✅ | 实时同步、支持 Kafka/RocketMQ | 配置复杂,主要用于同步场景 |
Debezium | Java | ✅ | 强大的事件捕获能力 | 资源消耗较高 |
六、总结
my2sql 凭借其高性能的 Go 实现和简洁的命令行设计,成为 MySQL 数据恢复领域的优秀工具。相比其他工具,它在轻量级部署和回滚语句生成功能上具有明显优势。建议在生产环境中定期验证 Binlog 可用性,并结合物理备份(如 mysqldump/XtraBackup)形成完整的数据保护方案。
⚠️ 重要提示:数据恢复前务必先备份当前数据库!