MySQL误删整表恢复数据
前提:误使用delete语句删除了整表的数据,数据库已开启binlog日志,且"binlog_format="ROW"
解决思路
1.因为开启了binlog日志,所以通过delete删除整表数据的操作一定会转化为相应的sql语句落到binlog日志中,接下来围绕着binlog日志展开查询;
2.我们环境中binlog日志的大小限制为512M(max_binlog_size = 512M),所以要根据删除数据表的时间来判定具体在哪个binlog文件中;
3.找到对应的binlog文件后,通过mysqlbinlog命令来查看binlog文件,根据具体时间点来查找删除数据的sql语句
提几个参数:-vv 将二进制转换为可阅读文本
--start-datetime 起始时间
--stop-datetime 终止时间
--start-position 起始位置
--stop-position 终止位置
将binlog文件转换为我们能看懂的格式:mysqlbinlog --no-defaults -vv logbin.xxxxxx | more
如果不加--no-defaults参数,可能会带着一些默认参数,导致该命令执行报错。
4.通过第三步,找到对应的删除sql,然后保存到一个新文件中,通过以下命令处理,得到的new_roolback.sql就是转换为 insert into *** select *,* 的插入语句
注意这条命令中的 sed -r 's/(@7.*),/\1;/g' 参数,这个参数是在最后一个字段后加上分号,我的表总共有7个字段,所以是 @7 ,根据实际情况来更改
cat roolback.sql | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' |sed -r 's/(@7.*),/\1;/g' | sed 's/@[1-9]=//g' | sed 's/@[1-9][0-9]=//g' > new_roolback.sql
5.将得到的new_roolback.sql插入到数据库里,插入之前最好先挑一两条sql单独拿出来执行下,看有没有问题,确定没问题后,再将刚才测试插入的数据删除掉。
Linux命令行还原数据:mysql -uxxx -pxxx < new_roolback.sql,等待导入完成即可

浙公网安备 33010602011771号