很多年前,学习oracle10g的技术时,看过盖国强老师写的一篇文章,在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 -A

Database 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进程就会释放掉删除文件的句柄,你就真的访问不到被删除的文件了,这种情况下,要恢复被删除的表,就会很费时和费力了。

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

  1. 删除+mysql+用户密码_误删除mysql中的所用用户,如何重新设置root账号和密码

    在练习mysql语句的时候,使用delete将数据库中的所有用户删除了,其中也包括root用户.并进行了flush privileges:这时候发现重新登入mysql已经不能正常登陆.对此我们要重新设 ...

  2. java表单提交包含文件_如何同时提交表单中的文件和文本

    思路是把表单类型设置为enctype="multipart/form-data",其他表单中文本数据通过javascript处理,附加在action后面,后台通过request.g ...

  3. mysql重装 旧_重装mysql并使用旧数据

    [转载] MYSQL通过复制DATA文件夹内容恢复数据 在介绍此方法之前,提醒各位最好的转移数据的方法为: 在原来MYSQL服务器导出SQL文件,然后再在新的MYSQL服务器导入数据. 但是既然我们原 ...

  4. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

    MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...

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

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

  6. mysql怎么用sb文件_初识mysql数据库

    mysqld install :找到你的库 net start mysql ;启动mysql的服务端(server) mysql -uroot -p :启动mysql的客户端(Client) exit ...

  7. mysql语句导出数据库文件_通过Mysql命令行语句来导入、导出数据库文件

    Mysql命令行导出数据库: 1.首先我们通过命令行进入到mysql安装目录的bin目录下,比如我输入的命令行为: cd C:\Program Files\MySQL\MySQL Server 5.5 ...

  8. mysql 增量备份_云计算-开源数据库-备份

    关于备份: 备份原因:怕丢,怕被误删. 备份目标:数据的一致性,服务的可用性. 备份技术:物理备份/冷备份 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版 ...

  9. 释放mysql ibdata1文件_释放MySQL ibdata1文件的空间

    在MySQL数据库中,如果不指定innodb_file_per_table参数,单独存在每个表的数据,MySQL的数据都会存放在ibdata1文件. mysql ibdata1存放数据,索引等,是MY ...

最新文章

  1. Linux下磁盘分区工具cfdisk的使用
  2. 全球500强案例精选,带你了解人工智能在金融行业如何落地
  3. 深入理解文档/视图框架体系_九宫格项目开发感悟
  4. Google Closure Complier的使用
  5. python结巴_python结巴(jieba)分词
  6. Python面试常用二十题总结
  7. ajax 与route的区别,如何在Ajax.RouteLink中使用片段?
  8. java四舍五入自己写_java提高篇-----详解java的四舍五入与保留位
  9. 使用JDK自带jvisualvm监控tomcat(收藏)
  10. NOIP 2010 普及组解题报告
  11. Android开源项目及库汇总
  12. 服务器硬盘开机吱吱响,硬盘吱吱响怎么回事?电脑硬盘响动原因和解决方法
  13. 计算机网络的未来的发展前景,浅谈计算机网络的未来发展趋势
  14. JAVA Servlet进阶
  15. QT IOS风格音乐播放器(一) 项目介绍
  16. netfilter_queue
  17. 关于hover改变其他元素
  18. 当游戏直播遇上网课教育:虎牙、斗鱼的跨界梦圆的了吗?
  19. linux时间同步命令centos6,CentOS6.5搭建NTP服务器,并为思科交换机提供时间同步
  20. 对深色(黑夜)模式的执着追求

热门文章

  1. 这些电脑软件值得收藏哦
  2. 讲解通达信接口插件的编程源码运作过程
  3. 数字电路基础与Quartus-ll入门
  4. RabbitMQ(消息队列)私人学习笔记
  5. Unity 如何使用Edit Script (the script is an edit script)
  6. 【实时数仓】Day04-DWS层业务:DWS设计、访客宽表、商品主题宽表、流合并、地区主题表、FlinkSQL、关键词主题表、分词...
  7. 算法7:迪杰斯特拉算法
  8. 视频画质修复,老旧视频的模糊画质如何修复为4K画质?
  9. Linux批量巡检日志,linux 巡检报告
  10. 谈谈培训机构的-骗局-怎么避免被坑