修改my.cnf的datadir需先停服务,再用rsync迁移数据并更新配置;linux需处理selinux/apparmor策略,windows还需重注册mysql服务。

修改 my.cnf 中的 datadir 配置项
MySQL 启动时读取 my.cnf(Linux 通常在 /etc/my.cnf 或 /etc/mysql/my.cnf,macOS 可能在 /usr/local/etc/my.cnf)中的 datadir 值来定位数据目录。直接修改该路径即可指定新位置:
[mysqld] datadir = /new/path/to/mysql/data
注意:必须确保 MySQL 进程对新路径有完整读写权限(包括父目录),且该路径下不能残留旧数据文件;否则启动会失败或出现表损坏。
迁移已有数据前必须停用 MySQL 服务
直接改 datadir 并重启会导致 MySQL 找不到系统表(如 mysql.user),报错 Can't open the mysql.plugin table 或直接拒绝启动。正确流程是:
- 执行
sudo systemctl stop mysql(或brew services stop mysqlmacOS)彻底停止服务 - 用
rsync -av /var/lib/mysql/ /new/path/to/mysql/data/完整复制(保留权限和符号链接) - 确认新路径下存在
ibdata1、mysql/、performance_schema/等关键文件和目录 - 更新
my.cnf的datadir,再启动服务
SELinux 或 AppArmor 会拦截新路径访问(Linux 常见坑)
即使权限设置正确,CentOS/RHEL 启用 SELinux、Ubuntu 启用 AppArmor 时,MySQL 默认只被允许访问标准路径(如 /var/lib/mysql)。不处理会卡在启动阶段,日志中出现类似 Permission denied 但无明确进程名。
临时验证是否为该问题:运行 sudo setenforce 0(SELinux)或 sudo systemctl stop apparmor,再尝试启动。若成功,则需持久化策略:
- SELinux:执行
sudo semanage fcontext -a -t mysqld_db_t "/new/path/to/mysql/data(/.*)?",再sudo restorecon -Rv /new/path/to/mysql/data - AppArmor:编辑
/etc/apparmor.d/usr.sbin.mysqld,添加/new/path/to/mysql/data/** rwk,,然后sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
Windows 下修改 my.ini 和服务注册信息
Windows 不仅要改 my.ini 中的 datadir,还需同步更新 Windows 服务注册表项,否则服务仍按旧路径启动:
- 先以管理员身份运行命令行,执行
sc query mysql确认服务名(可能是mysql80等) - 停止服务:
net stop mysql - 卸载旧服务:
mysqld --remove mysql - 安装新服务:
mysqld --install mysql --defaults-file="C:\path\to\my.ini" - 启动:
net start mysql
漏掉服务重注册这步,是 Windows 用户迁移后“配置改了但没生效”的最常见原因。











