在实际工作中,数据文件被RM -RF掉的情况比较少见,常见的是DROP TABLE ,TRUNCATE TABLE,DELETE FROM TABLE WHERE 1=1;
如果遇到了RM掉数据文件时,千万不要慌张,HOLD住,停止所有的操作,保留现场。下面的方法可以找回丢失的数据文件。
1:创建测试表,写入数据
mysql> create table tt(a int) engine=myisam; Query OK, 0 rows affected (0.13 sec) mysql> insert into tt values(10),(20),(30); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from tt; +------+ | a | +------+ | 40 | | 50 | | 60 | +------+ 3 rows in set (0.00 sec)
2:删除表数据文件,APP继续往表里写数据,写入是可以成功的(文件句柄依然存在)
[root@brucetest6 fd]# rm -fr /var/lib/mysql/test/tt*
mysql> insert into tt values(400),(500),(600);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from tt;
+------+
| a |
+------+
| 40 |
| 50 |
| 60 |
| 400 |
| 500 |
| 600 |
+------+
6 rows in set (0.00 sec)
3:找到MYSQL的进程PID
[root@brucetest6 ~]# netstat -ntlp | grep mysqld tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 31559/mysqld
4:到/proc/PID/fd下找到被删除的文件
[root@brucetest6 ~]# ll /proc/31559/fd|grep a.MY lrwx------ 1 root root 64 Oct 17 15:46 39 -> (deleted)/var/lib/mysql/test/tt.MYI lrwx------ 1 root root 64 Oct 17 15:46 40 -> (deleted)/var/lib/mysql/test/tt.MYD
5:把文件拷贝回去
[root@brucetest6 fd]# cp 39 /var/lib/mysql/test/tt.MYI [root@brucetest6 fd]# cp 40 /var/lib/mysql/test/tt.MYD [root@brucetest6 fd]# ll /var/lib/mysql/test/ total 12 -rw-rw---- 1 mysql mysql 65 Aug 7 17:12 db.opt -rw-r----- 1 root root 42 Aug 21 15:14 tt.MYD -rw-r----- 1 root root 1024 Aug 21 15:14 tt.MYI
6:此时,还缺少一个tt.frm,这个好办,在另外的库里建一个表结构完全一样的表,把FRM文件拷贝过来就是,修改拷贝过来的文件属主信息。
[root@brucetest6 fd]# ll /var/lib/mysql/test/ total 24 -rw-rw---- 1 mysql mysql 65 Aug 7 17:12 db.opt -rw-r----- 1 mysql mysql 8554 Aug 21 15:21 tt.frm -rw-r----- 1 mysql mysql 42 Aug 21 15:14 tt.MYD -rw-r----- 1 mysql mysql 1024 Aug 21 15:14 tt.MYI
7:数据恢复。
需要注意的是,在RM掉数据文件之后,不要做FLUSH TABLES或者重启数据库操作。
相关博文:
1:http://hcymysql.blog.51cto.com/5223301/1004810
2:http://www.mysqlperformanceblog.com/2012/08/10/recovery-deleted-ibdata1/