Linux下迁移MySQL 8.0 datadir后报OS errno 13,主因是SELinux安全上下文未同步,需用semanage fcontext设置mysqld_db_t类型并restorecon刷新;Windows下则因服务账户无目录访问权,须在文件夹安全策略中添加NetworkService或自定义账户并赋予完全控制权限。

迁移 MySQL 8.0 的 datadir 后报 OS errno 13 - Permission denied,不是配置写错了,而是操作系统层面的权限或安全策略没同步过去——Linux 下大概率是 SELinux 上下文丢失,Windows 下则是服务账户无访问权。
Linux 下 SELinux 安全上下文不匹配
MySQL 迁移目录后启动失败,日志里反复出现 OS errno 13,但 chown mysql:mysql 和 chmod 750 都做了,还是不行?八成是 SELinux 拦住了。它不看传统权限,只认 context。
- 先确认是否启用:运行
sestatus,输出enabled且current mode是enforcing就坐实了 - 查原目录上下文:
ls -Z /var/lib/mysql(假设旧路径),记下类似system_u:object_r:mysqld_db_t:s0的值 - 给新目录打上同样上下文:
sudo semanage fcontext -a -t mysqld_db_t "/new/mysql/dir(/.*)?",再执行sudo restorecon -Rv /new/mysql/dir - 别图省事关 SELinux——临时设为
permissive可验证问题,但生产环境必须修复上下文,不能靠关闭保命
Windows 下 MySQL 服务账户无数据目录访问权
在 Windows 上把 datadir 换到 D:\mysql\data 后,net start mysql 报“错误 5:拒绝访问”,不是 my.ini 路径错,而是服务运行账户根本没权限读写那个文件夹。
- MySQL 服务默认以
NT AUTHORITY\NetworkService或自定义账户运行,不是当前登录用户 - 右键新
datadir文件夹 → “属性” → “安全” → “编辑” → “添加”,输入NetworkService(或你注册服务时指定的账户)→ 勾选“完全控制” - 若用的是自定义账户(如
mysqlsvc),确保该账户已加进Administrators组,且密码未过期 - 改完权限后必须重启服务:
net stop mysql && net start mysql,不能只 reload 配置
datadir 路径本身触发系统级拦截
即使权限和上下文都对,路径含特殊字符或位置太“敏感”,也会被 OS 拦截。MySQL 8.0 对路径合法性检查比以前更硬。
- 路径中禁止空格、中文、Unicode 字符;
D:\Program Files\Mysql\data就不行,得改成D:/mysql/data(注意正斜杠更稳) - 避免放在
C:\Users\、C:\Windows或 OneDrive 同步目录下——Windows Defender 或云同步进程会锁文件 - Linux 下别放
/home或/tmp,这些挂载点可能有noexec或nosuid选项,导致 mysqld 无法加载引擎 - 确认磁盘配额没超限:
df -h看剩余空间,quota -u mysql查用户配额(如有)
真正卡住人的地方,往往不是 MySQL 自己报错,而是它启动前就被 OS 拦在门外——查 errno 13 必须跳出 MySQL 日志,先看系统层到底拦了什么。SELinux 的 audit.log、Windows 事件查看器里的“安全”日志,比 mysqld.err 有用得多。


















