我一直在将运行 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