mysql启动拒绝读写数据目录需同时满足:属主属组为运行用户(如mysql:mysql)、目录权限750且递归应用、修复selinux/apparmor或windows acl上下文。

MySQL 启动时拒绝读写数据目录
MySQL 进程(如 mysqld)不是以 root 身份长期运行的,它会主动降权到配置中指定的用户(Linux 下通常是 mysql,macOS Homebrew 安装是 _mysql,Windows 是 SYSTEM 或安装时指定的用户)。一旦该用户对 datadir(比如 /var/lib/mysql 或 /usr/local/var/mysql)没有读、写、执行权限,启动过程就会在初始化阶段中断——因为连创建临时文件、打开 binlog.index、读取 ibdata1 或写入 pid 文件都做不到。
常见权限错误现象与对应路径
错误日志里反复出现 OS errno 13 - Permission denied,基本可以锁定为权限问题。但具体卡在哪条路径,得看报错上下文:
-
File './binlog.index' not found (Errcode: 13)→ 数据目录本身不可读,或binlog.index文件属主不是运行用户 -
Can't create/write to file '/tmp/ibfguTtC' (Errcode: 13)→tmpdir配置指向的目录(如/tmp)对 mysql 用户不可写 -
Can't start server: can't create PID file→pid-file所在目录(如/var/run/mysqld)不存在,或 mysql 用户无写权限 -
World-writable config file '/etc/my.cnf' is ignored→ 配置文件权限太宽松(如 777),MySQL 主动拒绝加载,导致后续参数(包括user、datadir)失效
修复权限必须满足的三个条件
只改 chown 或只改 chmod 都不够,三者缺一不可:
- 属主和属组必须是 MySQL 运行用户(查法:
ps aux | grep mysqld看 USER 列;或看systemctl cat mysqld中的User=) - 数据目录需有执行权限(
x):否则无法进入目录遍历文件,chmod 750 /var/lib/mysql是安全底线,777绝对禁止 - 所有子目录和文件需继承属主:用
chown -R mysql:mysql /var/lib/mysql,不能漏掉mysql子目录下的performance_schema、sys等库目录
SELinux / AppArmor / Windows ACL 是隐形拦路虎
即使 ls -l 显示权限正确,Linux 上 SELinux 可能仍阻止访问;Windows 上“安全”选项卡里 Users 组没勾选“完全控制”,也会静默失败。
- Linux:执行
sudo restorecon -Rv /var/lib/mysql恢复默认 SELinux 上下文 - Windows:右键 MySQL 安装目录 → 属性 → 安全 → 编辑 → 选中 Users → 勾选“完全控制” → 应用于“此文件夹、子文件夹和文件”
- macOS:Homebrew 安装后若用
brew services start mysql失败,大概率是/usr/local/var/mysql的 ACL 被重置,需重新sudo chown -R _mysql:_mysql /usr/local/var/mysql
权限问题最麻烦的点在于:它不报明确的“你没权限”,而是表现为“文件找不到”“无法创建”“配置被忽略”等间接错误。盯着 log-error 路径里的最新几行,逐个核对报错路径的属主、权限、SELinux 上下文或 Windows ACL,比盲目重启服务有效得多。











