在linux系统中,oracle数据库存活的时候,用系统命令rm删除一个数据文件,这个时候找到删除文件的fd文件句柄,就可以将删除的文件找回,当时感觉特别的神奇,竟然还有这种骚操作。

既然oracle数据库可以恢复删除的数据文件,那在MySQL数据库中能不能玩这样的骚操作呢,下面就是我做的模拟测试,一起来看看吧。

模拟测试表

[root@localhost] 10:18:14 [(none)]>use testdb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
[root@localhost] 10:18:19 [testdb]>
[root@localhost] 10:18:20 [testdb]>show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| t_test           |
| test1            |
+------------------+
2 rows in set (0.00 sec)[root@localhost] 10:18:24 [testdb]>select * from test1;
+----+-------+-------+
| id | name | name2 |
+----+-------+-------+
|  1 | test1 | test1 |
|  2 | test  | test  |
+----+-------+-------+
2 rows in set (0.01 sec)

查找Mysql数据库进程IP

[root@mysql ~]# ps -ef|grep -i mysqld|grep -i basedir|grep -v grep
mysql      7988   7159  1 10:17 pts/0    00:00:02 /data/mysql-5.7.26/bin/mysqld --defaults-file=/data/mysql/conf/3306/my.cnf --basedir=/data/mysql-5.7.26 --datadir=/data/mysql/data/3306 --plugin-dir=/data/mysql-5.7.26/lib/plugin --log-error=/data/mysql/log/3306/error.log --open-files-limit=65535 --pid-file=/data/mysql/run/3306/mysql.pid --socket=/data/mysql/run/3306/mysql.sock --port=3306

查看Mysql数据库进程所用使用的文件句柄

[root@mysql ~]# cd /proc/7988/fd
[root@mysql fd]# ll
总用量 0
lr-x------ 1 mysql mysql 64 9月  18 10:18 0 -> /dev/null
lrwx------ 1 mysql mysql 64 9月  18 10:18 42 -> /data/mysql/data/3306/mysql/tables_priv.MYD
lrwx------ 1 mysql mysql 64 9月  18 10:18 43 -> /data/mysql/data/3306/mysql/columns_priv.MYI
lrwx------ 1 mysql mysql 64 9月  18 10:18 44 -> /data/mysql/data/3306/mysql/columns_priv.MYD
lrwx------ 1 mysql mysql 64 9月  18 10:18 45 -> /data/mysql/data/3306/mysql/procs_priv.MYI
lrwx------ 1 mysql mysql 64 9月  18 10:18 46 -> /data/mysql/data/3306/mysql/procs_priv.MYD
lrwx------ 1 mysql mysql 64 9月  18 10:18 47 -> /data/mysql/data/3306/mysql/servers.ibd
lrwx------ 1 mysql mysql 64 9月  18 10:18 48 -> /data/mysql/data/3306/mysql/slave_master_info.ibd
lrwx------ 1 mysql mysql 64 9月  18 10:18 49 -> /data/mysql/data/3306/mysql/slave_relay_log_info.ibd
lrwx------ 1 mysql mysql 64 9月  18 10:18 5 -> /tmp/ibTITlZK (deleted)
lrwx------ 1 mysql mysql 64 9月  18 10:18 50 -> /data/mysql/data/3306/mysql/slave_worker_info.ibd
lrwx------ 1 mysql mysql 64 9月  18 10:18 51 -> /data/mysql/data/3306/mysql/event.MYI
lrwx------ 1 mysql mysql 64 9月  18 10:18 52 -> /data/mysql/data/3306/mysql/event.MYD
lrwx------ 1 mysql mysql 64 9月  18 10:21 53 -> socket:[39748]
lrwx------ 1 mysql mysql 64 9月  18 10:21 54 -> /data/mysql/data/3306/query_rewrite/rewrite_rules.ibd
lrwx------ 1 mysql mysql 64 9月  18 10:21 55 -> /data/mysql/data/3306/testdb/test1.ibd
lrwx------ 1 mysql mysql 64 9月  18 10:18 6 -> /tmp/ib3ojR5h (deleted)
lrwx------ 1 mysql mysql 64 9月  18 10:18 7 -> /tmp/ib9mkncP (deleted)
lrwx------ 1 mysql mysql 64 9月  18 10:18 8 -> /tmp/ibrfgk1T (deleted)
lrwx------ 1 mysql mysql 64 9月  18 10:18 9 -> /data/mysql/log/3306/redo/ib_logfile1

模拟删除业务表ibd文件

[mysql@mysql testdb]$ ls -l
total 728
-rw-rw-r--. 1 mysql mysql 485385 Jul 14 11:11 a.log
-rw-r-----. 1 mysql mysql     67 Jul 13 17:20 db.opt
-rw-r-----  1 mysql mysql   8618 Sep 18 10:31 test1.frm
-rw-r-----  1 mysql mysql  98304 Sep 18 10:32 test1.ibd
-rw-r-----. 1 mysql mysql   8618 Sep  9 15:23 t_test.frm
-rw-r-----. 1 mysql mysql 131072 Sep  9 15:25 t_test.ibd
[mysql@mysql testdb]$
[mysql@mysql testdb]$ rm test1.ibd
[mysql@mysql testdb]$ ls -l
total 632
-rw-rw-r--. 1 mysql mysql 485385 Jul 14 11:11 a.log
-rw-r-----. 1 mysql mysql     67 Jul 13 17:20 db.opt
-rw-r-----  1 mysql mysql   8618 Sep 18 10:31 test1.frm
-rw-r-----. 1 mysql mysql   8618 Sep  9 15:23 t_test.frm
-rw-r-----. 1 mysql mysql 131072 Sep  9 15:25 t_test.ibd

如果你在生产环境,不小心做了这个操作,估计这个时候已经背后一身冷汗了。

再次查看Mysql数据库进程所用使用的文件句柄

[root@mysql fd]# ls -l
lrwx------ 1 mysql mysql 64 9月  18 10:18 46 -> /data/mysql/data/3306/mysql/procs_priv.MYD
lrwx------ 1 mysql mysql 64 9月  18 10:18 47 -> /data/mysql/data/3306/mysql/servers.ibd
lrwx------ 1 mysql mysql 64 9月  18 10:18 48 -> /data/mysql/data/3306/mysql/slave_master_info.ibd
lrwx------ 1 mysql mysql 64 9月  18 10:18 49 -> /data/mysql/data/3306/mysql/slave_relay_log_info.ibd
lrwx------ 1 mysql mysql 64 9月  18 10:18 5 -> /tmp/ibTITlZK (deleted)
lrwx------ 1 mysql mysql 64 9月  18 10:18 50 -> /data/mysql/data/3306/mysql/slave_worker_info.ibd
lrwx------ 1 mysql mysql 64 9月  18 10:18 51 -> /data/mysql/data/3306/mysql/event.MYI
lrwx------ 1 mysql mysql 64 9月  18 10:18 52 -> /data/mysql/data/3306/mysql/event.MYD
lrwx------ 1 mysql mysql 64 9月  18 10:21 53 -> socket:[39748]
lrwx------ 1 mysql mysql 64 9月  18 10:21 54 -> /data/mysql/data/3306/query_rewrite/rewrite_rules.ibd
lrwx------ 1 mysql mysql 64 9月  18 10:21 55 -> /data/mysql/data/3306/testdb/test1.ibd (deleted)
lrwx------ 1 mysql mysql 64 9月  18 10:18 6 -> /tmp/ib3ojR5h (deleted)
lrwx------ 1 mysql mysql 64 9月  18 10:18 7 -> /tmp/ib9mkncP (deleted)
lrwx------ 1 mysql mysql 64 9月  18 10:18 8 -> /tmp/ibrfgk1T (deleted)
lrwx------ 1 mysql mysql 64 9月  18 10:18 9 -> /data/mysql/log/3306/redo/ib_logfile1
[root@mysql fd]#

这个表在一定的时间范围内,还是可以进行DML操作

[root@localhost] 10:49:54 [testdb]>update test1 set name2='dsljfld' where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
[root@localhost] 10:50:12 [testdb]>select * from test1;
+----+-------+---------+
| id | name  | name2   |
+----+-------+---------+
|  1 | test1 | test1   |
|  2 | test  | dsljfld |
+----+-------+---------+
2 rows in set (0.00 sec)
[root@localhost] 10:50:36 [testdb]>insert into test1 values(3,'dsf','sfsf');
Query OK, 1 row affected (0.01 sec)
[root@localhost] 10:50:45 [testdb]>select * from test1;
+----+-------+---------+
| id | name  | name2   |
+----+-------+---------+
|  1 | test1 | test1   |
|  2 | test  | dsljfld |
|  3 | dsf   | sfsf    |
+----+-------+---------+

为了保险起见,建议将这个表进行lock操作,只能read操作

[root@localhost] 10:58:17 [testdb]>lock tables test1 read;
Query OK, 0 rows affected (0.00 sec)[root@localhost] 10:59:07 [testdb]>
[root@localhost] 10:59:09 [testdb]>insert into test1 values(4,'esdsf','dfesfsf');
ERROR 1099 (HY000): Table 'test1' was locked with a READ lock and can't be updated

你会发现,刚才rm test1.ibd文件,在这里还可以看到,这个时候,我们要做的是,赶紧将这个文件拷贝回去。

[mysql@mysql fd]$ cp /proc/9015/fd/54 /data/mysql/data/3306/testdb/test1.ibd[mysql@mysql testdb]$ ls -l
total 728
-rw-rw-r--. 1 mysql mysql 485385 Jul 14 11:11 a.log
-rw-r-----. 1 mysql mysql     67 Jul 13 17:20 db.opt
-rw-r-----  1 mysql mysql   8618 Sep 18 10:31 test1.frm
-rw-r-----  1 mysql mysql  98304 Sep 18 11:01 test1.ibd
-rw-r-----. 1 mysql mysql   8618 Sep  9 15:23 t_test.frm
-rw-r-----. 1 mysql mysql 131072 Sep  9 15:25 t_test.ibd

可以看到文件已经完全找回去了。这个时候,可以将表的read lock释放了

[root@localhost] 11:02:56 [testdb]>unlock tables;Query OK, 0 rows affected (0.00 sec)[root@localhost] 11:03:25 [testdb]>insert into test1 values(4,'esdsf','dfesfsf');
Query OK, 1 row affected (0.00 sec)

此时你重启MySQL数据库都是没有任何问题的。

总结

为什么能通过这种方式,恢复rm掉的ibd文件呢,主要是因为当我们用rm命令删除的时候,Mysql数据库进程还在持有被删除的ibd文件的句柄,也就是在/proc/{mysql_pid}/pd目录下可以找到,如果你这个时候,重启了Mysql数据库实例,Mysql进程就会释放掉删除文件的句柄,你就真的访问不到被删除的文件了,这种情况下,要恢复被删除的表,就会很费时和费力了。

https://mp.weixin.qq.com/s/qcPR3MXCf9dMg5DItxd23g

