Step 1: 建表,写数据,session1
mysql> create table tt(a int) engine=myisam;
Query OK, 0 rows affected (0.11 sec)
 
mysql> insert into tt values(1),(2);
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0
 
mysql> select * from tt;
+------+
| a    |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec):Step 2:移走数据文件,session2
[root@brucetest6 ~]# cd /var/lib/mysql/test/
[root@brucetest6 test]# ll
total 76
-rw-rw---- 1 mysql mysql 12674 Aug  7 17:18 a.frm
-rw-rw---- 1 mysql mysql    65 Aug  7 17:12 db.opt
-rw-rw---- 1 mysql mysql  8554 Aug 16 16:53 iii.frm
-rw-rw---- 1 mysql mysql  8614 Aug 15 14:01 ta.frm
-rw-rw---- 1 mysql mysql  8588 Aug 15 14:01 tb.frm
-rw-rw---- 1 mysql mysql  8554 Aug 21 11:19 tt.frm
-rw-rw---- 1 mysql mysql    14 Aug 21 11:19 tt.MYD
-rw-rw---- 1 mysql mysql  1024 Aug 21 11:19 tt.MYI
[root@brucetest6 test]# pwd
/var/lib/mysql/test
[root@brucetest6 test]# mv tt* /tmp/Step 3:
[root@brucetest6 test]#   pidof mysqld
3215[root@brucetest6 test]# lsof | grep deleted |more
mysqld     3215  mysql    5u      REG               0,23          0   50073583  (deleted)/tmp/ibfSlW1V
mysqld     3215  mysql    6u      REG               0,23          0   50073592  (deleted)/tmp/ibNz4G4Z
mysqld     3215  mysql    7u      REG               0,23          0   50074224  (deleted)/tmp/ibKf3r73
mysqld     3215  mysql    8u      REG               0,23          0   50074232  (deleted)/tmp/ibevR7d9
mysqld     3215  mysql   13u      REG               0,23          0   50074239  (deleted)/tmp/ibQcqLUeStep 4:继续插入数据,session1
mysql> insert into tt values(10),(20);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
 
mysql> select * from tt;
+------+
| a    |
+------+
|    1 |
|    2 |
|   10 |
|   20 |
+------+
4 rows in set (0.00 sec)mysql> flush tables;
Query OK, 0 rows affected (0.07 sec)
 
mysql> select * from tt;
ERROR 1146 (42S02): Table 'test.tt' doesn't exist
mysql> Step 5: 把数据文件MV回来,查找数据,正常session2
[root@brucetest6 test]# mv /tmp/tt.* .mysql> select * from tt;  #session1
+------+
| a    |
+------+
|    1 |
|    2 |
|   10 |
|   20 |
+------+
4 rows in set (0.01 sec)
我的问题是
1:正常情况下,如果库里面的全部文件MV走了,APP还是可以继续增删改,那么会产生很大的问题。2:测试发现,MYSQL系统库都是可以被直接RM的,RM之后,不影响继续登录操作

解决方案 »

  1.   

    因为文件的状态是打开的 所以还可以继续操作
    如果关闭数据库  然后mv掉数据   则不可以访问
    文件打开的位置在/proc/进程号/fd/
      

  2.   


    虽说文件描述符还是打开的,但是把文件转移掉之后(/tmp/)即使这个目录mysql帐号没有权限访问,为什么还可以写入数据?
      

  3.   

    #我的问题
    1:数据文件frm.myd,myi都被mv走了,为什么还能写入数据,而且能正常写入和查询
    2:写入后flush table才提示表不存在,或者做表DDL也会提示表不存在,说明此时才会去寻找表的物理数据文件
    3:数据文件被人RM掉了,但是写入依旧成功,读取也依旧成功,为何?
      

  4.   

    zz
    先介绍一些文件的基本概念, 文件实际上是一个指向inode的链接, inode链接包含了文件的所有属性, 比如权限和所有者, 数据块地址(文件存储在磁盘的这些数据块中). 当你删除(rm)一个文件, 实际删除了指向inode的链接, 并没有删除inode的内容. 进程可能还在使用. 只有当inode的所有链接完全移去, 然后这些数据块将可以写入新的数据.proc文件系统可以协助我们恢复数据. 每一个系统上的进程在/proc都有一个目录和自己的名字: 里面包含了一个fd(文件描述符)子目录(进程需要打开文件的所有链接). 如果从文件系统中删除一个文件, 此处还有一个inode的引用:/proc/进程号/fd/文件描述符接下来, 你需要知道打开文件的进程号(pid)和文件描述符(fd). 这些都可以通过lsof工具方便获得, lsof的意思是”list open files, 列出(进程)打开的文件”. 然后你将可以从/proc拷贝出需要恢复的数据.下面介绍在Centos 5 系统上使用lsof恢复误删的文件: