我有一张桌子Person。该表的数据存储在/usr/local/mysql/data/my_database/person.ibd中。
现在,我做一个insert。然后用vim检查person.ibd的内容。我刚才输入的数据确实在那里。
然后,将person.ibd移动到我的主目录。我再次创建了一个insert,并使用vim检查了person.ibd的内容。新数据被插入到文件中,尽管该文件现在位于我的主目录中,而不是在/usr/local/mysql/data/my_database/person.ibd。
我重复此操作,将person.ibd移动到其他各种地方,例如/etc/。新的数据总是被插入。
那么,怎么回事?这是怎么发生的?在将插入写入文件系统中的文件之前,MySQL是否搜索整个文件系统?
我用vim打开person.ibd,编辑记录的varchar类型字段并保存文件。然后我运行一个select,但是MySQL看到了旧的数据。我退出MySQL并再次输入,但是MySQL仍然看到旧的数据,即使这些数据不再存在于person.ibd中,并且被我使用vim编辑到person.ibd文件中的新内容所取代。
再说一遍,怎么回事?
发布于 2016-09-13 18:48:30
不要编辑.ibd文件!事情很可能会出错:
至于“移动”文件,让我给您一个关于*nix文件系统的基本教训。一个文件(简单地说)有两样东西:一块数据放在磁盘上,一个目录条目指向该数据块。当一个“文件”被“打开”时( MySQL很久以前就这样做了),它会抓取指向数据块的指针,但不会再次查看目录条目。您执行了mv操作,它只删除一个目录项并创建一个新条目。这个新条目指向磁盘上相同的数据块。
所以,直到,MySQL关闭了这个文件,它仍然拥有这个文件,不管它的路径是什么(S)。
请注意,这解释了“硬”链接是如何工作的。对同一个文件的第二个引用(硬链接)只是指向同一块数据的一个不同的目录条目。
请研究*nix文件系统的结构。你不完整的知识正迅速地将你推向灾难!
顺便说一句,如果你把.ibd放在它的新位置。MySQL在重启之后就找不到它了。你会“失去”那张桌子,并且有一个可能令人困惑的修理情况。
发布于 2016-09-12 17:39:03
你关闭了MySQL并重新启动了吗?对于shure来说,当你尝试重新启动它时,它将无法工作!答案是您正在使用内存缓冲区,直到数据库需要写入磁盘时才会出现错误,这取决于缓冲区大小,错误的增加将需要一些时间,但错误是可以保证的。
https://dba.stackexchange.com/questions/149450
复制相似问题