如果我在恢复 MySQL 数据的本地目录上挂载一个逻辑卷并且进程仍在运行怎么办?

如果我在恢复 MySQL 数据的本地目录上挂载一个逻辑卷并且进程仍在运行怎么办?

以下是详细描述:

  1. /data是本地目录,我这里解压MySQl二进制包,然后配置启动。和basedir都是datadir下面的子目录/data
basedir=/data/mysql 

datadir=/data/mysql/data
  1. mysqld过程正在运行,没有错误。现在我创建一个逻辑卷:/dev/mapper/vg-lvdata,然后将其安装在 上/data

这里我没有停止mysqld进程,而是直接挂载LV。

  1. 结果:

众所周知,当我们将一个设备挂载到本地目录后,再切换目录到该设备,会发现里面没有任何数据。原始数据在本地。

但结果让我很好奇,mysqld服务仍在运行,并且新数据正在写入本地目录。

问题:

谁能说出其中的原因吗?

为什么mysqld服务仍然可以向本地目录读写数据?

答案1

出于同样的原因,如果您只是从该数据目录中删除随机文件,它将继续工作(直到您重新启动它)。

简而言之,一旦您在具有 POSIX VFS 语义的系统上打开一个文件,您就有一个打开的文件描述符文件。在关闭该文件之前,无论发生什么情况(除非硬件故障导致 I/O 错误),您都可以继续访问它。其他人(或您)可以删除该文件,并且您仍然可以访问它(当最后一个打开的文件描述符关闭时,它占用的空间将自动释放,这通常用于安全临时文件) 。权限可能会发生更改,导致您无法打开它,但您仍然可以访问它。该文件可以是搬家了,打开的文件描述符将紧随其后。

但请注意,这要求您实际上保持对正在使用的文件的打开引用,而不是每次要访问它们时都打开它们。大多数系统服务都足够智能,可以保留此类开放引用,但大多数交互式软件(例如,您的 shell 进程)则不然,并且会立即注意到目录内容已更改。

相关内容