MySQL、NFS 和符号链接

MySQL、NFS 和符号链接

我一直在将运行 ubuntu 下的 apache2 + mysql 的旧服务器迁移到运行 debian (wheezy) 的新服务器。当数据库存储在本地时(在我们的例子中是 /srv/mysql),迁移工作正常,但是当我尝试将它们移动到运行 NFS 的集中存储并创建指向移动文件的符号链接时,mysql 似乎根本找不到数据库。我没有从 mysql 收到任何错误,它似乎只是认为没有这样的数据库。

这是 /srv/mysql 的布局(一些示例):

user@server:/srv/mysql# ls -al
total 135440
drwxr-xr-x 50 mysql mysql      4096 May 22 09:59 .
drwxr-xr-x  7 root  root       4096 May 22 09:59 ..
drwxrwx---  2 mysql mysql      4096 May 21 20:13 database_dir_1
drwx------  2 mysql mysql      4096 May 21 19:07 database_dir_2
drwxrwx---  2 mysql mysql      4096 May 21 20:15 database_dir_3
drwx------  2 mysql mysql      4096 May 21 20:15 database_dir_4
drwxrwx---  2 mysql mysql      4096 May 21 20:15 database_dir_5

如何创建符号链接:

mv /srv/mysql/database_dir_1 /mnt/centralstorage/customer1/db/database_dir_1
ln -s /mnt/centralstorage/customer1/db/database_dir_1 /srv/mysql/database_dir_1
ls -al /srv/mysql/
drwxrwx---  1 root root      28 May 21 20:13 database_dir_1 -> /mnt/centralstorage/customer1/db/database_dir_1

此后,mysql 不再看到 database_dir_1,但可以从 cli 完全浏览它。

/mnt/centralstorage 的挂载如下所示:

192.168.12.222:/srv/storage/customers on /mnt/centralstorage/ type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.12.222,mountvers=3,mountport=49535,mountproto=udp,local_lock=none,addr=192.168.12.222)

以及中央服务器上的导出:

/srv/storage 192.168.12.30(rw,async,no_subtree_check,no_root_squash)

(所有名字等均为化名)

有谁发现这个设置有问题吗?

谨致问候,FrontSlash

编辑1:

在 @Fox 的帮助下,问题似乎出在 NFS 连接上。有人看到我上面发布的 nfs 配置中存在任何问题吗?如果您需要更多信息,我会发布它。

编辑2:

进行了快速测试,在 NFS 服务器上导出一个新文件夹 /srv/temp,其设置与其他两个导出相同。

使用 fstab 将其安装在 SQL 服务器上,而不是使用之前运行的启动脚本。

脚本只是做了

mount $host:$dir $mnt_dir/$mmount

由此产生了这个坐骑:

192.168.12.222:/srv/storage/customers on /mnt/centralstorage/ type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.12.222,mountvers=3,mountport=49535,mountproto=udp,local_lock=none,addr=192.168.12.222)

fstab 挂载:

192.168.12.222:/srv/temp /mnt/temp nfs rw,sync,hard,intr 0   0

制作了这个:

192.168.12.222:/srv/temp on /mnt/temp type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.12.222,mountvers=3,mountport=49535,mountproto=udp,local_lock=none,addr=192.168.12.222)

奇怪的是,现在将数据库目录移动到 /mnt/temp 文件夹,并创建指向该文件夹的链接,就可以了。我会继续探索。

编辑3:解决方案添加为答案,nfs-kernel-server 在 /etc/nfs-kernel-server 中有选项 --manage-gids,这会影响 mysql 用户的辅助组。

答案1

你没有说明你使用的是什么引擎,但让我假设它是 InnoDB(因为它现在几乎是标准),然后在MySQL 文档

(InnoDB 表从未支持使用实际的符号链接。)

DATA DIRECTORY 子句是使用符号链接的一种受支持的替代方法,符号链接始终存在问题并且从未支持单个 InnoDB 表。

您可能可以手动创建 .isl 文件(但测试在直播中执行此操作之前)。

有一个警告可能值得关注:

不要将 MySQL 表放在 NFS 挂载卷上。NFS 使用消息传递协议写入文件,如果网络消息丢失或接收顺序错误,可能会导致数据不一致。

编辑:好吧...这不是正确答案,因为它不是 InnoDB。但我会保留它,以防其他人来这里寻找 InnoDB 解决方案。

还有阅读关于 MySQL 和符号链接。

特别有趣的可能是

如果您没有使用符号链接,请使用该--skip-symbolic-links选项启动 mysqld,以确保没有人可以使用 mysqld 删除或重命名数据目录之外的文件。

因为这可能是 Debian 的默认设置。(我不知道。)

编辑2:好的,有一个更好的检查方法:

SHOW VARIABLES LIKE 'have_symlink';

不从外部获取数据库的另一个原因data-dir是 AppArmor 或类似的安全措施。

顺便说一句,如果它与 NFS 相关,那就值得测试 - 如果到本地 fs 的完全不同部分(或者更好的是完全不同的 fs)的符号链接有效,那么它就在 NFS 中,如果没有,那么它就在符号链接中...

答案2

感谢@Fox 和@Sven 的帮助,我现在已经解决了这个问题。

这是 nfs-kernel-server 的设置,/etc/defaults/nfs-kernel-server 包含选项 --manage-gids,该选项会破坏次要组的使用。因此,虽然 mysql 用户通过次要组拥有正确的权限,但 nfs-server 端的权限是错误的。

希望其他遇到此问题的人能够在浪费几个小时之前看到这一点!

谨致问候,FrontSlash

相关内容