通过mysqlbinlog恢复误操作清空的表

今天跟大家分享通过mysqlbinlog恢复误操作清空的表,分享来源于发生在自己身上的真实事件。

背景

某个月黑风高的夜晚,朋友微信找到我说,数据库中某个表被开发人员误删了,老板还在正在测试功能,开发学艺不精,慌了,不知道怎么办了。

我问他是否开启了binlog,并把以下命令发给他。

show variables like ‘log_bin’;

值得庆幸的是,他们的生产数据库开了binlog。然后跟他说了下可以恢复,并分享了文章让那边开发人员操作一下。

结果半小时之后,朋友问我能不能帮忙操作,其实我内心是拒绝的,因为不想给自己找麻烦,但想到我貌似没有线上实操过,说明顾虑及安全性问题后,对方同意便决定尝试一下。

恢复步骤

操作步骤如下:

  1. 找到存放binlog的目录,使用 mysqlbinlog

    mysqlbinlog mysql-bin.000011 > bak.log

  2. 找到删除的语句时间,使用的是truncate,因为项目未上线,log 不大,直接 grep 即可

  3. 再次利用 mysqlbinlog 导出sql 语句,方便后续快速导入

    mysqlbinlog –stop-datetime=”2019-09-07 17:30:31” mysql-bin.000011 >all.sql

stop-datetime应该是误删操作前一刻时间。

下载 all.sql 倒入本地数据库,检查无异常,导出误删表,直接将误删表导入生产数据库。

  1. 告知对方检测生产数据库

这个事情就这么告一段落了,没有任何酬劳,真小气。。。

反思

晚上我反思了一下,总结如下:

  1. 数据库重要数据尽量一天一备份,然后开启binlog,为了减少硬盘空间占用,设置expire_logs_days
  2. 生产数据库不使用root用户,新建用户,限制drop,truncate等危险操作权限
  3. 遇事别慌,自己尝试解决,解决不了请教别人,快速解决问题才是关键
  4. 帮忙可以帮,但要说清楚,别被坑了
  5. 导出sql时应该指定数据库,比如

mysqlbinlog –stop-datetime=”2022-09-07 17:30:31” –database=test mysql-bin.000893 >all.sql

参考


通过mysqlbinlog恢复误操作清空的表
https://blog.puresai.com/2019/09/08/198/
作者
puresai
许可协议