MySQL,NFS和符号链接

我一直在迁移一个旧的服务器在Ubuntu下运行apache2 + mysql到运行debian(wheezy)的新服务器。 迁移工作正常,而数据库在localy(在我们的情况下/ srv / mysql),但当我尝试将它们移动到我们的集中存储运行NFS和创build移动文件的符号链接mysql似乎并没有find数据库所有。 我没有从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 

我如何创build符号链接:

 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

EDIT1:

在@Fox的一些帮助后,问题似乎是NFS连接。 有没有人看到我上面张贴的nfsconfiguration的任何问题? 如果你需要更多的信息,我会发布它。

EDIT2:

做了一个快速testing,在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文件夹,并创build一个链接,它的工作原理。 我会继续探索。

Edit3:添加解决scheme作为答案,nfs-kernel-server在/ etc / nfs-kernel-server中有选项–manage-gids,它影响mysql用户的辅助组。

你没有说明你在使用什么引擎,但是让我推测它是InnoDB(因为它现在已经非常标准了),那么在MySQL Docs中

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

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

您可能可以手动创build.isl文件(但是在现场进行testing之前)。

有一个警告可能是有趣的:

不要将MySQL表放在NFS安装的卷上。 NFS使用消息传递协议写入文件,如果networking消息丢失或无序接收,可能会导致数据不一致。

编辑:好吧然后…这不是正确的答案,因为它不是InnoDB。 但是我会保留下来,以防其他人到这里寻找InnoDB解决scheme。

有关MySQL和符号链接的进一步阅读 。

特别有趣的可能是

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

这在Debian上可能是默认的。 (我不知道。)

Edit2:好的检查方法是:

 SHOW VARIABLES LIKE 'have_symlink'; 

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

顺便说一句。 如果它与NFS有关 – 如果符号链接到本地​​fs的完全不同的部分(或者更好的不同的fs),它将在NFS中工作,如果它没有,它在符号链接中。

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

这是一个nfs-kernel-server的设置,/ etc / defaults / nfs-kernel-server包含了选项–manage-gids,它打破了二级组的使用。 所以,当mysql用户通过辅助组具有正确的权限时,nfs-server方面的权限是错误的。

希望有人在这个问题上看到这个,然后浪费好几个小时!

问候,FrontSlash