八成是SELinux拦截:需用semanage声明mysqld_db_t上下文并执行restorecon -Rv生效,同时确保datadir归属mysql:mysql、权限750、socket/pid路径同步更新且SELinux标签覆盖全部子目录。

MySQL改datadir后启动失败,八成是SELinux拦的
Linux上改完datadir重启MySQL直接卡住或报Permission denied,但chown和chmod都对了?基本可以锁定SELinux上下文没更新。它不看文件属主,只认安全标签——哪怕路径、权限、服务全对,标签不对照样拒绝访问。
确认SELinux状态并重打mysqld_db_t标签
先查是否启用:sestatus。若输出enforcing或permissive,就得处理上下文。
- 用
semanage fcontext -a -t mysqld_db_t "/new/path/mysql(/.*)?"注册新路径模式(注意末尾(/.*)?不能漏) - 立即应用:
restorecon -Rv /new/path/mysql。这步必须做,chown不会自动更新SELinux标签 - 验证是否生效:
ls -Z /new/path/mysql,第一列应含system_u:object_r:mysqld_db_t:s0 - 别用
setenforce 0临时关SELinux来“验证”——它掩盖问题,不是解决方案
datadir迁移时rsync和目录权限的硬性要求
SELinux只是其中一环,漏掉下面任意一条,MySQL照样起不来:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 停服务必须彻底:
systemctl stop mysqld后,再跑ps aux | grep mysqld确认无残留进程 -
rsync命令末尾斜杠不能少:rsync -av /var/lib/mysql/ /new/path/mysql/——少一个/会导致嵌套复制,ibdata1跑到/new/path/mysql/mysql/里去 - 属主必须是
mysql:mysql,不能是root或空用户:chown -R mysql:mysql /new/path/mysql - 目录权限严格限定为
750:chmod 750 /new/path/mysql。设成777或755,MySQL 8.0+会主动退出,并在错误日志里写secure-file-priv警告
配置文件里除了datadir,还得同步改socket和pid-file
很多人只改datadir,结果启动时报Can't start server: Bind on unix socket: Permission denied——因为socket文件还试图写回旧路径的/var/run/mysqld/,而新datadir下没这个目录,或SELinux没放行该路径。
- 在
[mysqld]段加:socket = /new/path/mysql/mysql.sock和pid-file = /new/path/mysql/mysqld.pid - 在
[client]段也加一行:socket = /new/path/mysql/mysql.sock,否则本地mysql命令连不上 - 如果用
systemd管理,还要检查/usr/lib/systemd/system/mysqld.service里有没有Environment=MYSQLD_OPTS=--datadir=...硬编码,它会覆盖my.cnf
最易被忽略的是:SELinux策略更新后,restorecon必须对整个新目录递归执行,包括子目录如mysql/、performance_schema/——只打根目录标签,子目录仍是default_t,MySQL初始化阶段就会失败。

















