Errcode: 13 权限拒绝问题80%以上由SELinux导致,需先用getenforce或sestatus确认是否为Enforcing模式;临时设为permissive可验证,永久修复应通过semanage fcontext添加mysqld_db_t等上下文并执行restorecon -Rv刷新。

Errcode: 13 权限拒绝问题,80%以上情况与 SELinux 策略直接相关,尤其在 CentOS/RHEL 8+、AlmaLinux、Rocky Linux 等默认启用 SELinux 的系统上。
确认 SELinux 是否处于 enforcing 模式
MySQL 启动失败但日志里只显示 Can't create/write to file 或 Can't read dir of '/etc/mysql/conf.d/',先别急着改目录权限——先看 SELinux 状态:
- 运行
getenforce:若输出Enforcing,就是它在拦截 - 运行
sestatus:确认当前模式、策略类型(通常是targeted)和启用状态 - 临时验证:执行
sudo setenforce 0,再试systemctl start mysqld;如果成功,基本锁定是 SELinux 导致
不关 SELinux,而是精准放行 MySQL 访问路径
永久禁用 SELinux(SELINUX=disabled)风险高、不符合安全规范。更稳妥的做法是保留 enforcing 模式,仅放宽对 MySQL 关键路径的访问控制:
- 对数据目录(如
/var/lib/mysql):sudo semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?"sudo restorecon -Rv /var/lib/mysql - 对配置目录(如
/etc/mysql/conf.d/):sudo semanage fcontext -a -t mysqld_etc_t "/etc/mysql/conf.d(/.*)?"sudo restorecon -Rv /etc/mysql/conf.d - 对临时文件目录(如
/tmp下的ibXXX文件):sudo semanage fcontext -a -t mysqld_tmp_t "/tmp/ib.*"sudo restorecon -v /tmp/ib*
检查并启用 mysqld 相关布尔值
某些操作(比如 SELECT ... INTO OUTFILE)被 SELinux 默认禁止,需显式开启对应布尔开关:
- 查看当前设置:
getsebool -a | grep mysqld - 关键布尔值包括:
mysqld_disable_trans(允许 mysqld 切换上下文)、mysqld_can_network(网络访问)、mysqld_connect_any(连接任意端口) - 启用导出功能:
sudo setsebool -P mysqld_disable_trans on(-P表示永久生效) - 注意:
mysqld_disable_trans on并非完全关闭域转换,而是让 mysqld 在受限范围内获得更宽松的 I/O 权限
Docker 场景下 SELinux 标签必须显式声明
在启用了 SELinux 的宿主机上运行 MySQL 容器时,挂载宿主机目录(如 -v /my/data:/var/lib/mysql)会因上下文不匹配被拒绝,即使目录权限全开也不行:
- 错误典型表现:
can't create /write to file './ibdata1' (errcode: 13) - 根本原因:容器内进程无法继承宿主机目录的 SELinux 上下文
- 解决方式:在挂载时加
:z或:Z标签docker run -v /my/data:/var/lib/mysql:z mysql:8.0其中:z表示“此卷由多个容器共享”,:Z表示“仅此容器专用”;二者都会自动重标 SELinux 上下文为container_file_t - 验证是否生效:
ls -Z /my/data应显示类似unconfined_u:object_r:container_file_t:s0
真正容易被忽略的点是:SELinux 策略变更后,restorecon 必须执行,且需覆盖所有子路径(-R);另外,Docker 的 :z 标签不是可选项,而是 SELinux 环境下的强制约定——漏掉它,改再多权限也没用。


















