mysql启动失败八成是datadir权限问题,需先停服务、用mysqld --help查真实路径、chown -r mysql:mysql重置属主属组、chmod 750设权限,并处理selinux/apparmor拦截后手动试启验证。

MySQL 启动失败,八成是 datadir 权限不对——不是配置写错了,而是 Linux 层面的属主、组或目录权限直接拦住了 mysqld 进程。
怎么确认真是 datadir 权限问题?
别猜,先看错误日志里有没有这些典型信号:
Can't open the mysql.plugin tablePermission denied on ./ibdata1-
OS errno 13 - Permission denied(尤其出现在binlog.index或ib_logfile0上) - 服务卡在启动阶段,
systemctl status mysql显示 “active (exited)” 或反复 restart
这些都不是 MySQL 自己报“权限错”,而是底层 open() 系统调用被拒后抛出的间接表现。必须停服务再查路径,否则 chown 可能不生效或被锁住。
datadir 路径和属主怎么查才准?
别翻 /etc/my.cnf ——多配置文件、include、环境变量都可能覆盖它。最可靠方式是:
- 先停服务:
sudo systemctl stop mysql(或mysqld,看你的服务名) - 查真实路径:
sudo mysqld --verbose --help 2>/dev/null | grep "datadir" - 看当前属主:
ls -ld /var/lib/mysql(把路径换成上一步结果)——重点看第三列(属主)和第四列(属组)是不是mysql
常见路径有 /var/lib/mysql、/usr/local/mysql/data、/opt/mysql/data,但必须以命令输出为准。
chown 和 chmod 怎么设才安全有效?
MySQL 8.0+ 对权限校验变严,错一点就拒启:
- 属主属组必须是
mysql:mysql,不是root:mysql,也不是你当前用户:sudo chown -R mysql:mysql /var/lib/mysql - 目录权限必须是
750:sudo chmod 750 /var/lib/mysql(属主 rwx、属组 rx、其他人 —) - 严禁
chmod 777或775——MySQL 启动时检测到 others 可写,会直接退出,并在错误日志里写secure-file-priv相关警告,不是明确提示“权限太松” - 子目录(如
mysql/、performance_schema/)自动继承父目录权限,不用逐个chmod
如果系统没 mysql 用户,先建:sudo useradd -r -s /bin/false mysql。
SELinux 或 AppArmor 开了怎么办?
即使 chown 和 chmod 都对,也可能被强制访问控制拦住:
- 查 SELinux 状态:
sestatus;若为enabled,重置上下文:sudo restorecon -Rv /var/lib/mysql - AppArmor(如 Ubuntu)需确认
/etc/apparmor.d/usr.sbin.mysqld包含/var/lib/mysql/** rwk - 临时验证可关 SELinux:
sudo setenforce 0;但生产环境务必配策略再开回来
修完别急着 start,先手动试启:sudo mysqld --user=mysql --datadir=/var/lib/mysql --skip-grant-tables——能跑起来,说明权限和 SELinux 都过了。真正容易被忽略的是:MySQL 启动时会检查整个 datadir 树里每个子目录的权限,哪怕某个临时子目录是 777,也会触发拒绝逻辑。











