用 binlog2sql 找回误删数据的两小时

举报
yd_264617019 发表于 2026/10/20 10:45:05 2026/10/20
【摘要】 周三下午四点,业务在群里发来求救:update忘了带where条件,把一张配置表3万行全更新了。表没有备份任务覆盖(讽刺的是正因为"配置表很小"被排除在备份清单外),最近的全量备份是三天前的。最终靠binlog2sql两小时完整恢复,过程值得记录。前提条件先核对:binlog开着且格式为ROW(8.0默认ROW,这个老库幸好前一年刚切过来),误操作时间点大约在14:37,之后到发现为止没有其...

周三下午四点,业务在群里发来求救:update 忘了带 where 条件,把一张配置表 3 万行全更新了。表没有备份任务覆盖(讽刺的是正因为"配置表很小"被排除在备份清单外),最近的全量备份是三天前的。最终靠 binlog2sql 两小时完整恢复,过程值得记录。

前提条件先核对:binlog 开着且格式为 ROW(8.0 默认 ROW,这个老库幸好前一年刚切过来),误操作时间点大约在 14:37,之后到发现为止没有其他写入这张表的业务。恢复思路是反向操作:binlog 里记录了每行变更的前像(改动前数据),把这段时间该表的变更全部解析出来,逆序生成反向 SQL 回放即可。

操作过程浓缩如下:

# 1. 定位事故时间段的 binlog 文件
mysqlbinlog --no-defaults -vv mysql-bin.000482   | grep -n -B5 "t_config" | head

# 2. 解析出正向 SQL 先确认影响范围
python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'***'   --databases=cfgdb --tables=t_config   --start-file='mysql-bin.000482'   --start-datetime='2026-10-14 14:35:00'   --stop-datetime='2026-10-14 14:40:00'   > forward.sql

# 3. 加 -B 生成反向 SQL(update 前像回填)
python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'***'   --databases=cfgdb --tables=t_config -B   --start-file='mysql-bin.000482'   --start-datetime='2026-10-14 14:35:00'   --stop-datetime='2026-10-14 14:40:00'   > rollback.sql

回放前做了三件事保命:rollback.sql 先在预发库回放验证,抽样比对 20 行数据正确;生产回放放在事务里,比对行数后再提交;从库延迟暂停,避免回放被放大。14:37 到 14:40 之间业务对该表还有 200 多条正常写入,反向 SQL 逆序回放正好把这些变更也"倒掉"了,需要在正向 SQL 里找出这批行手工重放——这是整个恢复里最费人力的部分,也是为什么发现越早恢复越简单。

恢复演练之后把 binlog2sql 的使用门槛也降了下来:预打包成平台工具,输入库名表名和时间范围就能出反向 SQL,并强制先在影子库回放验证。工具越顺手,误操作的恢复速度越快,但也要防止滥用——工具页面上我们加了审批和操作留痕,恢复数据的权限本身就该被管控。

事故后的整改很直接:配置表纳入备份清单,核心表开启延迟 1 小时的延迟从库做"后悔药",高危 update 强制走带 where 校验的工单系统。工具能救命,但流程才是防复发的药。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。