ERROR: Can't find file: 'path/with/filename.frm' (Errcode: 13)
# Errcode 13 = Permission denied
| 變數 | 預設值 | 含義 | 影響對象 |
|---|---|---|---|
UMASK | 0660 (八進位) | 文件權限掩碼 | 表文件 (.frm, .ibd, .MYD, .MYI) |
UMASK_DIR | 0700 (八進位) | 目錄權限掩碼 | 資料庫目錄、分區目錄 |
實際權限 = 預設權限 (660/700) & ~UMASK。預設掩碼導致「僅擁有者可讀寫,組無權限」。
# 方案 1:給組讀權限 (文件 640, 目錄 750)
export UMASK=022 # 八進位 022 = 十進位 18
export UMASK_DIR=022
mysqld_safe &
# 方案 2:給組讀寫權限 (文件 660, 目錄 770) — 推薦生產
export UMASK=000 # 保持預設 660/700
export UMASK_DIR=007 # 目錄 770 (組可寫)
mysqld_safe &
注意:MySQL 3.23.25+ 支援八進位前綴 0,建議寫 0660 避免誤解。
# 建立測試表
CREATE TABLE t_test (id INT) ENGINE=InnoDB;
# 檢查文件權限
ls -l /var/lib/mysql/test_db/t_test.ibd
# 預期:-rw-r----- 1 mysql mysql ... (UMASK=022 時)
# 或 -rw-rw---- 1 mysql mysql ... (UMASK=000 時)
# 檢查目錄權限
ls -ld /var/lib/mysql/test_db/
# 預期:drwxr-x--- (UMASK_DIR=022) 或 drwxrwx--- (UMASK_DIR=007)
| 場景 | 建議 UMASK | 建議 UMASK_DIR | 理由 |
|---|---|---|---|
| 單一 mysql 用戶運行,無外部備份工具 | 0660 (預設) | 0700 (預設) | 最小權限,安全 |
| 備份工具 (xtrabackup) 以不同用戶讀取 | 0640 (UMASK=020) | 0750 (UMASK_DIR=020) | 備份用戶加入 mysql 組即可讀取 |
| 多實例共享數據目錄 (極少見) | 0660 | 0770 (UMASK_DIR=007) | 不同實例用戶互訪 |
| NFS 掛載數據目錄 | 視 NFS export 選項 | 視 NFS export 選項 | 以伺服器端 export 權限為準 |
# Systemd 服務覆蓋
systemctl edit mysqld
# 輸入:
[Service]
Environment=UMASK=022
Environment=UMASK_DIR=022
# 或修改 /etc/sysconfig/mysql (RHEL/CentOS)
UMASK=022
UMASK_DIR=022
file_per_table=OFF 時,所有表共用 ibdata1,權限由系統表空間決定。