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

MySQL 文件權限問題排查:UMASK、UMASK_DIR 環境變數配置指南

     編輯:MySQL 資料庫相關知識

典型錯誤現象

ERROR: Can't find file: 'path/with/filename.frm' (Errcode: 13)
# Errcode 13 = Permission denied

根因:UMASK 環境變數控制新建文件/目錄權限

變數預設值含義影響對象
UMASK0660 (八進位)文件權限掩碼表文件 (.frm, .ibd, .MYD, .MYI)
UMASK_DIR0700 (八進位)目錄權限掩碼資料庫目錄、分區目錄

實際權限 = 預設權限 (660/700) & ~UMASK。預設掩碼導致「僅擁有者可讀寫,組無權限」。

修改方法:啟動腳本前 export

# 方案 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 組即可讀取
多實例共享數據目錄 (極少見)06600770 (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

避坑提醒

  • 不要在運行中修改現有文件權限 (chmod/chown),會導致 MySQL 無法讀寫、崩潰。
  • UMASK 僅影響新建文件/目錄,存量不變。
  • Windows 下無 UMASK 概念,權限由 NTFS ACL 控制。
  • InnoDB file_per_table=OFF 時,所有表共用 ibdata1,權限由系統表空間決定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved