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

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

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

1、构建模拟数据

模拟数据准备:

CREATE TABLE `t1` (                             `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4mysql> select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+
5 rows in set (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/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/multi/3303/private/bin/mysqld_safe --defaults-file=/mysql/multi/3303/etc/my.cnf
mysql    23356  0.2  1.1 19529408 1568416 ?    Sl   11:47   0:04 /mysql/multi/3303/private/bin/mysqld --defaults-file=/mysql/multi/3303/etc/my.cnf --basedir=/mysql/multi/3303/private --datadir=/mysql/multi/3303/data --plugin-dir=/mysql/multi/3303/private/lib/plugin --user=mysql --log-error=/mysql/multi/3303/log/mysql-error.log --open-files-limit=65535 --pid-file=/mysql/multi/3303/pid/mysql.pid --socket=/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/multi/3303/data/mysql/time_zone.ibdlrwx------ 1 root root 64 Nov 22 11:52 4 -> /mysql/multi/3303/data/ib_logfile0lrwx------ 1 root root 64 Nov 22 11:52 40 -> /mysql/multi/3303/data/mysql/time_zone_transition.ibdlrwx------ 1 root root 64 Nov 22 11:52 42 -> /mysql/multi/3303/data/test/t1.ibd (deleted)
复制代码

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

5、恢复处理操作

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

#目标端
[root@admin-db64 3306]# nc -l 13306 > /mysql/multi/3306/data/t1.ibd  #db64这台服务器上,3306实例中来恢复上述被删除的数据。/mysql/mysql/multi/3306/data为临时存放数据目录#远端
lrwx------ 1 root root 64 Nov 22 11:52 42 -> /mysql/multi/3303/data/test/t1.ibd (deleted)
[root@admin-db62 fd]# cat 42 | nc 10.26.65.74 13306#如上操作,将在OS层,内存里的数据拷贝并传输至远程恢复服务器上。
复制代码

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

6、恢复数据处理

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

[root@admin-db64 3306]# nc -l 13306 > /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 商量备份的周期、是否有必要创建延迟复制的备库等等。

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

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

  1. linux共享文件丢失,【干货分享】linux平台下数据文件被误删后,如何及时得知并进行恢复...

    原标题:[干货分享]linux平台下数据文件被误删后,如何及时得知并进行恢复 我们知道在windows平台下,一旦文件在程序中打开,则不能被删除,所以不存在误删数据文件的情况,如下图所示. 但是在LI ...

  2. mysql 数据文件压缩,压缩MySQL数据文件的妙招

    MySQL数据文件如果过大,能否进行压缩呢?答案是肯定的.下面就教您一个压缩MySQL数据文件的方法,希望对您能有所帮助. MySQL使用一段时间后,MySQL数据文件ibdata会增长得很大(主要是 ...

  3. 电脑里的文件夹被误删了怎么恢复?

    对于经常办公的小伙伴,总是会遇到文档文件堆积过多.导致电脑桌面杂乱无章等情况,影响我们使用文档,合理的桌面整理和文档分类管理,可以让我们更好的使用自己的电脑,进而保证了工作质量;而整理删除很快捷,但遇 ...

  4. 文件夹误删了怎么恢复

    文件夹误删了怎么恢复?我们的很多文件都存储在电脑里,以便于在日常办公中使用到,但这会让我们桌面的文件或文件夹越来越多,查找起文件来会比较麻烦了.所以就我们需要定期清理电脑上文件或文件夹.而很多文件会存 ...

  5. 修改mysql文件位置_如何修改mysql数据文件存储位置

    如果想更换mysql的数据文件的存储位置,则: Centos下: 查看MYSQL数据文件存储路径 mysql>show variables like '%datadir%'; # /usr/lo ...

  6. mysql检查文件_如何检查和修复MySQL数据文件?

    如何检查和修复MySQL数据文件?今天服务器突然宕机! 郁闷,这家伙又跟我找麻烦!让IDC数据中心重启以后,发现游戏服务器程序竟然无法启动了! 我晕!赶紧查看日志!原来mysql某个表竟然无法读取 0 ...

  7. mysql中如何迁移数据文件,迁移mysql数据文件存放位置

    迁移mysql数据文件存放位置 (2012-01-11 14:46:30) 标签: mysql db datafile 数据 文件 1.备份当前的数据库 2.停止mysql服务 root@box:~/ ...

  8. 详述查看 MySQL 数据文件存储位置的方法

    我们可能会有一个疑惑,那就是:当我们在本地(自己的电脑)安装完 MySQL 之后,也创建了很多的数据库啊.表啊,也存储了很多的数据啊,但是这些内容都存储到哪里了呢?特别是,当我们需要直接操作这些数据文 ...

  9. oracle 文件大小为零,windows Oracle数据文件大小为0的恢复case

    本站文章除注明转载外,均为本站原创: 转载自love wife love life -Roger 的Oracle技术博客 本文链接地址: windows Oracle数据文件大小为0的恢复case 一 ...

最新文章

  1. UBI 文件系统移植 sys 设备信息【转】
  2. 每日一皮:当我突然有一个很棒的调试想法...
  3. c/c++在windows下获取时间和计算时间差的几种方法总结
  4. postgresql 编码_上万份编码测试,大数据统计反映了公司在招聘时倾向的技能是什么...
  5. 如何使用git rm 删除文件名里带空格的文件名
  6. hough变换直线检测_python+opencv实现霍夫变换检测直线
  7. [BZOJ3173][Tjoi2013]最长上升子序列
  8. python六十七课——网络编程(基础知识了解)
  9. 家庭NAS存储服务器给我们带来了什么
  10. JavaScript输出数组中有几个字符串中包含“a”或“A”
  11. HTTP方式文件分片断点下载
  12. vc707(virtex7)led 实验例程
  13. activiti之奇淫技巧一(自动完成首个任务)
  14. 解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。
  15. Android:圆形头像
  16. 原码 反码 补码 移码(变补)补码与移码的作用
  17. win休眠模式+定时休眠
  18. Linux内核模块管理
  19. 过滤掉URL中的参数部分
  20. Vue 使用vue-seo-phantomjs 实现SEO抓取优化方案

热门文章

  1. BOSSCMS V2.0 已发布,免费可商用的开源CMS系统
  2. Python科研绘图第一期——线型图(Line)、条型图(Bar)、散点图(Scatter)、子图(subplot)
  3. 天勤数据结构笔记——第六章 树与二叉树(代码)
  4. 一步步学习微软InfoPath2010和SP2010--第一章节--介绍InfoPath2010(2)--InfoPath2010的新功能
  5. 大量测试数据填充数据库
  6. matlab修改图像分辨率_matlab – 增加灰度图像的分辨率
  7. shiro框架使用bug
  8. Allegro如何出Gerber文件
  9. 静态网页与动态网页的理解
  10. 常用java工具代码备忘