mysql启动卡在innodb错误13,本质是mysqld无权访问datadir或创建ibdata1等文件,主因包括目录属主非mysql用户、权限过严、selinux拦截、docker uid/gid错位或mysql系统表损坏/行格式不兼容。

MySQL启动卡在InnoDB: Operating system error number 13
这不是文件不存在,而是mysqld进程根本没权限进入datadir目录或创建/写入ibdata1、mysql.ibd等InnoDB系统文件。错误日志里出现InnoDB: Filename /var/lib/mysql/ibdata1和File operation call: 'create',说明InnoDB引擎初始化阶段就失败了。
常见诱因包括:
- datadir目录属主不是
mysql用户(比如是root或你自己的用户名) - 目录权限太严,比如
drwx------(仅属主可读写执行),而mysqld以mysql身份运行,无法进入 - SELinux启用且策略拒绝容器或服务访问挂载路径(尤其在CentOS/RHEL上)
- Docker挂载时宿主机目录UID/GID与容器内
mysql用户(通常是UID 999或27)不匹配
别急着chmod -R 777 /var/lib/mysql——这会破坏最小权限原则,且可能被SELinux或systemd的保护机制覆盖。先确认当前datadir归属:ls -ld /var/lib/mysql,输出应类似drwxr-x--- 5 mysql mysql;如果不是,执行sudo chown -R mysql:mysql /var/lib/mysql,再设权限为750(而非755,避免组外可读)。
docker run mysql报Errcode: 13且挂载了宿主机目录
Docker场景下,Errcode: 13几乎总是源于UID/GID错位或SELinux拦截。例如你用-v /host/data:/var/lib/mysql启动,但宿主机/host/data属主是root:root,而容器内mysqld默认以mysql用户(UID 999)运行,它对宿主机目录无权写入。
实操步骤:
- 查容器内mysql用户UID:
docker run --rm mysql:8.0 id -u mysql(常见为999) - 改宿主机目录属主:
sudo chown -R 999:999 /host/data(注意:不要用用户名,用UID/GID更可靠) - 若系统启用了SELinux(
getenforce返回Enforcing),加:z或:Z标签:-v /host/data:/var/lib/mysql:z - 避免用
--user root强行提权——MySQL 8.0+明确禁止以root身份启动InnoDB
验证是否生效:进容器docker exec -it <container> sh</container>,然后touch /var/lib/mysql/testfile,能成功才说明权限通了。
启动后仍报Permission denied但datadir权限正确
当chown和chmod都做完,还是看到mysqld: File './binlog.index' not found (OS errno 13),问题很可能不在文件系统层,而在MySQL权限子系统未就绪。
典型表现:
-
sudo mysqld --skip-grant-tables --skip-networking能启动,但mysql -u root连进去后USE mysql报Access denied -
FLUSH PRIVILEGES失败,或执行SELECT * FROM user直接报错 - 原因是
mysql.user表结构损坏(比如从MySQL 5.7备份还原到8.0,缺失password_history字段),导致权限加载中断,mysqld放弃后续文件操作
此时errno 13是副作用,不是根源。修复方法是绕过权限校验,强制重载:
- 用
--skip-grant-tables启动后,执行ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';(哪怕密码没变,这条语句会触发内部权限表重建) - 再执行
FLUSH PRIVILEGES;,退出,正常重启mysqld - 如果
mysql库本身为空或损坏(ls -la /var/lib/mysql/mysql/显示大小为0),必须从备份恢复整个mysql库,不能只导user表
MySQL 8.0+ 的mysql.ibd行格式不兼容
最隐蔽的一点:MySQL 8.0默认用COMPACT行格式建系统表,但如果你是从老版本迁移过来,mysql.ibd可能是REDUNDANT格式。InnoDB加载时发现格式不匹配,会静默拒绝并报errno 13,连SHOW TABLES都执行不了。
确认方式:
- 看错误日志是否有
InnoDB: Tablespace mysql is using wrong file format类提示 - 用
innodb_ruby工具或hexdump -C /var/lib/mysql/mysql/mysql.ibd | head -20查文件头(REDUNDANT和COMPACT的page type标识不同)
解决办法只有两个:
- 用
mysqld --initialize-insecure重建空白系统库,再手动导入修复好的user、db等表(注意字符集和ROW_FORMAT=COMPACT) - 或者停库后用
ALTER TABLE mysql.user ROW_FORMAT=COMPACT;逐个转换(风险高,需先备份)
行格式不匹配的问题不会出现在日志显眼位置,必须结合mysql.ibd文件大小、SHOW ENGINE INNODB STATUS输出和InnoDB初始化日志交叉判断。











