误删数据库是一种怎样的体验
Delete一时爽,恢复泪千行…
都说程序员删库跑路,我是删库差点给自己断后路…
2020-05-22 17:59:00,本想关电脑,手工一天工资到手,谁知脑子短路执行了一个旧的接口,对两张表delete from table_xxx.瞬间焕然大悟,可惜后悔莫及,花了整整1hour忍受饥饿恢复了1年来用户积累的数据,还好mysql够给力,一切还算顺利。
话不多说,上解药了
环境
windows、Mysql
执行语句:delete from xxx(注意不是drop xxx,drop的话不知道能不能恢复得回来)
Step1
查看binlog功能是否开启(默认应该是开启的,我安装mysql时是没有专门配置这个),如果为log_bin为ON说明可以恢复,如果为OFF说明没有开启binlog,也没有预先生成回滚SQL,那可能真的无法快速回滚了,GAMEOVER,下面的不用看了(好像可以通过ibd恢复,具体可以参考 https://blog.csdn.net/hanjun0612/article/details/102466509 )。
Step2
查看数据文件存放的路径
show variables like ‘%datadir%’;
在datadir目录下找到xxxl-bin.****这样的文件,注意这个文件的时间和你执行删除语句的时间,找到对应的那个文件(我当初这个文件的时间是2020-05-22 18:01:00,刚好能对上),我把它拷贝到E盘根目录
Step3
查看Mysql的安装目录:show variables like “%basedir%”;
在Mysql安装目录新的bin里找到mysqlbinlog.exe,
执行命令找到删除的数据
mysqlbinlog --base64-output=decode-rows -v --database=DBName_xxx --start-datetime=“2020-05-22 17:58:00” --stop-datetime=“2020-05-22 18:02:00” E:\WIN-O92TML2S3D2-bin.000002 > mysqllog.sql
参数说明:
mysqlbinlog 命令的参数说明
–base64-output=decode-rows //数据转换正常的字符,如果不设置这个参数将显示base64的数据
–database=DBName //数据库名(一个mysql数据库比较多,指定方便恢复)
–start-datetime=“2019-11-26 18:00:00” //恢复起始时间
–stop-datetime=“2019-11-26 18:10:00” //恢复结束时间
D:\MySQL\Data\mysql-bin_copy.000028 //为数据恢复的日志文件
mysqllog.sql //恢复以后我们需要的文件名
Step4
打开mysqllog.sql文件,搜索 DELETE 关键字,找到被删除数据
但是这些数据真是一团糟,这个文件又大,直接打开都要卡死更别说替换和删除一些内容了,于是我写了脚本按行读取里面的内容顺便替换为对应的insert语句
最后,执行这些insert语句,恢复,完美,肚子真饿了,不过经历这件事真学到了点知识。
总结:
1、不要随便用DELETE,删除前一定要先备份
2、数据库做好定时备份,如果数据库不大,可以一小时备份一次,再大也可以每天备份一次,这样真恢复不了实时数据时,最多也是损失这个时间差内的数据
3、一定要Mysql开启binlog功能,不然白搭。
4、做事一定要细心
引用
https://www.cnblogs.com/hanjun0612/p/11941434.html