必须停库操作,不能边运行边改路径;否则轻则启动失败,重则数据损坏。需先确认当前datadir路径,停服务后完整复制data目录(非剪切),修改配置文件中datadir指向新路径并正确设置权限,最后验证启动与日志。

必须停库操作,不能边运行边改路径;否则轻则启动失败,重则数据损坏。
确认当前 datadir 路径
先查清楚 MySQL 正在用哪个目录,避免改错地方。用管理员权限打开终端(Windows 是 CMD/PowerShell,Linux 是 bash),执行:
mysql -u root -p -e "SHOW VARIABLES LIKE 'datadir';"
输出类似:
+---------------+---------------------------------------------+ | Variable_name | Value | +---------------+---------------------------------------------+ | datadir | C:ProgramDataMySQLMySQL Server 8.0Data | +---------------+---------------------------------------------+
注意这个路径末尾的 Data 文件夹名 —— 新路径也得以它结尾,不能只写到上一级。
停服务 + 复制数据(不是剪切)
迁移的本质是「复制 + 切换」,不是直接移动。旧数据必须保留到验证成功后再删。
- Windows:用管理员 CMD 运行
net stop mysql80(服务名按你实际的来,比如MySQL80、mysqld) - Linux:运行
sudo systemctl stop mysqld或sudo service mysql stop - 确认进程已退出:
ps aux | grep mysqld(Linux)或tasklist | findstr mysqld(Windows)应无结果 - 创建目标目录,例如
F:dbasesmysql80Data(Windows)或/home/mysql/data(Linux) - 完整复制整个原
Data目录内容(不是只复制子文件夹):xcopy /E /I "C:ProgramDataMySQLMySQL Server 8.0Data" "F:dbasesmysql80Data"(Windows);sudo cp -av /var/lib/mysql/* /home/mysql/data/(Linux)
修改配置文件并处理权限
配置文件位置不统一,别硬猜:
- Windows 常见路径:
C:ProgramDataMySQLMySQL Server 8.0my.ini(ProgramData是隐藏文件夹) - Linux 常见路径:
/etc/my.cnf或/etc/mysql/my.cnf,也可能在/usr/my.cnf - 编辑时找
[mysqld]段落,修改或新增datadir行:datadir=F:\dbases\mysql80\Data(Windows 注意双反斜杠或正斜杠);datadir=/home/mysql/data(Linux) - Linux 必须修正权限:
sudo chown -R mysql:mysql /home/mysql/data和sudo chmod 750 /home/mysql/data - Windows 需检查目标文件夹的「安全」选项卡,确保
NETWORK SERVICE或运行 MySQL 服务的用户有「完全控制」权限 - 如果启用了 SELinux(CentOS/RHEL),还要执行:
sudo semanage fcontext -a -t mysqld_db_t "/home/mysql/data(/.*)?",再sudo restorecon -Rv /home/mysql/data
启动失败时最该看的三件事
服务起不来?90% 的问题出在这三个地方:
- 配置文件里
datadir路径拼写错误,或末尾多/少了一个Data(比如写成/home/mysql/就不行) - Linux 下新目录权限没给对,
ls -ld /home/mysql/data应显示属主是mysql,且至少有drwxr-x--- - Windows 下没用管理员权限改
my.ini,或改完没保存(记事本有时会静默失败) - 启动后立刻查错误日志:
mysqld --defaults-file="C:path omy.ini" --console(Windows 测试启动);Linux 查/var/log/mysqld.log或journalctl -u mysqld -n 50 -f
真正麻烦的不是改路径本身,而是把 ibdata1、ib_logfile*、mysql.ibd 这些系统级文件连同所有业务库一起完整复制过去 —— 少一个,MySQL 就认不出自己的数据。别跳步,也别图快直接剪切。











