必须停库操作,不能边运行边改路径;否则轻则启动失败,重则数据损坏。需先用SELECT @@datadir确认真实datadir路径并验证权限,停服务后完整复制数据(非剪切),修改my.cnf或my.ini中[mysqld]段datadir指向新路径,确保属主、权限及socket/pid-file同步更新,最后查error log验证启动。

必须停库操作,不能边运行边改路径;否则轻则启动失败,重则数据损坏。
确认当前 datadir 路径和权限是否可写
别信配置文件里写的 datadir,MySQL 实际加载的路径可能被覆盖或未生效。登录后直接查:
SELECT @@datadir;
结果可能是 /var/lib/mysql 或 C:\ProgramData\MySQL\MySQL Server 8.0\Data 这类路径。接着用系统命令验证:
- Linux 下执行
ls -ld /path/to/datadir,确认属主是mysql:mysql,且有读写权限 - Windows 下右键新目录 → 属性 → 安全 → 编辑,确保
NETWORK SERVICE或你配置的服务账户有「完全控制」权限 - 如果新路径挂载在非系统盘(如
/data),检查挂载参数是否含noexec或nosuid—— 这会导致 MySQL 拒绝启动
停库后完整复制数据,不是 mv 也不是 rsync -a
MySQL 的 ibdata1、ib_logfile* 和表空间文件依赖内部路径校验与时间戳一致性,简单移动或同步极易出错。
正确做法是:
- 先执行
sudo systemctl stop mysqld(Linux)或net stop mysql80(Windows,服务名按实际查) - 确认进程已退出:
ps aux | grep mysqld(Linux)或tasklist | findstr mysqld(Windows)应无输出 - 用
cp -a /var/lib/mysql /new/path/(Linux)或xcopy /E /I "C:\old\Data" "D:\new\Data"(Windows)完整复制 - 对比文件数量:
find /old/path -type f | wc -l和find /new/path -type f | wc -l必须一致
修改 my.cnf 或 my.ini 中的 [mysqld] 段
配置文件位置不统一,别硬猜。Linux 常见于 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf;Windows 通常是 C:\ProgramData\MySQL\MySQL Server 8.0\my.ini(ProgramData 是隐藏目录)。
编辑时注意:
- 只改
[mysqld]段下的datadir,其他段(如[client])误写会静默忽略 - 确保新路径末尾包含
Data(Windows)或对应子目录名(Linux),例如datadir = /home/mysql/data,不是/home/mysql - 绝对不要加
skip-grant-tables—— 它会让 MySQL 跳过权限系统初始化,mysql系统库根本不会加载,连SHOW DATABASES都报错
启动失败时优先看 error log 前三行
MySQL 启动失败不报具体错误,但日志一定有线索。Linux 默认日志在 /var/log/mysqld.log 或 datadir 下的 hostname.err;Windows 在 datadir 下同名文件。
常见报错及对应方向:
-
InnoDB: Unable to lock ./ibdata1→ 新目录权限没给对,或旧进程残留 -
Can't start server: Bind on unix socket→socket路径没同步更新,或目录属主不对 -
Table 'mysql.plugin' doesn't exist→ 数据没完整复制,或skip-grant-tables干扰了系统表加载
迁移后务必保留旧 datadir 至少 24 小时,直到确认所有业务查询、事务、备份均正常 —— InnoDB 的崩溃恢复机制对路径变更极其敏感,跳过验证直接删旧目录是最高频的数据丢失原因。


















