必须先确认当前datadir路径和mysql运行用户,再停库、复制数据(保留权限)、修改配置文件中datadir等路径、授权新目录,否则90%启动失败;innodb迁移需注意ibdata1等文件版本兼容性。

确认当前 datadir 和 MySQL 运行用户
不查清这两点就改路径,90% 启动失败。在命令行连上 MySQL 执行:SELECT @@datadir;;再用 ps aux | grep mysql(Linux/macOS)或任务管理器(Windows)看进程属主。常见是 mysql 用户,但 XAMPP 默认常以当前登录用户运行(如 Windows 上的 Administrator),迁移后目录权限必须匹配该用户,否则报 Can't change dir to '/new/path/' (Errcode: 13)。
停库 → 复制数据 → 改配置 → 授权,一步不能少
边运行边拷文件会损坏 InnoDB 表空间,必须先停止 MySQL 服务(通过 XAMPP Control Panel 点 Stop,或命令 net stop mysql / systemctl stop mysql)。复制要用保留权限的方式:
-
cp -a /xampp/mysql/data/ /new/path/mysql_data/(Linux/macOS) -
robocopy "C:\xampp\mysql\data" "D:\mysql_data" /E /COPYALL /DCOPY:DAT(Windows)
改 my.ini(Windows)或 /opt/lampp/etc/my.cnf(Linux/macOS)中的 datadir,注意末尾不能带斜杠(C:\mysql_data ✅,C:\mysql_data\ ❌);同时检查 socket、pid-file、log-error 是否也依赖旧路径,一并更新。最后授权:chown -R mysql:mysql /new/path/mysql_data 或右键目录→属性→安全→添加对应用户并赋“完全控制”。
为什么直接复制 data 子目录常报 table doesn't exist in engine
因为 InnoDB 的共享表空间 ibdata1 和重做日志 ib_logfile* 必须与目标 MySQL/MariaDB 版本严格匹配。XAMPP 升级后若从旧版 MySQL 迁移到新版 MariaDB,直接覆盖会导致启动拒绝。此时要么:
- 用
mysqldump -u root -p --all-databases > backup.sql导出再导入(最稳妥) - 若坚持文件迁移:只复制每个数据库子目录(如
wordpress\、phpmyadmin\)和对应.frm+.ibd文件,跳过ibdata1、ib_logfile*、auto.cnf、mysql\下除.frm外的系统表文件
新版启动前,先清空其 data 目录(保留空的 mysql 和 performance_schema 目录),再放入你复制的库目录。
新版 XAMPP 默认用 MariaDB,datadir 路径可能被静默重命名
安装时没勾选“保留配置”,或安装器检测到冲突,会把旧 data 目录改名为 mysql_old 或 mariadb,而不是覆盖。所以别凭经验找 C:\xampp\mysql\data——打开 XAMPP Control Panel → MySQL 行点 Config → 选 my.ini,直接看 datadir=... 的值,这才是唯一可信路径。如果发现指向了 mariadb 目录,说明安装器已干预,你要迁移的目标就是那个目录,不是默认路径。











