在 CentOS 6.2 環境下,將 MySQL datadir 遷移至掛載的 Windows 共享目錄 /mnt/hgfs/mysql_data 後,服務啟動失敗,錯誤日誌顯示:
[Warning] Can't create test file /mnt/hgfs/mysql_data/data.lower-test [ERROR] Aborting /usr/libexec/mysqld: Can't change dir to '/mnt/hgfs/mysql_data/' (Errcode: 13)
目錄權限已設為 777,上層目錄亦有 rx 權限,擁有者為 root(因掛載特性),卻仍無法啟動。
CentOS 預設啟用 SELinux Enforcing 模式,針對 mysqld_t 進程僅允許存取標準標籤目錄(如 /var/lib/mysql、/tmp 等)。掛載的非常規目錄缺乏正確的 SELinux 安全上下文,導致存取被拒(Errcode 13 = EACCES)。
getenforce # 顯示 Enforcing setenforce 0 # 切換為 Permissive getenforce # 顯示 Permissive
此時 MySQL 可正常啟動。注意:重啟後失效,不建議生產環境長期使用。
vi /etc/selinux/config # 修改 SELINUX=disabled # 重啟作業系統生效
修改後需 重開機 才生效。
保持 SELinux Enforcing,為新 datadir 賦予正確上下文:
# 1. 安裝工具 yum install -y policycoreutils-python # 2. 參考標準目錄標籤 ls -Z /var/lib/mysql # 輸出範例:system_u:object_r:mysqld_db_t:s0 # 3. 為新目錄設定相同標籤 semanage fcontext -a -t mysqld_db_t "/mnt/hgfs/mysql_data(/.*)?" restorecon -Rv /mnt/hgfs/mysql_data
驗證:
ls -Z /mnt/hgfs/mysql_data # 應顯示 mysqld_db_t 標籤
此後 MySQL 可在 Enforcing 模式下正常存取新目錄,兼顧安全與功能。
setsebool -P mysql_connect_any 1。datadir 後,記得同步修改 /etc/my.cnf 中的 datadir 與 socket 路徑。/var/log/mysqld.log 或 datadir 下的 hostname.err。