我一直在迁移一个旧的服务器在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