# MySQL误操作delete from...删数据的后续
# 一、背景
害,今天写了条非常简单的sql语句 delete from t_xxx where id in ('a', 'b')
,然后跟往常一样喝了口82年的白开水,就打开navicat去执行这个代码。然鹅...我勒个去,卧槽、尼玛、fk、淦。你猜发生了什么... select * from t_xxx
竟然没数据,当时血压指数飙升,我就赶紧戴上我的八倍镜,仔细看了看。原因是执行的时候竟然没选中where就执行了...aka 炸了,于是乎就有了这篇文章
# 二、解决
对于这种十万火急的事情,我直接先说解决办法。我在情急之中突然想起有个binlog
查看binlog是否开启
show variables like '%log_bin%';
查看数据库文件存放路径,bin-log路径
show variables like '%datadir%';
找到删除时间段的binlog,翻译为sql
mysqlbinlog --base64-output=decode-rows -v --database=base --start-datetime="2022-11-3 14:40:00" --stop-datetime="2022-11-3 14:45:00" "/var/lib/mysql/binlog.000003" > /tmp/mysqllog.sql
1
- 在生成的 mysqllog.sql 文件同路径下 ,生成将delete翻译为insert的sql文件
cat mysqllog.sql | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/;INSERT INTO/g;s/WHERE/SELECT/g;' |sed -r 's/(@17.*),/\1;/g' | sed 's/@1=//g'| sed 's/@[1-9]=/,/g' | sed 's/@[1-9][0-9]=/,/g' > mysqllogOK.sql
1
- 打开生成的sql文件找到相应的insert,将翻译的insert语句复制到mysql里面执行。
# 三、拓展
bin-log 二进制日志(binnary log)以事件形式记录了对MySQL数据库执行更改的所有操作。
- 主从复制
- 数据恢复
# 四、总结
要注意``要小心``要谨慎
哈哈哈哈,切