Linux

MySQL、NFS 和符號連結

  • May 25, 2015

我一直在將在 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 中,如果不是,它在符號連結中……

引用自:https://serverfault.com/questions/693785