必须停服务再操作,否则易致启动失败或数据损坏;确认真实datadir用select @@datadir;停服务后rsync复制并保留权限上下文;同步更新socket、apparmor/selinux策略;启动后优先查错误日志定位问题。

必须停服务再操作,不能边跑边改路径——否则 mysqld 启动失败是大概率事件,严重时 ibdata1 或数据字典损坏会导致整个实例不可恢复。
确认当前真实 datadir 并停服务
别信配置文件,SELECT @@datadir; 才是运行时真实路径。如果返回空或旧路径,说明配置没生效或 MySQL 根本没起来。
停服务前先查清服务名:
- Linux:
sudo systemctl stop mysqld(或mysql,取决于发行版),再用ps aux | grep mysqld确认进程已退出 - Windows:管理员 CMD 运行
net stop mysql80(服务名以sc query输出为准)
不彻底停掉就复制或改配置,后续几乎必报错。
用 rsync 复制数据并保留权限与上下文
cp -r 会丢 socket 权限、SELinux 上下文、扩展属性,导致启动后报 Permission denied 或 Can't open file。
正确做法:
- Linux:
sudo rsync -avh --progress /var/lib/mysql/ /mnt/data/mysql/(注意源路径末尾有/,否则目标里会多一层mysql) - Windows:
xcopy /E /I "C:\ProgramData\MySQL\MySQL Server 8.0\Data" "E:\mysql8\Data" - 同步完立刻修正属主:
sudo chown -R mysql:mysql /mnt/data/mysql - SELinux 启用时必须补上下文:
sudo semanage fcontext -a -t mysqld_db_t "/mnt/data/mysql(/.*)?"; sudo restorecon -Rv /mnt/data/mysql
改配置 + 同步 socket/pid 路径 + 更新安全策略
datadir 改了但 socket 还在旧路径,客户端连不上;AppArmor/SELinux 没放行新路径,服务直接被拦截。
必须同步处理:
- 在
[mysqld]段同时设置:datadir = /mnt/data/mysql和socket = /mnt/data/mysql/mysql.sock - Ubuntu 必须改 AppArmor:
sudo nano /etc/apparmor.d/usr.sbin.mysqld,在}前加两行:/mnt/data/mysql/ r,和/mnt/data/mysql/** rwk,,然后sudo systemctl restart apparmor - CentOS/RHEL 若启 SELinux,确保父目录可进入:
sudo chmod o+x /mnt/data(否则chdir失败)
启动后第一件事是看错误日志,不是建库
启动失败的绝大多数原因,都藏在日志里,而不是控制台输出。
Linux 查日志:tail -n 50 /var/log/mysqld.log 或查 log-error 配置项指向的文件;Windows 查 C:\ProgramData\MySQL\MySQL Server X.X\Data\*.err。
典型报错对应动作:
-
Can't start server: Bind on unix socket: Permission denied→socket路径没同步更新,或父目录缺o+x -
Table 'mysql.plugin' doesn't exist→ 数据没拷全,或chown漏了,或 SELinux 上下文没恢复 -
Can't connect to local MySQL server through socket→ 客户端还在找旧.sock,需在[client]和[mysql]段也配socket=
迁移后验证完成前,旧数据目录别删——这是最后的回滚底线。











