必须停服并确认路径可写,mysql 8.0 不支持热迁移;需彻底停止服务、创建目标目录、正确设置权限(linux:chown -r mysql:mysql,windows:network service 完全控制),同步更新 socket 和 pid-file 路径,复制全部文件(含 ibdata1、ib_logfile*、binlog.index),重启后用 show variables like 'datadir' 验证生效,并保留旧目录至少一周用于回滚。

修改 datadir 前必须停服并确认路径可写
MySQL 8.0 不支持热迁移数据目录,datadir 变更前必须彻底停止服务(systemctl stop mysqld 或 Windows 服务管理器中停止 MySQL80),否则复制或移动文件会失败或损坏。目标目录需提前创建,且 MySQL 进程用户(Linux 下通常是 mysql,Windows 下是 NETWORK SERVICE 或安装时指定的用户)必须对其有完全读写权限。
- Linux:执行
chown -R mysql:mysql /data/mysql,再chmod 750 /data/mysql - Windows:右键新目录 → “属性” → “安全” → 编辑 → 添加
NETWORK SERVICE→ 勾选“完全控制” - 切勿用 root 或 Administrator 直接运行 mysqld 启动,否则可能绕过权限检查但后续崩溃
配置文件里改 datadir 要同步修正 socket 和 pid-file
只改 datadir 很容易启动失败——因为 socket 文件默认放在原 datadir 下,pid-file 也常依赖旧路径。my.cnf 或 my.ini 中必须一并更新:
-
datadir=/data/mysql(Linux)或datadir=D:/MySQLData(Windows,用正斜杠或双反斜杠) -
socket=/data/mysql/mysql.sock(Linux);Windows 不需要 socket,但要确认tmpdir等路径无冲突 -
pid-file=/data/mysql/mysqld.pid(确保该路径父目录可写) - Windows 下若使用 MySQL Installer 安装,
my.ini通常在C:\ProgramData\MySQL\MySQL Server 8.0\my.ini,编码必须为 ANSI 或 UTF-8 无 BOM
迁移数据不能只靠复制,还要处理符号链接和二进制日志索引
直接 cp -a 或全量复制 datadir 内容只是基础动作。以下三项漏掉任一,服务大概率无法启动:
- Linux 下若原
/var/lib/mysql是挂载点或含符号链接(如mysql.sock指向/tmp),新目录需重建相同结构,或统一用绝对路径避免歧义 - 检查
binlog.index文件内容(位于原datadir根目录),将其中所有旧路径(如./mysql-bin.000001)改为新datadir下的相对路径,否则主从或恢复会找不到 binlog - InnoDB 系统表空间(
ibdata1、ib_logfile*)必须随其他文件一起迁移;若启用了innodb_file_per_table=ON,每个 .ibd 文件也要完整复制
验证是否生效不能只看配置文件,得查运行时变量
重启服务后,打开 MySQL 客户端执行:SHOW VARIABLES LIKE 'datadir';。输出值才是真实生效路径。仅检查 my.cnf 是否修改成功毫无意义——MySQL 可能从命令行参数、环境变量或编译默认值加载配置。
- 同时运行
SELECT @@datadir;,结果应与SHOW VARIABLES一致 - 创建一张测试表并插入数据,然后去新
datadir下确认对应数据库子目录及.frm/.ibd文件已生成 - Linux 下注意 SELinux:若
sestatus显示enforcing,需打标签semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"并执行restorecon -Rv /data/mysql
最易被忽略的是:MySQL 8.0 的 datadir 修改不触发自动迁移,也不清理旧目录。迁移完成后,旧数据目录必须手动保留至少一周用于回滚,确认无误后再删除——误删未完成复制的目录会导致不可逆数据丢失。











