通过mysqlbinlog恢复误操作清空的表
今天跟大家分享通过mysqlbinlog恢复误操作清空的表,分享来源于发生在自己身上的真实事件。
背景
某个月黑风高的夜晚,朋友微信找到我说,数据库中某个表被开发人员误删了,老板还在正在测试功能,开发学艺不精,慌了,不知道怎么办了。
我问他是否开启了binlog,并把以下命令发给他。
show variables like ‘log_bin’;
值得庆幸的是,他们的生产数据库开了binlog。然后跟他说了下可以恢复,并分享了文章让那边开发人员操作一下。
结果半小时之后,朋友问我能不能帮忙操作,其实我内心是拒绝的,因为不想给自己找麻烦,但想到我貌似没有线上实操过,说明顾虑及安全性问题后,对方同意便决定尝试一下。
恢复步骤
操作步骤如下:
找到存放binlog的目录,使用 mysqlbinlog
mysqlbinlog mysql-bin.000011 > bak.log
找到删除的语句时间,使用的是truncate,因为项目未上线,log 不大,直接 grep 即可
再次利用 mysqlbinlog 导出sql 语句,方便后续快速导入
mysqlbinlog –stop-datetime=”2019-09-07 17:30:31” mysql-bin.000011 >all.sql
stop-datetime应该是误删操作前一刻时间。
下载 all.sql 倒入本地数据库,检查无异常,导出误删表,直接将误删表导入生产数据库。
- 告知对方检测生产数据库
这个事情就这么告一段落了,没有任何酬劳,真小气。。。
反思
晚上我反思了一下,总结如下:
- 数据库重要数据尽量一天一备份,然后开启binlog,为了减少硬盘空间占用,设置expire_logs_days
- 生产数据库不使用root用户,新建用户,限制drop,truncate等危险操作权限
- 遇事别慌,自己尝试解决,解决不了请教别人,快速解决问题才是关键
- 帮忙可以帮,但要说清楚,别被坑了
- 导出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/