mysql 误删binlog_mysqlbinlog恢复误删数据

本文详细介绍了如何通过MySQL的binlog恢复误删数据。当发生错误的DELETE操作后,检查发现已开启log-bin备份。通过`show master status`找到二进制日志文件,使用`mysqlbinlog`命令定位到删除操作的位置,并将其转换为INSERT语句,最终生成恢复SQL脚本进行数据恢复。这种方法仅适用于DELETE操作,对于TRUNCATE等无法恢复的情况需依赖数据备份。
摘要由CSDN通过智能技术生成

概述

代码bug,在处理上传出现异常时执行了DELETE FROM t_resource WHERE resource_id = ? OR parent_id = ?因为OR条件导致用户的上传的所有数据被清空了。

show

查看是否有开启log-bin备份

show variables like 'log_bin'

78beb6cd3951104446ffd4a5090e1532.png

欣慰的是,已经开启了二进制日志备份。那接下来就简单多了,找到这个二进制日志,找到这个节点,去恢复它。执行这个命令,查看正在写入的二进制日志是哪个文件

show master status

0cc7ee3e27bba63cc31d74cfae107712.png

当然也可以flush重新开始一个文件写入。用这个文件名在Linux全局搜下这个文件在哪==> find / -name mysql,找到这么久好办了。

mysqlbinlog

mysqlbinlog -vv --start-datetime='2019-9-24 11:24:00' --stop-datetime='2019-9-24 11:25:20' mysql-bin.000211| grep "t_resource" | more

查看里面执行删除操作的pos位置

7b14a9d66e66b3aa2ef64aa4a029d6d0.png

然后去查看从哪里开始执行了删除

show binlog events in 'mysql-bin.000211'

c0555da4572bd2f07de45cc926521c7f.png

知道了开始和结束的节点,恢复数据就很快了,因为logbin是二进制日志,我们把它弄成我们看得懂的

mysqlbinlog -vv --start-position=956859551 --stop-position=956863056 mysql-bin.000211 |grep ^"###" >bin_1448

就生成了一个bin_1448文件。我们打开看下

fc3d12a5316de3c45db105085bb75bfb.png

这个就是执行delete删除的东西

INSERT

接下去就是把它反过去变成insert语句就OK了

cat bin_1448 | 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' >resource.sql

打开,resource.sql 就是我们很多眼熟的sql语句了。。调整执行就很简单了

902ec1af46c52c5afeec40f31e31c410.png

总结

以上只能对delete的误操作有效,而且binlog是行模式,如果是truncate的语句造成,那只能祈祷有备份文件了。

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值