Mysql:MyISAM表文件被删除,但仍然插入和选择数据。怎么样?

时间:2014-12-23 09:19:44

标签: mysql

有人可以解释一下,这里发生了什么,

我在MyISAM中创建了一个表。

show tables - 显示它。 select命令从表中提供empty table

我从位置删除了myisam文件。

show tables - 没有显示。

好到现在。

现在,我仍然可以插入表中,并且能够从表中进行选择[它会发生吗?如何??]

同样,drop table表示表不存在。 在此之后,select命令表示表不存在。

问题是"它插入的位置,以及选择数据的位置;在drop table调用之后,它在哪里消失了?"

服务器版本:5.5.38-log MySQL社区服务器(GPL)

整体顺序..

MySQL [test]> CREATE TABLE test (id int(11) DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.05 sec)

MySQL [test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test           |
+----------------+
1 row in set (0.00 sec)

MySQL [test]> select * from test;
Empty set (0.00 sec)

~~~~~~~~~~~~~~~~~~~~~~~~~

[root@localhost test]# pwd
/var/lib/mysql/test
[root@localhost test]# ll
total 16
-rw-rw---- 1 mysql mysql 8556 Dec 23 14:08 test.frm
-rw-rw---- 1 mysql mysql    0 Dec 23 14:08 test.MYD
-rw-rw---- 1 mysql mysql 1024 Dec 23 14:08 test.MYI
[root@localhost test]# rm -f *
[root@localhost test]# ll
total 0
[root@localhost test]#

~~~~~~~~~~~~~~~~~~~~~~~~~

MySQL [test]> show tables;
Empty set (0.00 sec)

MySQL [test]> insert into test values (1234);
Query OK, 1 row affected (0.00 sec)

MySQL [test]> select * from test;
+------+
| id   |
+------+
| 1234 |
+------+
1 row in set (0.00 sec)

MySQL [test]> drop table test;
ERROR 1051 (42S02): Unknown table 'test'

MySQL [test]> select * from test;
ERROR 1146 (42S02): Table 'test.test' doesn't exist

1 个答案:

答案 0 :(得分:0)

在Unix上,如果删除另一个进程已打开的文件,它只会从目录中删除该名称,但该文件仍然存在于磁盘上,另一个进程可以继续访问它。在所有进程关闭文件之前,它并没有真正消失。

MySQL守护进程可能会在第一次访问时打开与表相关的文件,然后尽可能长时间保持文件打开状态。因此,一旦访问了表,删除文件名不会影响其对表内容的操作。

但是,show tablesdrop tables等DML操作通过访问目录而不是打开文件来工作,因此他们会注意到更改。然后,所有内部数据结构都与文件系统同步。