MySQL数据文件被误删,如何进行恢复?

​hello,大家好,我是张张,「架构精进之路」公号作者。

在我们实际工作中,尤其在公司的测试环境下,经常会有多个业务方服务共用同一套服务器,部署自身MySQL环境。很不巧的是,会出现有MySQL数据文件被删除/误删除的情况发生。假如真的发生了,想想就很令人崩溃对不对?

先别着急,今天来跟大家分享一个对于MySQL数据文件被误删除后尝试恢复的办法。一旦发生上述情况,同时实例数据未做备份,是否有机会进行数据恢复呢?

接下来,就让我们来尝试下数据恢复过程的演示:

1.构建模拟数据

模拟数据准备:

CREATETABLE `t1` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

mysql>select*from t1;
+------+
| id |
+------+
|1|
|2|
|3|
|4|
|5|
+------+
5 rows inset(0.00 sec)

2.删除数据文件

在操作系统层进行数据文件的删除。


[root@admin-db12 test]# ll
total 112
-rw-r----- 1 mysql mysql 67 Nov 22 10:01 db.opt
-rw-r----- 1 mysql mysql 8556 Nov 22 11:48 t1.frm
-rw-r----- 1 mysql mysql 98304 Nov 22 11:48 t1.ibd
[root@admin-db12 test]# pwd
/mysql/dba/mysql/multi/3303/data/test
[root@admin-db12 test]# ll
total 112
-rw-r----- 1 mysql mysql 67 Nov 22 10:01 db.opt-rw-r----- 1 mysql mysql 8556 Nov 22 11:48 t1.frm-rw-r----- 1 mysql mysql 98304 Nov 22 11:48 t1.ibd
[root@admin-db12 test]# rm -rf *
[root@admin-db12 test]# ll
total 0

3.查询验证数据

在数据库层,查看当前表中数据,发现当前表数据目前已空空如也。

#当前实例
mysql> select * from t1;
Empty set (0.00 sec)

4.OS层获取内存中的数据

当前实例没有关闭的情况下,查看实例pid。


[root@admin-db62 test]# ps aux | grep 3303
root 21952 0.0 0.0 113304 1648 ? S 11:47 0:00 /bin/sh /mysql/dba/mysql/multi/3303/private/bin/mysqld_safe --defaults-file=/mysql/dba/mysql/multi/3303/etc/my.cnf
mysql 23356 0.2 1.1 19529408 1568416 ? Sl 11:47 0:04 /mysql/dba/mysql/multi/3303/private/bin/mysqld --defaults-file=/mysql/dba/mysql/multi/3303/etc/my.cnf --basedir=/mysql/dba/mysql/multi/3303/private --datadir=/mysql/dba/mysql/multi/3303/data --plugin-dir=/mysql/dba/mysql/multi/3303/private/lib/plugin --user=mysql --log-error=/mysql/dba/mysql/multi/3303/log/mysql-error.log --open-files-limit=65535 --pid-file=/mysql/dba/mysql/multi/3303/pid/mysql.pid --socket=/mysql/dba/mysql/multi/3303/socket/mysql.sock --port=3303
[root@admin-db62 fd]# cd /proc/23356/fd
[root@admin-db62 fd]# ll
lrwx------ 1 root root 64 Nov 22 11:52 39 -> /mysql/dba/mysql/multi/3303/data/mysql/time_zone.ibdlrwx------ 1 root root 64 Nov 22 11:52 4 -> /mysql/dba/mysql/multi/3303/data/ib_logfile0lrwx------ 1 root root 64 Nov 22 11:52 40 -> /mysql/dba/mysql/multi/3303/data/mysql/time_zone_transition.ibdlrwx------ 1 root root 64 Nov 22 11:52 42 -> /mysql/dba/mysql/multi/3303/data/test/t1.ibd (deleted)

通过上述操作我们发现,被我们干掉的数据文件显示状态为”deleted“,被删除。

5.获取处理数据

为保护好当前服务器现场、在另一台服务器上开始恢复数据。

#目标端
[root@admin-db64 3306]# nc -l 13306>/mysql/dba/mysql/multi/3306/data/t1.ibd #db64这台服务器上,3306实例中来恢复上述被删除的数据。/mysql/dba/mysql/multi/3306/data为临时存放数据目录

#源端
lrwx------ 1 root root 64 Nov 22 11:52 42 -> /mysql/dba/mysql/multi/3303/data/test/t1.ibd (deleted)
[root@admin-db62 fd]# cat 42| nc 10.26.65.7413306

#如上操作,将在OS层,内存里的数据拷贝并传输至远程恢复服务器上。

【注意】不要在本机进行恢复、保留线上环境,避免二次伤害。

6.恢复数据处理

在源端服务器进行数据恢复操作。

