MySQL启动报Errcode 13本质是mysqld进程无权访问关键目录或文件,主因包括datadir/pid-file路径权限不匹配、SELinux强制拦截、初始化参数污染导致binlog.index异常生成,需按顺序排查并修复。

这是典型的权限拒绝错误,不是配置写错或服务没装好,而是 mysqld 进程根本没被允许读写关键目录或文件。
看懂 error 13 的真实含义
OS error number 13 就是 Permission denied。InnoDB 报这个错时,后面通常紧跟着一句:The error means mysqld does not have the access rights to the directory。它不是在抱怨路径写错了,而是在说“我连 ./ibdata1 都打不开——你让我怎么活”。
常见触发点包括:
-
/var/lib/mysql或自定义datadir目录归属不是mysql用户 -
pid-file指向的父目录(如/var/run/mysqld/)不存在,或存在但属主/权限不对 - SELinux 处于 enforcing 模式,且未放行 mysqld 对数据目录的访问
-
my.cnf文件本身权限是777,MySQL 会直接忽略该配置(日志里会提示my.cnf ignored)
检查 datadir 和 pid-file 权限是否匹配
宝塔面板默认用 /www/server/data 作 datadir,但 my.cnf 里 pid-file 可能还写着 /var/run/mysqld/mysqld.pid——这个路径在宝塔环境通常不存在,且即使手动建了目录,也极大概率没给 mysql 用户写权限。
实操建议:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 运行
grep -E "^(datadir|pid-file)" /etc/my.cnf确认两个路径 - 检查
datadir所在目录:用ls -ld /www/server/data,确保输出中 owner 是mysql,不是root - 检查
pid-file的父目录:比如是/var/run/mysqld/,先ls -ld /var/run/mysqld;若报“no such file”,就mkdir -p /var/run/mysqld && chown mysql:mysql /var/run/mysqld - 统一修正权限:
chown -R mysql:mysql /www/server/data && chmod 755 /www/server/data
SELinux 或安全模块干扰启动
CentOS/RHEL 系统上,哪怕所有文件权限都对,SELinux 也可能拦住 mysqld 访问数据目录。错误日志里看不到 SELinux 字样,但 journalctl -xe | grep avc 会刷出一堆 avc: denied 记录。
临时验证方法:
- 执行
setenforce 0(不重启),再试systemctl start mysqld - 如果成功了,说明就是 SELinux 问题;别长期关,改上下文更稳妥:
semanage fcontext -a -t mysqld_db_t "/www/server/data(/.*)?" && restorecon -Rv /www/server/data
初始化参数污染导致 binlog.index 权限异常
MySQL 8 初始化时如果加了非必要参数(比如 --lower_case_table_names=1),会导致 binlog.index 文件生成位置异常或权限失控,后续启动就卡在 File './binlog.index' not found (Errcode: 13)。
这种情况不能硬 chmod,因为文件压根没按预期生成。必须清理后重做纯净初始化:
- 停服务:
systemctl stop mysqld - 清空数据目录:
rm -rf /www/server/data/*(注意备份!) - 只用必要参数初始化:
mysqld --initialize --user=mysql - 启动:
systemctl start mysqld
记住:初始化阶段只认 --user,其他所有参数都该挪到 my.cnf 里,由运行时加载。

















