mysql启动失败常因datadir权限错误,需先停服务、用mysqld --help查真实路径、chown -r mysql:mysql重置属主、chmod 750设权限、处理selinux/apparmor,并手动试启验证。

确认 datadir 路径和当前属主
服务启动失败时,mysqld 通常不会直接告诉你“权限错”,而是卡在初始化阶段或报 Can't open the mysql.plugin table、Permission denied on ./ibdata1 这类错误。先别急着改权限,得知道改哪儿。
执行以下命令定位真实路径:
-
sudo systemctl stop mysql(或mysqld,看服务名)——必须停,否则chown可能被文件锁阻塞或不生效 -
sudo mysqld --verbose --help 2>/dev/null | grep "datadir"——比翻配置文件更可靠,尤其当my.cnf有多个、或被 include 覆盖时 -
ls -ld /var/lib/mysql(把路径替换成上一步结果)——看输出里是root:root、mysql:mysql还是其他组合
用 chown -R mysql:mysql 重置属主属组
MySQL 进程默认以 mysql 用户身份运行,datadir 及其所有子目录/文件必须归属该用户和组,否则连 ibdata1 都打不开。
执行命令(路径请替换为你查到的真实值):
-
sudo chown -R mysql:mysql /var/lib/mysql——注意是mysql:mysql,不是root:mysql或mysql:root - 如果系统里没有
mysql用户(极少见),先创建:sudo useradd -r -s /bin/false mysql - 别用
chown -R $(whoami):$(whoami)代替——这会让所有文件归你个人用户,systemd 启动时会因 User=mysql 失败
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 层面的拒绝
SELinux 或 AppArmor 开启时需额外处理
即使 chown 和 chmod 都对了,CentOS/RHEL 的 SELinux 或 Ubuntu 的 AppArmor 仍可能拦截访问,表现为日志里反复出现 Permission denied,但 ls -l 看一切正常。
快速验证和修复:
- 查 SELinux 状态:
sestatus,若为enabled,运行sudo restorecon -Rv /var/lib/mysql重置安全上下文 - 查 AppArmor:
aa-status,确认/etc/apparmor.d/usr.sbin.mysqld包含/var/lib/mysql/** rwk - 临时关闭验证(仅调试):
sudo setenforce 0(SELinux)或sudo systemctl stop apparmor(Ubuntu),但生产环境必须配策略再启用
修完别直接 systemctl start mysql,先用 sudo mysqld --user=mysql --datadir=/var/lib/mysql --skip-grant-tables 手动试启——它绕过权限表加载,只测文件系统层是否真通。能跑起来,说明权限和 SELinux 都过了;卡住,就回头再盯日志里的具体拒绝路径。











