记录一次mysql误删一条数据,通过binlog文件找回。

遇到的问题:

某一天发现同事误删了我的一张表的一条数据,我一点不慌,起身去找运维人员看看有没有每天备份的数据库,运维人员告诉我没有做备份,瞬间感觉很蛋疼了。当时想到的是可不可以通过mysql的binlog日志文件来查找删除操作的数据。因为binlog文件记录了mysql的所有DDL,DML操作。通过搜索资料找到了解决办法。

解决方式

使用binlog前提是你的mysql必须要开启binlog日志,还好我们项目已经开启了,开启的方式一般在my.cnf文件中进行配置
my.cnf文件
log-bin=mysql-bin #开启binlog二进制文件 mysql-bin是binlog二进制文件的前缀

1、查看mysql binlog是否开启

  • 登录mysql查看binlog日志的状态,输入show variables like ‘%log_bin%’;查看log_bin为ON开启状态;
    在这里插入图片描述

  • Binlog日志包括两类文件;第一个是二进制索引文件(后缀名为.index),第二个为日志文件(后缀名为.00000*),记录数据库所有的DDL和DML(除了查询语句select)语句事件

2、查看binlog文件

  • 查看所有binlog日志文件列表:show master logs;
  • 在这里插入图片描述
  • 查看最后一个binlog日志的编号名称及其最后一个操作事件pos结束点的值:show master status;

3、使用mysqlbinlog 处理二进制文件

因为mysql binlog文件是以二进制形式存储的所以我们要将其转成人类可以看的类型。这时候就要用到mysqlbinlog 了。

  • 如果你知道误操作大概的时间的话使用
/usr/local/mysql/bin/mysqlbinlog --no-defaults --start-datetime="2021-06-20 00:00:00" --stop-datetime="2021-06-28 23:59:59" --base64-output=DECODE-ROWS --verbose  /tmp/mysql-bin.000018 > /tmp/000018bin_decode-row.sql
#担心会影响到生产,我己经提前将binlog文件复制到tmp目录下了
#/usr/local/mysql:这个根据自己的mysql安装位置决定,我们的mysql安装到了该目录下。

–no-defaults :5.7版本不加这个参数的话会报错
–start-datetime、–stop-datetime:操作的开始时间和结束时间
–base64-output=DECODE-ROWS 和 --verbose 参数请参考

https://www.cnblogs.com/hunterhuang8888/p/14237867.html

如果你知道偏移量的话执行

/usr/local/mysql/bin/mysqlbinlog --no-defaults --stop-position=231934578 --base64-output=DECODE-ROWS --verbose  /tmp/mysql-bin.000018 > /tmp/000018bin_stop-pos231934578.sql

我是通过时间区间将mysql-bin.000018导成.sql文件然后根据表名找的。

4、查看.sql文件,找到误删的那条记录

在这里插入图片描述

5、找到数据后,最后将数据插入到对应表中即可。

说明:这种方式只适合误删数据量少的情况,但是要是数据量很大,或者直接drop table了这种方式就不合适了。需要用其他得方式,但是归根到底还是用binlog文件去实现。

如果大佬们有更好的解决方式的话可以留言一起讨论一下。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值