MySQL启动失败八成是datadir权限问题:需确认属主mysql:mysql、权限750,执行sudo chown -R mysql:mysql /var/lib/mysql和sudo chmod 750 /var/lib/mysql,并检查SELinux/systemd沙箱拦截。

MySQL 启动失败,八成是 /var/lib/mysql(或你实际的 datadir)权限没配对——不是“不够 sudo”,而是属主、属组、目录权限三者必须同时满足 mysql 用户运行要求。
怎么确认真是 datadir 权限问题?
别猜,看日志和路径状态:
- 错误日志里出现
OS errno 13 - Permission denied,且路径指向ibdata1、auto.cnf、binlog.index或./mysql/这类文件时,基本锁定 datadir 权限 - 执行
sudo mysqld --verbose --help 2>/dev/null | grep "datadir"获取真实路径,别信配置文件里写的——include或多实例可能覆盖它 - 运行
ls -ld /var/lib/mysql(把路径替换成上一步结果),输出第一列必须是drwxr-x---,第三、四字段必须都是mysql
chown -R mysql:mysql 是必须步骤,但顺序和范围不能错
属主错,后续所有操作都白搭。MySQL 进程以 mysql 用户身份运行,它无法读取 root 写的 ib_logfile0,哪怕目录权限是 755 也不行。
- 必须先停服务:
sudo systemctl stop mysql(或mysqld,看服务名),否则chown -R可能被文件锁阻塞,子文件权限不生效 - 执行
sudo chown -R mysql:mysql /var/lib/mysql——注意是mysql:mysql,不是root:mysql或$(whoami):$(whoami) - 如果系统没
mysql用户(极少见),先创建:sudo useradd -r -s /bin/false mysql - 已用
root执行过mysqld --initialize?别只改目录属主,得清空/var/lib/mysql重来——ib_logfile*等文件的 inode 权限可能仍被锁死
chmod 750 是底线,777 会直接拒启
MySQL 8.0+ 对 datadir 权限校验变严:只要目录对 “others” 可写(比如 777、775),它就拒绝启动,并在错误日志里报 secure-file-priv 相关警告,而不是明确说“权限太松”。
- 执行
sudo chmod 750 /var/lib/mysql——属主读写执行、属组读执行、其他人无任何权限 - 子目录(如
mysql/、performance_schema/)会继承父目录权限,无需逐个chmod - 严禁
chmod 777,哪怕临时测试也不行——这是 MySQL 内部安全检查触发的拒绝,不是 Linux 层面的Permission denied - 如果目录不存在,先
sudo mkdir -p /var/lib/mysql再赋权,否则mysqld --initialize直接退出
systemd 沙箱或 SELinux 也可能拦住你
journal 日志只报 Operation not permitted,但 ls -l 全正常?大概率是 systemd 沙箱或 SELinux 在背后卡脖子。
- 运行
sudo systemctl cat mysql,检查是否有ProtectHome=yes或NoNewPrivileges=yes——前者会阻止访问/var/lib/mysql(该路径属 ProtectHome 范围),后者禁用动态插件加载 - SELinux 启用状态下,
chown和chmod只改了 DAC 权限,上下文没变,仍会拒绝。临时验证可sudo setenforce 0,长期要用semanage fcontext修复上下文 - socket 目录(如
/var/run/mysqld)、错误日志路径(如/var/log/mysql/error.log)也必须属mysql:mysql且有写权限,否则服务启动到一半就 abort
最常被忽略的是:权限修复后,必须手动试启一次 sudo -u mysql mysqld --console,而不是直接 systemctl start——这样能立刻看到进程是否卡在权限校验环节,避免被 systemd 的 RestartSec 掩盖真实错误。


















