能还原,但必须满足log_bin=ON、binlog_format=ROW、binlog_row_image=full且误删操作仍在未过期binlog中;缺一不可,否则无法解析出被删行的具体数据;推荐使用my2sql生成带完整WHERE的回滚SQL,并执行前禁用外键、检查主键冲突、统一字符集。

能还原,但前提是 log_bin=ON、binlog_format=ROW、且被删数据的变更还保留在未过期的 binlog 文件里——缺一不可。STATEMENT 或 MIXED 格式无法还原 DELETE 行级内容,日志被 PURGE BINARY LOGS 清掉后也无从下手。
确认 Binlog 是否满足闪回基本条件
不查清楚就动手等于白忙。必须同时满足三项:
-
SHOW VARIABLES LIKE 'log_bin';返回ON -
SHOW VARIABLES LIKE 'binlog_format';返回ROW -
SHOW VARIABLES LIKE 'binlog_row_image';返回full(MySQL 5.6+ 默认,但老实例可能被设为minimal,会导致 DELETE 无 before_image)
任意一项不达标,mysqlbinlog 解析出来的只有 DELETE FROM t,没有具体删了哪几行,后续所有操作都失去依据。
用 my2sql 替代 binlog2sql 生成安全回滚 SQL
binlog2sql 在 MySQL 8.0+ 环境下大概率报错(权限模型/认证插件不兼容),且不处理外键和主键冲突;my2sql 是目前最稳的选择:离线解析、支持 8.0、输出的 SQL 自带完整 WHERE 条件,避免误恢复其他行。
执行示例:
./my2sql_linux_amd64 -user root -password 'xxx' -host 127.0.0.1 -port 3306 -work-type flashback -B -d mydb -t user --start-file mysql-bin.000002 --start-pos 12345 --stop-pos 67890 > rollback.sql
关键点:
-
-B表示生成回滚语句(DELETE → INSERT) -
--start-pos必须从事务的BEGIN事件位置开始,不是DELETE那行的位置——否则缺失主键值,INSERT 会失败 - 务必先用
--flashback模式预览输出,确认语句只包含目标行
执行恢复前必须绕开的三个硬坑
直接把生成的 SQL 往生产库跑,90% 会出事:
- 外键约束必须临时禁用:
SET FOREIGN_KEY_CHECKS = 0;,否则INSERT报错中断 - 主键冲突风险极高:误删后若有人又插入了相同主键的新数据,回滚会失败。得先
SELECT * FROM t WHERE id IN (...)检查是否存在,或先备份当前表再操作 - 字符集不一致会导致乱码:确保
rollback.sql文件编码与目标库一致(通常是utf8mb4),导入时加--default-character-set=utf8mb4
时间点或 position 的卡位稍有偏差,就可能多恢复一条、少恢复一行,或者混入其他表的操作——别信“大概时间”,优先用 SHOW BINLOG EVENTS 或 mysqlbinlog --base64-output=DECODE-ROWS -v 人工核对事务边界。


















