MySQL如何恢复不小心误删的数据记录(binlog)

前言

题主于今天(2022年11月27日) 在线上环境误操作删除了记录,且没有备份数据,通宵排查事故原因,终于没有酿成生产事故。谨以此文记录。

参考资料

https://blog.csdn.net/qq_23543983/article/details/127298578

本文是对上文操作的实际补充说明。

1 查看binlog日志

首先确保你binlog日志是打开的。一般线上环境都会打开。命令如下:

show VARIABLES like '%log_bin%';

然后登陆你存放MySQL的服务器。找到存放binlog日志的文件夹。一般项目组运维会知道该文件位置。找到之后会发现非常多的日志文件,如下图:

在这里插入图片描述
注意,最后一个日志文件是实时增量更新的。一直会写入该文件。如果是你近期删除的,直接找上图圈出的文件即可。如果是其它时间段删除的,就找日期命名的文件。

恢复数据时间越早越快越好。我们服务器上只保管45天的记录!

2 找到对应binlog文件,直接执行命令

下面的sql给了个时间段。是你抓取误操作的大致时间段。

 mysqlbinlog --no-defaults --start-datetime='2022-10-12 15:00:00' --stop-datetime='2022-10-12 17:00:00' /var/lib/mysql/mysql-bin.000031 >/var/lib/mysql/mysql_delete20221012.sql

执行完毕后,会生成一个sql文件。上面有你全部误操作的数据,(数据经过加密了)里面有非常多的记录,我们只需要找到开始的 index 和 结束的index 即可。

推荐使用 head -100 ; 和 tail -100 来查看开始和结束的结点。找到这两个结果值,记录下:

332334767

366250788

随后执行下面命令, 通过节点精确导出误操作的sql :

mysqlbinlog --no-defaults -vv --start-position=332334767 --stop-position=366250788 /var/lib/mysql/mysql-bin.000031 >/var/lib/mysql/bin_data.sql

其实就是拼接你的时间段。会把所有INSERT,UPDATE语句全部抓出(如下图图例):

在这里插入图片描述

3 找到你误删的数据

一般来说你误删的数据会大致记下来一个标识。我这里是单据号。我隐约记得被删除的数据的单据编码是多少,那么我们就可以模糊搜索该条件:

less bin_data.sql | grep -C 100 "单据编号xxxxx"

这样就能得到对应的反向INSERT语句了,如下所示:

在这里插入图片描述

4 将delete语句转换成insert语句

可以自行百度,也可以参考下面命令:

cat /var/lib/mysql/bin_data.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-9]=//g' | sed 's/@[1-9][0-9]=//g' >  /var/lib/mysql/delete2insert.sql

需要注意要符合语法格式。你得自己手工改改,但是大同小异就是了。需要在文件中手动改一些,;之类的符号。

也可以参考下文:https://www.lmlphp.com/user/62049/article/item/2326681/

完成

引以为戒!

### MySQL 8.0 数据库误删后的恢复 对于MySQL 8.0数据库中的数据文件被删除的情况,如果仍然保存有`.idb`文件,则可以尝试按照特定的方法来恢复丢失的数据[^1]。 #### 使用 `.idb` 文件进行数据恢复 由于MySQL 8.0再依赖于`.frm`文件定义表结构,因此即使缺少这些文件也可以实现一定程度上的恢复工作。具体来说: - 首先准备一个新的实例或者新的数据库用于测试目的; - 将原来的.ibd文件复制到新创建的对应位置; - 创建具有相同名称但为空的新表格(注意要匹配原有的字符集以及排序规则),这一步骤是为了让InnoDB存储引擎能够识别该表的空间ID; - 执行 `ALTER TABLE table_name DISCARD TABLESPACE;` 命令丢弃当前分配给指定表的空间,以便稍后加载旧空间; - 把之前备份好的.ibd文件重命名为与目标表相一致的名字,并放置在正确的位置上; - 接着运行 `ALTER TABLE table_name IMPORT TABLESPACE;` 来导入外部提供的表空间文件; 上述操作完成后应该可以看到已经恢复过来的数据记录了。 #### 日志文件辅助恢复 另外一种方式是从二进制日志(binlog)中寻找线索来进行部分数据重建。当知道具体的删除动作发生在哪个时间点附近时,可以从binlog提取相应的SQL语句片段用来撤销错误指令的影响。例如,在Windows环境下可以通过查看 binlog 的信息定位到删除事件发生的具体位置,进而利用此信息将日志转换成可执行的 SQL 脚本来完成数据恢复过程[^2]。 ```sql -- 查看binlog状态 SHOW BINARY LOGS; -- 导出指定范围内的binlog内容至文本文件 mysqlbinlog --start-position=2034 --stop-position=2246 /path/to/binlog-file > restore.sql; ``` #### 处理无法下载的问题 针对提到的“无法下载”的情况,如果是关于重新安装或更新MySQL软件包遇到困难的话,建议检查网络连接状况、确认官方源地址是否可用、清理本地缓存后再试一次。此外还可以考虑更换同的镜像站点获取资源。而对于权限足或者其他配置方面引发的问题则可能涉及到操作系统层面的安全策略调整或是修改相关服务账户的信息以获得必要的访问权限[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值