
我一直在將 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 使用者的輔助群組。
答案1
你沒有說明你使用的是什麼引擎,但讓我假設它是 InnoDB (因為它現在幾乎是標準的)然後在MySQL 文檔
(InnoDB 表從未支援使用實際的符號連結。)
和
DATA DIRECTORY 子句是使用符號連結的支援替代方案,符號連結一直是有問題的,單一 InnoDB 表從未受支援。
您可能可以手動建立 .isl 檔案(但是測試在直播之前)。
還有一個可能令人感興趣的警告:
不要將 MySQL 表放在 NFS 安裝的磁碟區上。 NFS 使用訊息傳遞協定寫入文件,如果網路訊息遺失或亂序接收,可能會導致資料不一致。
編輯:好吧...這不是正確的答案,因為它不是 InnoDB。但我會保留它,以防其他人來這裡尋找 InnoDB 解決方案。
還有進一步閱讀關於 MySQL 和符號連結。
特別有趣的可能是
如果您不使用符號鏈接,請使用以下
--skip-symbolic-links
選項啟動 mysqld,以確保沒有人可以使用 mysqld 刪除或重命名資料目錄之外的檔案。
因為這可能是 Debian 上的預設值。 (我不知道。)
Edit2:好的,更好的檢查方法:
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 伺服器端的權限是錯誤的。
希望有問題的其他人在浪費幾個小時之前看到這個!
關於,FrontSlash