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沙箱拦住了。
- 运行
sudo systemctl cat mysqld,重点看是否有ProtectHome=yes或NoNewPrivileges=yes -
ProtectHome=yes会阻止访问/var/lib/mysql(因该路径属ProtectHome范围),临时调试可:sudo systemctl edit mysqld,写入:[Service] ProtectHome=false
-
NoNewPrivileges=yes会禁用动态加载插件能力,同样需设为false;生产环境应改配SELinux策略,而非关保护 - 配置文件权限过宽也会拒启:
/etc/my.cnf若属主不是root或权限是0666,MySQL会直接退出并报File protection error;修复命令:sudo chown root:root /etc/my.cnf && sudo chmod 644 /etc/my.cnf
真正麻烦的不是改权限本身,而是权限问题常和初始化方式、systemd沙箱、SELinux策略、配置文件校验层层嵌套——一个chown没在停服务后执行,或chmod多按了一个7,就可能让整个恢复流程卡住半天。











