# MySQL误操作delete from...删数据的后续

# 一、背景

害,今天写了条非常简单的sql语句 delete from t_xxx where id in ('a', 'b') ,然后跟往常一样喝了口82年的白开水,就打开navicat去执行这个代码。然鹅...我勒个去,卧槽、尼玛、fk、淦。你猜发生了什么... select * from t_xxx 竟然没数据,当时血压指数飙升,我就赶紧戴上我的八倍镜,仔细看了看。原因是执行的时候竟然没选中where就执行了...aka 炸了,于是乎就有了这篇文章

# 二、解决

对于这种十万火急的事情,我直接先说解决办法。我在情急之中突然想起有个binlog

  1. 查看binlog是否开启 show variables like '%log_bin%';

  2. 查看数据库文件存放路径,bin-log路径 show variables like '%datadir%';

  3. 找到删除时间段的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
  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
  1. 打开生成的sql文件找到相应的insert,将翻译的insert语句复制到mysql里面执行。

# 三、拓展

bin-log 二进制日志(binnary log)以事件形式记录了对MySQL数据库执行更改的所有操作。

  • 主从复制
  • 数据恢复

# 四、总结

要注意``要小心``要谨慎哈哈哈哈,切