binlog_format=ROW、log_bin、server_id[mysqld] server_id=1 log_bin=/var/log/mysql/mysql-bin.log max_binlog_size=100M binlog_format=ROW
git clone https://github.com/danfengcao/binlog2sql.git cd binlog2sql pip install -r requirements.txt
-- 原始數據 SELECT * FROM tbl; +----+--------+---------------------+ | id | name | addtime | +----+--------+---------------------+ | 1 | 小趙 | 2016-12-10 00:04:33 | | 2 | 小錢 | 2016-12-10 00:04:48 | | 3 | 小孫 | 2016-12-13 20:25:00 | | 4 | 小李 | 2016-12-12 00:00:00 | +----+--------+---------------------+ -- 誤操作 DELETE FROM tbl; -- 20:28 執行 -- 表已空
SHOW MASTER STATUS; +------------------+----------+ | Log_name | File_size| +------------------+----------+ | mysql-bin.000052 | 965 |
python binlog2sql.py \ -h 127.0.0.1 -P 3306 -u admin -p 'admin' \ -d test -t tbl \ --start-file='mysql-bin.000052' \ --start-datetime='2016-12-13 20:25:00' \ --stop-datetime='2016-12-13 20:30:00'
輸出關鍵信息: 刪除語句位於 position 728-938 之間。
# 生成回滾 SQL 驗證 python binlog2sql.py \ -h 127.0.0.1 -P 3306 -u admin -p 'admin' \ -d test -t tbl \ --start-file='mysql-bin.000052' \ --start-pos=3346 --end-pos=3556 \ -B # 關鍵參數:生成反向 SQL # 確認無誤後管道執行 python binlog2sql.py ... -B | mysql -h127.0.0.1 -P3306 -uadmin -p'admin'
回滾 SQL 示例:
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-12 00:00:00', 4, '小李');
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:25:00', 3, '小孫');
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:48', 2, '小錢');
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:33', 1, '小趙');
SELECT * FROM tbl; -- 數據完整恢復
| 問題 | 答案 |
|---|---|
| DDL 誤操作(DROP TABLE)能閃回嗎? | 不能。Row 模式 Binlog 不記錄 DDL 逐行變更。需依賴備份或修改內核 Patch(阿里 Lin Xiaobin 方案,極少公司應用)。 |
| 還有其他閃回工具嗎? | 阿里彭立勳 mysqlbinlog + flashback Patch、去哪兒 Inception(備份恢復模式)、從庫延遲備份(浪費資源)。binlog2sql 輕量、無侵入、易用。 |
| binlog2sql 支持哪些版本? | MySQL 5.6/5.7/8.0,MariaDB 10.2+,需 Row 格式 Binlog。 |
| 大事務解析慢怎麼辦? | 工具支持 --stop-datetime/--stop-pos 精確截取,避免全量解析。 |
Binlog2sql 將「數小時備份恢復」壓縮為「分鐘級閃回」,是 MySQL 運維工具箱必備利器。記住鐵律:ROW Binlog 是閃回的命門,DDL 只能靠備份。