牛蛙资源网 - 只为资源而生,分享永无止境
牛蛙资源网-只为资源而生,分享永无止境,牛蛙网

数据库中mysql误删除表如何恢复(mysql数据库可以删除ibd文件吗)

牛蛙小编 交流杂谈

local58最后停播了吗 ,mysql数据库误删除怎么还原

很多年前,学习oracle10g的技术时,看过盖国强老师写的一篇文章,在linux系统中,oracle数据库存活的时候,用系统命令rm删除一个数据文件,这个时候找到删除文件的fd文件句柄,就可以将删除的文件找回,当时感觉特别的神奇,竟然还有这种骚操作。

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

MySQL

模拟测试表

[root@localhost 10:18:14 [(none)>use testdbReading table rmation for completion of table and column namesYou 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 grepmysql 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总用量 0lr-x------ 1 mysql mysql 64 9月 18 10:18 0 -> /dev/nulllrwx------ 1 mysql mysql 64 9月 18 10:18 42 -> /data/mysql/data/3306/mysql/tables_priv.MYDlrwx------ 1 mysql mysql 64 9月 18 10:18 43 -> /data/mysql/data/3306/mysql/columns_priv.MYIlrwx------ 1 mysql mysql 64 9月 18 10:18 44 -> /data/mysql/data/3306/mysql/columns_priv.MYDlrwx------ 1 mysql mysql 64 9月 18 10:18 45 -> /data/mysql/data/3306/mysql/procs_priv.MYIlrwx------ 1 mysql mysql 64 9月 18 10:18 46 -> /data/mysql/data/3306/mysql/procs_priv.MYDlrwx------ 1 mysql mysql 64 9月 18 10:18 47 -> /data/mysql/data/3306/mysql/servers.ibdlrwx------ 1 mysql mysql 64 9月 18 10:18 48 -> /data/mysql/data/3306/mysql/slave_master_.ibdlrwx------ 1 mysql mysql 64 9月 18 10:18 49 -> /data/mysql/data/3306/mysql/slave_relay_log_.ibdlrwx------ 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_.ibdlrwx------ 1 mysql mysql 64 9月 18 10:18 51 -> /data/mysql/data/3306/mysql/event.MYIlrwx------ 1 mysql mysql 64 9月 18 10:18 52 -> /data/mysql/data/3306/mysql/event.MYDlrwx------ 1 mysql mysql 64 9月 18 10:21 53 -> socket:[39748lrwx------ 1 mysql mysql 64 9月 18 10:21 54 -> /data/mysql/data/3306/query_rewrite/rewrite_rules.ibdlrwx------ 1 mysql mysql 64 9月 18 10:21 55 -> /data/mysql/data/3306/testdb/test1.ibdlrwx------ 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 -ltotal 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 -ltotal 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 -llrwx------ 1 mysql mysql 64 9月 18 10:18 46 -> /data/mysql/data/3306/mysql/procs_priv.MYDlrwx------ 1 mysql mysql 64 9月 18 10:18 47 -> /data/mysql/data/3306/mysql/servers.ibdlrwx------ 1 mysql mysql 64 9月 18 10:18 48 -> /data/mysql/data/3306/mysql/slave_master_.ibdlrwx------ 1 mysql mysql 64 9月 18 10:18 49 -> /data/mysql/data/3306/mysql/slave_relay_log_.ibdlrwx------ 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_.ibdlrwx------ 1 mysql mysql 64 9月 18 10:18 51 -> /data/mysql/data/3306/mysql/event.MYIlrwx------ 1 mysql mysql 64 9月 18 10:18 52 -> /data/mysql/data/3306/mysql/event.MYDlrwx------ 1 mysql mysql 64 9月 18 10:21 53 -> socket:[39748lrwx------ 1 mysql mysql 64 9月 18 10:21 54 -> /data/mysql/data/3306/query_rewrite/rewrite_rules.ibdlrwx------ 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=2Query 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 readQuery 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 -ltotal 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 tablesQuery 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进程就会释放掉删除文件的句柄,你就真的访问不到被删除的文件了,这种情况下,要恢复被删除的表,就会很费时和费力了。

误删mysql库表数据,mysql数据库可以删除ibd文件吗


    收藏永久发布页,不迷路
    关键词不能为空

免责声明:

本站提供的资源,都来自网络,版权争议与本站无关,所有内容及软件的文章仅限用于学习和研究目的。不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,我们不保证内容的长久可用性,通过使用本站内容随之而来的风险与本站无关,您必须在下载后的24个小时之内,从您的电脑/手机中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。侵删请致信E-mail: 1470282@qq.com

我来说两句
签到
交流杂谈 数据库中mysql误删除表如何恢复(mysql数据库可以删除ibd文件吗)
local58最后停播了吗 ,mysql数据库误删除怎么还原 很多年前,学习oracle10g的技术时,看过盖国强老师写的一篇文章,在linux系统中,or...
扫描二维码阅读原文 扫描二维码阅读原文
牛蛙资源网 January, 01
生成社交图 ×