有人可以解释一下,这里发生了什么,
我在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
答案 0 :(得分:0)
在Unix上,如果删除另一个进程已打开的文件,它只会从目录中删除该名称,但该文件仍然存在于磁盘上,另一个进程可以继续访问它。在所有进程关闭文件之前,它并没有真正消失。
MySQL守护进程可能会在第一次访问时打开与表相关的文件,然后尽可能长时间保持文件打开状态。因此,一旦访问了表,删除文件名不会影响其对表内容的操作。
但是,show tables
和drop tables
等DML操作通过访问目录而不是打开文件来工作,因此他们会注意到更改。然后,所有内部数据结构都与文件系统同步。