必须停服后迁移并验证权限与SELinux上下文:先用SELECT @@datadir确认真实路径,再systemctl stop mysqld停库,用rsync -av或cp -a复制数据,同步修改my.cnf中datadir、socket、pid-file,修复SELinux上下文和750权限,最后查错误日志验证启动。

直接改 datadir 不行,不配权限、不处理 SELinux、不验证路径可写性,90% 会启动失败。
确认当前数据目录和 MySQL 版本
别凭经验猜路径,先查真实值。MySQL 5.7 和 8.0 的默认路径虽都是 /var/lib/mysql,但初始化方式、日志位置、甚至 socket 路径都可能不同。
- 登录 MySQL 执行:
SELECT @@datadir; - 检查版本:
mysql --version或mysqld --version - 看服务状态:
systemctl status mysqld确认是否已停止(必须停)
迁移前必须做的三件事
跳过任意一项,systemctl start mysqld 很大概率卡在 “activating (start)” 或直接报错退出。
- 新目录需用
cp -a或rsync -av复制(保留所有权限、属主、时间戳),不能只mv后再chown—— 某些隐藏文件(如ib_buffer_pool、mysql.sock.lock)的元数据会丢失 - SELinux 必须处理:
semanage fcontext -a -t mysqld_db_t "/new/path(/.*)?",然后restorecon -Rv /new/path;否则即使权限全对,mysqld也读不了自己的文件 - 确保新路径所在分区有足够空间且不是 noexec/nosuid 挂载选项(
mount | grep $(df . | tail -1 | awk '{print $1}')查看)
配置文件修改和启动验证
/etc/my.cnf 里只改 datadir 不够,配套项漏掉一个就可能连不上库或日志写失败。
- 在
[mysqld]段落中同时设置:datadir、socket(如/new/path/mysql.sock)、pid-file(如/new/path/mysqld.pid),否则客户端连localhost会因找不到 socket 报错2002 - 启动后立刻检查:
systemctl status mysqld看是否 active,再查tail -n 20 /var/log/mysqld.log—— 常见错误如Can't open the mysql.plugin table表示权限或 SELinux 未生效 - 验证数据完整:
mysql -u root -p -e "SHOW DATABASES;",别只看服务起来没,要看库和表都在不在
最易被忽略的是 SELinux 上下文重置和 socket 路径同步 —— 这两个点不处理,哪怕 datadir 改对了,服务也起得来,但应用仍连不上数据库。


















