误删MySQL数据库文件的补救措施

本文详细介绍如何在MySQL5.6及以后版本中恢复误删的数据库文件,包括使用lsof命令查找未释放的文件、复制恢复IDB文件、调整表结构以及恢复数据的具体步骤。

搜到这篇文章的同学,先恭喜下,你可以准备三十六计之上上计了——跑路。

很多人都有理由问你怎么就能删库了,没有备份嘛。。。确实不应该,但偶有发生,就是没备份或者备份的数据太久了,真的就是脑子一抽抽就给删了。如果你的服务还没停掉或许还有一线生机,否则真的只能跑路了。

废话不多说,进入正题。这里介绍的是针对MySQL5.6之后的版本,之前是否支持不清楚,我实测的版本是5.7。

一、删除的文件有相应的进程还在运行中,文件就还在磁盘中为释放,使用 lsof 命令会看到有相关进程信息

[root@localhost gadb]# lsof | grep aas_user
mysqld    2489               mysql   43uW     REG              253,0    131072  101400693 /var/lib/mysql/gadb/aas_user.ibd (deleted)
mysqld    2489 2605          mysql   43uW     REG              253,0    131072  101400693 /var/lib/mysql/gadb/aas_user.ibd (deleted)
mysqld    2489 2617          mysql   43uW     REG              253,0    131072  101400693 /var/lib/mysql/gadb/aas_user.ibd (deleted)

前面的2489 就是当前MySQL服务的进程PID,切换键进入对应进程ID目录 

[root@localhost proc]# cd /proc/2489/fd
[root@localhost fd]# ll
total 0
lrwx------. 1 mysql mysql 64 Apr 10 10:18 7 -> /tmp/ibzowklK (deleted)
lrwx------. 1 mysql mysql 64 Apr 10 10:18 8 -> /tmp/ibTwn0T5 (deleted)
lrwx------. 1 mysql mysql 64 Apr 10 10:18 9 -> /var/lib/mysql/ib_logfile1
[root@localhost fd]# ll | grep aas_user
lrwx------. 1 mysql mysql 64 Apr 10 10:18 43 -> /var/lib/mysql/gadb/aas_user.ibd (deleted)

ll查看会有很多信息,命令行工具标红的就是删除未释放的,找到误删的文件,复制恢复即可,建议按照删除前的目录结构恢复

[root@localhost fd]# cp 43 /var/lib/mysql/gadb/aas_user.ibd
[root@localhost fd]# 

如果只是删除了单个idb文件,到此就恢复了。如果删除的是目录,还得继续。

二、使用idb文件恢复数据。如果删除的是整个目录,那frm表结构文件是无法恢复的,需要自行创建表结构,另外表结构一定要和要误删的数据表结构一致,包括字段顺序,否则有可能会恢复乱码,甚至无法恢复。有的说进入十六进制界面直接编辑idb的tablespace_id的方法试了不好使,可能是哪里没搞明白。

新建一个备份恢复数据库,将数据库表结构导入或创建好,然后针对每个表执行以下操作:

1)执行SQL:ALTER TABLE product DISCARD TABLESPACE;

2)复制替换IDB文件,并修改权限:chown mysql.mysql   <table_name>.idb

3)执行SQL:ALTER TABLE product IMPORT TABLESPACE;

注:如果执行第三步报错,就是说明表结构不一致。如果执行成功,但是select  * 的时候报错:Error 2013 Lost connection to MySQL server during query ‘table’ at ... rows,那就是数据恢复有问题,可能是列错位导致字段类型不匹配,也需要重新调整表结构再恢复。另外恢复数据过程需要接触表的外键约束,否则无法重置表空间,需要删除各外键约束

如果表太多,自己写脚本。删除有风险,操作需谨慎,备份、备份、一定要备份!!!

### Windows 环境下 MySQL 误删数据恢复方法 在 Windows 环境下,当遇到 MySQL 中的数据被意外删除的情况时,可以通过启用二进制日志 (binlog) 来尝试恢复丢失的数据。此过程涉及定位并解析 binlog 文件中的事务记录,从中提取出可以用于回滚操作的日志条目。 #### 启用 Binlog 功能 如果服务器尚未开启 binlog 日志功能,则无法通过这种方式进行历史数据的还原工作。对于已经启用了该特性的实例来说,在配置文件 `my.ini` 或者 `my.cnf` 中应当存在如下所示的相关设定: ```ini [mysqld] server-id = 1 log_bin = C:/ProgramData/MySQL/MySQL Server 8.0/Data/mysql-bin.log expire_logs_days= 7 max_binlog_size = 100M ``` 上述配置项指定了 binlog 的存储位置以及一些基本参数[^2]。 #### 查找合适的 Binlog 文件 由于每次启动服务都会创建新的 binlog 文件,并按照顺序编号命名(例如:`mysql-bin.000001`, `mysql-bin.000002`),因此需要确认发生误操作前后的时间戳来确定具体要处理哪个或哪些文件。通常可以在默认安装路径下的 Data 目录里找到这些文件列表[^4]。 #### 解析 Binlog 并导出 SQL 脚本 利用命令行工具 `mysqlbinlog.exe` 可以读取指定时间段内的变更事件并将它们转换成可执行语句的形式保存到外部文件中。假设已知确切的发生事故时刻范围为 `"2023-XX-XX XX:XX:XX"` 到 `"2023-YY-YY YY:YY:YY"` ,那么可以根据实际情况调整下面这条指令里的日期部分来进行相应操作: ```bash mysqlbinlog --base64-output=decode-rows -v --database=testdb \ --start-datetime="2023-XX-XX XX:XX:XX" --stop-datetime="2023-YY-YY YY:YY:YY" \ "C:\ProgramData\MySQL\MySQL Server 8.0\Data\hostname-bin.######" > D:\recovery_script.sql ``` 这段脚本会把符合条件的所有更改动作都写入名为 `D:\recovery_script.sql` 的文本文件内等待后续分析和应用。 #### 执行恢复操作前准备 为了防止再次触发相同类型的错误,在正式实施任何补救措施之前建议先暂停应用程序对数据库的一切写入请求。另外还需要确保当前版本的服务端软件支持所使用的备份策略;必要情况下考虑升级至更稳定的发行版[^3]。 #### 应用生成好的 SQL 脚本来修复损坏的数据集 最后一步便是连接上目标库并通过源码管理器或者其他图形界面客户端加载刚刚制作完成的那个 `.sql` 文件作为输入流提交给解释引擎执行。这将重演那些曾经被执行过的增删改查命令从而达到撤销不期望变动的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值