误删除MySQL数据库表的ibd文件怎么办相关推荐

  1. 删除 mysql ibd文件_误删除MySQL数据库表的ibd文件怎么办

    很多年前,学习oracle10g的技术时,看过盖国强老师写的一篇文章,在linux系统中,oracle数据库存活的时候,用系统命令rm删除一个数据文件,这个时候找到删除文件的fd文件句柄,就可以将删除 ...

  2. MySQL存储引擎 lnnoDB逻辑架构 innodb存储引擎表空间(ibd文件)详解 回滚日志的物理空间

    文章目录 存储引擎 一 MySQL组织架构 二 查看存储引擎信息 三 修改存储引擎 3.1 配置文件修改存储引擎 3.2 临时修改存储引擎 3.3 建表时修改存储引擎 四 存储引擎实验 五 数据库升级 ...

  3. python亿级mysql数据库导出_Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法...

    本文实例讲述了python实现将MySQL数据库表中的数据导出生成csv格式文件的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python # -*- coding:utf- ...

  4. mysql数据库表删了重建error_数据库内核月报 - 2015 / 09-MySQL · 捉虫动态 · 建表过程中crash造成重建表失败-阿里云开发者社区...

    问题描述 主库的create table语句传到备库,备库SQL线程执行过程中报错: Error 'Can't create table 'XXX.XX' (errno: -1)' on query. ...

  5. unicode表_Python数据库操作 Mysql数据库表引擎与字符集#学习猿地

    # Mysql数据库表引擎与字符集 ![](./imgs/752951346A5F4E7EBDE362FA97107707.png) ### 1.服务器处理客户端请求 其实不论客户端进程和服务器进程是 ...

  6. 7.Mysql数据库表引擎与字符集

    7.Mysql数据库表引擎与字符集 1.服务器处理客户端请求 其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送 一段文本(MySQL语句),服务器进 ...

  7. MySQL数据库表引擎与字符集

    Mysql数据库表引擎与字符集 1.服务器处理客户端请求 其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送 一段文本(MySQL语句),服务器进程处 ...

  8. 程序员面试之MySQL数据库表的设计

    如果要选择一门程序员必备的技能,那答案无疑是数据库,而MySQL是首选.很多企业在面试过程中会提问MySQL数据库表设计要注意什么,接下来小千就给大家讲解一下. MySQL相较于MSSQL SERVE ...

  9. 织梦数据库改mysql前缀_织梦快速批量修改MYSQL数据库表前缀与表名实例操作

    这篇文章主要为大家详细介绍了织梦快速批量修改MYSQL数据库表前缀与表名实例操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. 我们在安装织梦系统的时候,有一次 ...

最新文章

  1. python查看和更改当前工作目录
  2. Node.js静态文件服务器实战[转]
  3. Flex Builder 4.6 正式版eclipse插件利用BlazeDS于java交互实例
  4. delphi 怎么监测image有没有变动_社会舆情监测引导应对解决方案
  5. 韩国研制出世界最薄光伏电池:厚度仅为人类头发直径百分之一
  6. [Nginx]负载均衡和动静分离
  7. AsyncTask doinbackground onProgressUpdate onCancelled onPostExecute的基本使用
  8. [Erlang危机](4.4)命名管道
  9. Docker学习文档之三 其他相关-安全性
  10. cr3格式是什么意思_尼康DX镜头是什么意思
  11. servletContextListener定时任务使用
  12. jdk文件夹里点哪个是安装_jdk在哪个文件夹里面
  13. 北京市海淀区卫星地图离线包下载
  14. Java从入门到精通章节练习题——第三章
  15. OFDM学习、编程实现
  16. 函数指针和指针函数有什么区别
  17. 应用宝上架审核要求_Android应用商店上架审核要求
  18. Node.js详细下载与安装
  19. linux 常用命令——MySql 5.7添加用户、删除用户与授权
  20. java[逾期检测]开发图书租借系统

热门文章

  1. hosts ip 指向ip_不同网段共享打印机?不同IP段怎么共享打印机?
  2. Keyphrase Extraction 一个快速从中文里抽取关键短语的工具
  3. java不重复的随机数_Javascript获取不重复的随机数值
  4. mysql 5.5.29 winx64_【转载】MySQL 5.7.29详细下载安装配置教程winx64
  5. linux xargs命令选项,使用xargs命令在Linux中执行多个操作 | MOS86
  6. 阿里巴巴2013实习招聘笔试题5月19日
  7. [转载]Qt之获取本机网络信息_vortex_新浪博客
  8. jmeter 聚合报告说明_Jmeter 测试结果分析之聚合报告简介
  9. JAVA读取属性文件的几种方法
  10. 2017年下半年软考合格标准出炉啦