某天,我正在快乐的敲着代码
突然旁边的马大哈同事一声惨叫,好事的我,连忙把头伸过去问问怎么了,马大哈说,他不小心在表上点了清空表
这个时候,要镇静,假装不慌,,,
但是没有两分钟,对面的同事说,怎么访问不了了……
好吧,这里直接说方案
由于navicat的清空表,实际上就是执行的是delete,更狠的截断表先不说,那个更难恢复
首先查看一下MySQL自带的bin日志
登陆你的mysql执行下面这个命令
先看看最新的日志文件名字
show master status;
在看看日志位置
show variables like 'log_bin_basename%';
如果你也是centos系统安装的,而且默认,那么直接cd到这个路径即可
然后尝试回忆一下你删除的时间
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" //恢复结束时间
cd /var/lib/mysql/
mysqlbinlog -d=要恢复的数据库名字 --no-defaults --start-datetime='2020-03-16 12:56:00' --stop-datetime='2020-03-16 14:57:00' -vv mysql-bin.000001 > result.txt
打开这个result.txt你应该可以看到删除的记录
现在使用sed过滤一下目标库表
cat result.txt | sed -n '/### DELETE FROM `数据库`.`表名`/,/COMMIT/p' > delete.txt
然后你得到的delete.txt应该是这样
如果是,那么请继续
将delete.txt替换成insert语句即可
cat delete.txt | sed -n '/###/p' | sed 's/### //g;s//*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' |sed -r 's/(@6.*),/1;/g' | sed 's/@[1-9]=//g' | sed 's/@[1-9][0-9]=//g' | sed '0~5s/,/;/' > insert.sql
如果执行成功应该是这样
到这里基本结束了
登陆mysql导入这个脚本
. insert.sql
数据又都回来了
nice