首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 修改 datadir 導致啟動失敗:SELinux 權限問題完整排查與解決

     編輯:MySQL 資料庫相關知識

MySQL datadir 遷移啟動失敗:SELinux 權限阻擋完整解決實錄

CentOS 6.2 環境下,修改 /etc/my.cnf 中 datadir 至新路徑 /mnt/hgfs/mysql_data 後,MySQL 啟動失敗,日誌顯示 Errcode: 13 (Permission denied)。目錄權限 777、擁有者 root、上層目錄有 rx 權限,表面看無問題,實為 SELinux 安全上下文阻擋。

錯誤日誌關鍵證據

120609 11:35:13 [Warning] Can't create test file /mnt/hgfs/mysql_data/data.lower-test
/usr/libexec/mysqld: Can't change dir to '/mnt/hgfs/mysql_data/' (Errcode: 13)
[ERROR] Aborting

關鍵線索: Errcode: 13 為系統調用 EACCES,權限被拒,但 Linux DAC (Discretionary Access Control) 權限 (rwx) 已全開,必須是 MAC (Mandatory Access Control) —— 即 SELinux 在作祟。

SELinux 狀態確認與臨時關閉驗證

# 查看當前模式
getenforce
# Enforcing (強制模式)

# 臨時設為寬容模式 (不攔截,只記錄日誌)
setenforce 0
getenforce
# Permissive

執行後 MySQL 即可正常啟動,確認為 SELinux 策略阻擋。

永久解決方案三選一

方案一:永久關閉 SELinux (生產環境慎用)

vi /etc/selinux/config
# 修改
SELINUX=disabled
# 重啟系統生效
reboot

配置檔完整內容參考:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

方案二:設為寬容模式 (推薦折中)

vi /etc/selinux/config
SELINUX=permissive
reboot

優勢: 保留審計日誌,安全審計合規;劣勢: 實際不攔截違規操作。

方案三:正確配置 SELinux 上下文 (最佳實踐,安全合規)

# 1. 檢查當前上下文
ls -Z /mnt/hgfs/mysql_data
# 可能顯示:unconfined_u:object_r:vmblock_t:s0 (錯誤類型)

# 2. 設定正確的 MySQL 資料目錄上下文
semanage fcontext -a -t mysqld_db_t "/mnt/hgfs/mysql_data(/.*)?"
restorecon -Rv /mnt/hgfs/mysql_data

# 3. 驗證
ls -Z /mnt/hgfs/mysql_data
# 應顯示:system_u:object_r:mysqld_db_t:s0

前置條件: 需安裝 policycoreutils-python (含 semanage)。

根因深度剖析

層面說明
掛載來源VMware 共享資料夾 (Windows 檔案系統掛載至 Linux)
檔案系統宿主機 NTFS,客體機透過 vmhgfs-fuse 掛載
擁有者掛載點預設為 root:root,無法透過 chown 改變 (NTFS 特性)
SELinux 策略mysqld_t 進程類型僅允許存取 mysqld_db_t 類型的檔案/目錄
衝突點vmblock_t (VMware 共享預設類型) ≠ mysqld_db_t,被策略拒絕

驗證修復

# 重啟 SELinux 為 Enforcing
setenforce 1
# 或重啟系統

# 啟動 MySQL
service mysqld start
# 應顯示 SUCCESS

# 確認資料目錄
mysql -e "SHOW VARIABLES LIKE 'datadir';"
# +---------------+------------------------+
# | Variable_name | Value                  |
# +---------------+------------------------+
# | datadir       | /mnt/hgfs/mysql_data/  |
# +---------------+------------------------+

最佳實踐總結

  1. 遷移 datadir 前:先檢查目標路徑 SELinux 上下文 ls -Z
  2. 標準路徑優先:/var/lib/mysql 已預設正確上下文,避免自訂路徑
  3. 自訂路徑必做:semanage fcontext -a -t mysqld_db_t "/path(/.*)?" && restorecon -Rv /path
  4. 虛擬機共享目錄:極易踩坑,生產環境強烈建議使用本地磁碟或 NFS (支援 Linux 權限屬性)
  5. 審計合規:生產環境禁用 SELinux 可能違反等保/合規要求,方案三為正解
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved