MySQL启动报“os errno 13 - permission denied”并非文件权限问题,而是权限系统未初始化成功导致MySQL无法确认运行用户,进而拒绝创建binlog.index等临时文件;典型表现为目录权限正确但仍启动失败,需通过--skip-grant-tables修复权限表或检查systemd ProtectHome等安全策略。

MySQL启动报“os errno 13 - permission denied”不是文件权限问题
看到mysqld: file './binlog.index' not found (os errno 13 - permission denied),别急着chmod 777——这大概率是权限系统本身没加载成功,导致MySQL连该以哪个用户身份运行都判断不了,进而放弃创建临时文件。
典型表现:目录/var/lib/mysql明明ls -ld显示属主是mysql:mysql、权限750,但启动仍失败;错误日志里反复出现errno 13,却找不到真实被拒的路径。
- 先停掉所有残留进程:
sudo pkill mysqld - 用免验证模式启动:
sudo mysqld --skip-grant-tables --skip-networking & - 立刻连接:
mysql -u root(此时无密码) - 执行
USE mysql;,如果报Access denied,说明mysql库结构异常(比如从5.7还原到8.0后password_history字段缺失)
修复权限表前必须确认版本兼容性和备份完整性
MySQL 8.0+ 的mysql.user表比5.7多出至少3个字段(password_history、password_reuse_interval、account_locked),直接用旧备份覆盖会导致权限加载中断,且SQL语句可能静默失败。
不要跳过这三步:
- 停应用,断开所有客户端连接
- 用
mysqldump --single-transaction --databases mysql > mysql_backup.sql全量备份系统库(只导user表不够) - 查版本:
SELECT VERSION(), @@datadir;,确认备份来源与当前MySQL大版本一致(如都是8.0.x)
若已损坏且无可用备份,可退而求其次:mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql重建空白权限表结构,再手动ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx';重设密码——切勿INSERT INTO mysql.user。
MySQL 数据库管理技能,能够通过自然语言查询和管理数据库,支持 SELECT/INSERT/UPDATE/DELETE、表管理、备份恢复等操作。当用户提及 MySQL、数据库查询、建表或数据备份时使用此技能。
systemd启动失败时“Operation not permitted”大概率是ProtectHome拦截
运行sudo journalctl -u mysqld -n 30 --no-pager,若看到Operation not permitted或Failed to create /run/mysqld/mysqld.sock,基本就是systemd安全策略在作祟。
ProtectHome=yes会直接禁止访问/var/lib/mysql(它属于ProtectHome范围),哪怕目录权限完全正确也无效。
- 临时验证:运行
sudo systemctl edit mysqld,写入:[Service] ProtectHome=false ProtectSystem=false
,然后sudo systemctl daemon-reload && sudo systemctl restart mysqld - 生产环境不建议长期关闭,应改配SELinux上下文:
sudo semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?",再sudo restorecon -Rv /var/lib/mysql - 避免把
datadir设在/home/xxx/mysql_data——ProtectHome=true下这条路永远走不通
配置文件权限过宽导致MySQL直接退出
MySQL启动时若发现/etc/my.cnf或/etc/my.cnf.d/*.cnf权限为666、664甚至属主不是root,会直接拒绝加载并报File protection error,连错误日志都不写。
检查命令:sudo ls -l /etc/my.cnf,正确输出应为-rw-r--r-- 1 root root。
- 修复命令:
sudo chown root:root /etc/my.cnf && sudo chmod 644 /etc/my.cnf - 若使用
include目录(如/etc/my.cnf.d/),整个目录需chmod 755,且内部所有.cnf文件都得是644、root:root - 特别注意
expire_logs_days等已废弃参数:MySQL 8.0+会因识别到该配置项直接abort,需替换为binlog_expire_logs_seconds
最易被忽略的是:mysqld进程实际运行用户对socket和pid-file路径的写权限——即使/var/lib/mysql权限正确,/run/mysqld/不存在或属主不对,照样启动失败。

















