直接改datadir常失败,关键在权限、SELinux和socket路径三处;需先用SELECT @@datadir确认真实路径,查mysqld --verbose --help确认生效配置文件,用rsync -avX迁移数据,同步修改datadir、socket及log-error路径,设mysql属主并修复SELinux上下文。

直接改 datadir 不一定能启动成功,关键在权限、SELinux 和 socket 路径三处。
确认当前数据目录和配置文件位置
别猜,先查准路径。MySQL 8.0 及以上版本可能用 /etc/my.cnf.d/mysql-server.cnf,而不是老的 /etc/my.cnf。执行:
mysql -u root -p -e "SELECT @@datadir;"
再查配置加载顺序:
mysqld --verbose --help | grep "Default options" -A 1
常见错误:改了 /etc/my.cnf,但实际生效的是 /etc/my.cnf.d/*.cnf 里的配置,导致修改无效。
迁移数据时用 rsync 而不是 cp 或 mv
rsync 能保留 SELinux 上下文和文件属性,cp -a 在 CentOS 7 上有时会丢掉 system_u:object_r:mysqld_db_t:s0 上下文,导致启动失败(日志里报 Permission denied 但不提示 SELinux)。
- 停服务:
systemctl stop mysqld - 创建目标目录并赋权:
mkdir -p /data/mysql && chown -R mysql:mysql /data/mysql - 同步数据:
rsync -avX /var/lib/mysql/ /data/mysql/(注意末尾斜杠,表示同步内容而非整个目录)
如果已用 cp 迁移过,补救命令:restorecon -Rv /data/mysql。
必须同步改 socket 和 log-error 路径
只改 datadir 启动会卡住或报错 Can't start server : Bind on unix socket: Permission denied。因为 MySQL 默认仍试图在旧路径建 mysql.sock,而新目录没写权限或上下文不对。
在生效的配置文件中(比如 /etc/my.cnf.d/mysql-server.cnf 的 [mysqld] 段),至少要加这三项:
[mysqld] datadir=/data/mysql socket=/data/mysql/mysql.sock log-error=/var/log/mysqld.log
注意:log-error 不必挪到新路径,但必须确保 /var/log/ 下该文件可被 mysql 用户写入(chown mysql:mysql /var/log/mysqld.log)。
启动失败时优先看 SELinux 和 socket 权限
常见现象:执行 systemctl start mysqld 没反应,systemctl status mysqld 显示 failed,但日志为空或只有“Starting”字样。
- 临时关 SELinux 测试:
setenforce 0,再试启动。若成功,说明是上下文问题,需semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"+restorecon -Rv /data/mysql - 检查 socket 文件:
ls -Z /data/mysql/mysql.sock,应显示system_u:object_r:mysqld_db_t:s0;若为unconfined_u,就是上下文没设对 - 客户端连不上时,别急着改用户 host,先确认连接用的是
localhost还是127.0.0.1—— 前者走 socket,后者走 TCP,路径错会导致ERROR 2002 (HY000)
真正麻烦的不是移动数据,而是让新路径被 SELinux 认可、让 socket 文件能生成、让客户端知道去哪找它——这三个点漏一个,服务就起不来。


















