MySQL迁移需确保datadir路径权限正确、文件完整拷贝且配置准确:先查SELECT @@datadir确认真实路径,再chown -R mysql:mysql并验证属主权限;停库后cp -a拷贝全部文件并校验数量;修改my.cnf中[mysqld]段datadir,避免skip-grant-tables干扰;启动失败时优先查看error log前三行定位InnoDB或系统表问题。

确认当前 datadir 路径和权限是否可写
直接查 MySQL 实际在用的路径,别信配置文件里写的——因为可能没生效或被覆盖。登录后执行:
SELECT @@datadir;结果可能是
/var/lib/mysql 或 /usr/local/mysql/data 这类路径。接着用系统命令验证:该目录属主是不是 mysql 用户、有没有读写权限、磁盘空间是否足够。常见错误是把新目录建在 root 下,但没 chown 给 mysql,启动时直接报 Can't start server: Bind on unix socket: Permission denied。
- 用
ls -ld /path/to/new/datadir看属主和权限 - 必须
chown -R mysql:mysql /path/to/new/datadir,不能只改目录不改里面文件 - 如果新路径在非系统盘(比如挂载的
/data),确认挂载选项没加noexec或nosuid
停库后完整拷贝数据,不是 mv 也不是 rsync -a
MySQL 的 ibdata1、ib_logfile*、表空间文件(尤其是开启 innodb_file_per_table=OFF 时)都依赖绝对路径和内部校验,简单 mv 或 rsync -a 可能漏掉隐藏文件或破坏文件时间戳,导致 InnoDB 拒绝启动。稳妥做法是停库 + cp -a(保留所有属性)+ 校验文件数和大小。
- 先执行
systemctl stop mysql(或mysqld_safe --shutdown),确认ps aux | grep mysqld无残留进程 - 用
cp -a /var/lib/mysql /new/path/,不是cp -r——-a包含-p(权限)、-r(递归)、-d(链接) - 对比两边
find /old/path -type f | wc -l和find /new/path -type f | wc -l,数量必须一致
修改 my.cnf 并绕过 skip-grant-tables 类陷阱
配置文件里改 datadir 是基础操作,但容易踩两个坑:一是改了没重启服务(或者重启的是错的服务名,比如 mysqld vs mysql),二是误加 skip-grant-tables 导致权限表加载失败,连 mysql 库都打不开。另外注意:不同发行版配置文件位置不同,mysqld --help --verbose | grep "Default options" 才是真实加载顺序。
- 编辑
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,找到[mysqld]段,改datadir = /new/path - 确保没有其他配置段(比如
[client])里误写了datadir,那会静默忽略 - 不要为了“快速测试”加
skip-grant-tables——它会让 MySQL 跳过权限系统初始化,mysql系统库根本不会加载
启动失败时重点看 error log 里的前三行
启动失败最常卡在 InnoDB 初始化阶段,日志里真正关键的信息往往在报错前几行,比如 InnoDB: Unable to lock ./ibdata1 error 11(文件被占用)、InnoDB: The Auto-extending innodb_system data file './ibdata1' is of a different size(大小不匹配)、或 Can't open the mysql.plugin table(plugin 表路径不对)。这时候别急着重启,先看日志头三行定位根因。
- 查日志路径:
SELECT @@log_error;,通常是/var/log/mysql/error.log或/var/lib/mysql/hostname.err - 启动前清空旧日志:
rm /var/lib/mysql/hostname.err,再systemctl start mysql,立刻tail -n 20 /var/lib/mysql/hostname.err - 如果看到
Table 'mysql.plugin' doesn't exist,说明mysql系统库没复制全,回去检查cp -a是否漏了mysql/子目录
dmesg | tail。