[root@admin-db64 3306]# nc -l 13306 > /mysql/dba/mysql/multi/3306/data/t1.ibd
[root@admin-db64 3306]# cd data/
[root@admin-db64 data]# ll
total 100
-rw-r----- 1 mysql mysql 67 Nov 22 12:36 db.opt-rw-r--r-- 1 root root 98304 Nov 22 12:37 t1.ibd
[root@admin-db64 data]# chown -R mysql.mysql t1.ibd #更改属主

登录源端进行恢复实例操作:

mysql > use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)

#1、根据表结构创建表(不要告诉我表结构也已经没有了...)
CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

#2、discard 表空间
mysql> alter table t1 discard tablespace;
Query OK, 0 rows affected, 1 warning (0.01 sec)

#3、将上面准备好的数据文件放入正确目录
[root@admin-db64 data]#mv t1.ibd test/

#4、import 表空间
mysql> alter table t1 import tablespace;
Query OK, 0 rows affected, 1 warning (0.01 sec)

#5、查看数据是否可以正常查看
mysql> select * from t1;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (0.00 sec)

通过上述步骤的操作,发现数据已经可以正常查看,后面只需要将其备份出来,恢复到待恢复实例即可。此处不再赘述。

写在最后

今天跟大家分享了一种误删数据文件利用内存数据恢复的方法,其实还有一些其他的恢复方法,需要根据不同场景去选取最优的处理方案。

最后,需要跟大家强调的是:预防远比处理的意义大得多。

另外,在 MySQL 的集群方案中,会时不时地用到备份来恢复实例,因此定期检查备份的有效性也很有必要。如果你是业务开发同学,你可以用 show grants 命令查看账户的权限,如果权限过大,可以建议 DBA 同学给你分配权限低一些的账号;你也可以评估业务的重要性,和 DBA 商量备份的周期、是否有必要创建延迟复制的备库等等。 

记住,数据和服务的可靠性不止是运维团队的工作,最终是各个合作环节一起保障的结果。 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/277651.html<

(0)
管理的头像管理
上一篇2025-05-11 05:30
下一篇 2025-05-11 05:32

相关推荐

  • 站群服务器如何批量管理更高效,有哪些管理技巧?

    站群服务器批量管理想提效,自动化是唯一出路,通过统一配置管理工具与面板系统,结合服务商提供的底层基础设施支持,能将运维效率提升数倍,批量管理的核心痛点与解决思路多台站群服务器分散管理,最常见的问题就是重复劳动,每次软件更新、配置修改、安全加固,都需要逐台登录操作,不仅耗时,还容易漏掉某台机器,更头疼的是,一旦某……

    2026-07-27
    0
  • 服务器磁盘IO过高如何优化?,磁盘IO过高的原因有哪些?

    服务器磁盘IO过高,核心优化路径是“先定位、再分流、后升级”,你需要通过系统工具精确判断究竟是应用程序、日志策略还是硬件瓶颈导致,然后针对性地从代码、缓存、存储架构和硬件选型四个层面下手,其中选择持有持牌自营机房和增值电信业务经营许可证的服务商,能从根本上保障底层IO稳定性,定位IO瓶颈:动手优化的第一步盲目优……

    2026-07-27
    0
  • 跨境网站访问延迟高怎么解决,网站访问慢的原因是什么?

    跨境网站访问延迟高的核心解决思路在于多维度优化网络路径,包括使用全球CDN加速、选择靠近目标区域的优质IDC机房、调整传输协议以及精简应用层资源,其中服务商的基础设施质量直接决定优化上限,为什么跨境访问延迟高?三大核心因素物理距离与光速限制数据包在海底光缆中的传输速度受限于介质,从中国到美国西海岸的物理往返时间……

    2026-07-27
    0
  • 站群服务器到底是什么意思,怎么选择比较好

    站群服务器就是一台拥有多个独立IP地址、专门用于托管和管理多个网站的高性能服务器,其核心价值在于通过独立IP降低网站间的关联风险,并提升搜索引擎优化效果,站群服务器的工作原理与适用场景站群服务器本质上是将一台物理服务器通过虚拟化或直接配置的方式,分配给多个独立IP地址,每个IP对应一个独立的网站,这些网站共享服……

    2026-07-27
    0
  • 高防服务器误封正常流量如何调整,怎么解决?

    高防服务器误封正常流量,核心调整思路是从“一刀切”转向“精细化”——通过分析业务特征,调整防护阈值、配置白名单和启用智能学习模式,让防护系统学会区分真假流量,为什么会误封正常流量误封主要源于防护策略的通用化,高防服务器通常默认启用严格防护规则,当流量特征与攻击特征库部分匹配时,就会被拦截,据行业安全白皮书指出……

    2026-07-27
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注