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 文件夾,並創建一個指向它的連結,它可以工作。我會繼續探索。
Edit3:作為答案添加的解決方案,nfs-kernel-server 在 /etc/nfs-kernel-server 中有選項 –manage-gids 影響了 mysql 使用者的輔助組。
感謝@Fox 和@Sven 的幫助,我現在已經解決了這個問題。
這是一個 nfs-kernel-server 設置,/etc/defaults/nfs-kernel-server 包含的選項 –manage-gids 打破了輔助組的使用。因此,雖然 mysql 使用者通過輔助組擁有正確的權限,但 nfs 伺服器端的權限是錯誤的。
希望其他有問題的人在浪費幾個小時之前看到這一點!
關於,FrontSlash
您沒有說明您使用的是什麼引擎,但讓我假設它是 InnoDB(因為它現在非常標準)然後在MySQL Docs
(InnoDB 表從未支持使用實際的符號連結。)
和
DATA DIRECTORY 子句是使用符號連結的受支持替代方案,這一直是有問題的,並且從不支持單個 InnoDB 表。
您可能可以手動創建 .isl 文件(但在實時創建之前進行測試)。
並且有一個警告可能會引起人們的興趣:
不要將 MySQL 表放在 NFS-mounted 卷上。NFS 使用消息傳遞協議寫入文件,如果網路消息失去或接收無序,可能會導致數據不一致。
編輯:好吧……這不是正確的答案,因為它不是 InnoDB。但我會保留它,以防其他人來這裡尋找 InnoDB 解決方案。
有關 MySQL 和符號連結的進一步閱讀。
特別有趣的可能是
如果您不使用符號連結,請使用
--skip-symbolic-links
選項啟動 mysqld,以確保沒有人可以使用 mysqld 刪除或重命名數據目錄之外的文件。因為這可能是 Debian 的預設設置。(我不知道。)
Edit2:好的檢查方法:
SHOW VARIABLES LIKE 'have_symlink';
不從外部獲取數據庫的另一個原因
data-dir
是 AppArmor 或類似的安全措施。順便提一句。如果它與 NFS 相關,則值得測試 - 如果符號連結到本地 fs 的完全不同部分(或完全不同的 fs)有效,它在 NFS 中,如果不是,它在符號連結中……