以下是详细描述:
/data
是本地目录,我这里解压MySQl二进制包,然后配置启动。和basedir
都是datadir
下面的子目录/data
basedir=/data/mysql
datadir=/data/mysql/data
- 该
mysqld
过程正在运行,没有错误。现在我创建一个逻辑卷:/dev/mapper/vg-lvdata
,然后将其安装在 上/data
。
这里我没有停止mysqld
进程,而是直接挂载LV。
- 结果:
众所周知,当我们将一个设备挂载到本地目录后,再切换目录到该设备,会发现里面没有任何数据。原始数据在本地。
但结果让我很好奇,mysqld
服务仍在运行,并且新数据正在写入本地目录。
问题:
谁能说出其中的原因吗?
为什么mysqld
服务仍然可以向本地目录读写数据?
答案1
出于同样的原因,如果您只是从该数据目录中删除随机文件,它将继续工作(直到您重新启动它)。
简而言之,一旦您在具有 POSIX VFS 语义的系统上打开一个文件,您就有一个打开的文件描述符那文件。在关闭该文件之前,无论发生什么情况(除非硬件故障导致 I/O 错误),您都可以继续访问它。其他人(或您)可以删除该文件,并且您仍然可以访问它(当最后一个打开的文件描述符关闭时,它占用的空间将自动释放,这通常用于安全临时文件) 。权限可能会发生更改,导致您无法打开它,但您仍然可以访问它。该文件可以是搬家了,打开的文件描述符将紧随其后。
但请注意,这要求您实际上保持对正在使用的文件的打开引用,而不是每次要访问它们时都打开它们。大多数系统服务都足够智能,可以保留此类开放引用,但大多数交互式软件(例如,您的 shell 进程)则不然,并且会立即注意到目录内容已更改。