网站首页 > 技术文章 正文
很多年前,学习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)
总结
为什么能通过这种方式,恢复rm掉的ibd文件呢,主要是因为当我们用rm命令删除的时候,Mysql数据库进程还在持有被删除的ibd文件的句柄,也就是在/proc/{mysql_pid}/pd目录下可以找到,如果你这个时候,重启了Mysql数据库实例,Mysql进程就会释放掉删除文件的句柄,你就真的访问不到被删除的文件了,这种情况下,要恢复被删除的表,就会很费时和费力了。
猜你喜欢
- 2024-10-26 详解mysql delete删除记录数据库空间不减少问题三种解决方法
- 2024-10-26 mysql delete删除记录数据库空间还是不减少?试试这三个办法
你 发表评论:
欢迎- 635℃几个Oracle空值处理函数 oracle处理null值的函数
- 627℃Oracle分析函数之Lag和Lead()使用
- 615℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 610℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 607℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 601℃【数据统计分析】详解Oracle分组函数之CUBE
- 589℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 575℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- CVE-2025-30762|Oracle(java oracle)
- 低代码可能铲不掉“屎山”,但能让这个它更有「型」
- 科技大事件:新苹果手表可通过击掌或握手来传递信息
- 你的百万级上下文窗口大模型,可能并没有你想象中那么强
- DApp 开发中的安全测试(软件测试过程中安全测试的具体应用场景和测试思路)
- 盘点Java中最没用的知识⑧:这3个过时套路,你还在代码里硬撑?
- 机房硬件设备及Oracle数据库软件维护服务项目竞争性磋商公告
- 微软与甲骨文扩大合作关系,推出Oracle Database@Azure
- JPA实体类注解,看这篇就全会了(java实体类注解)
- Java反射机制最全详解(图文全面总结)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)