确认 MySQL 当前数据目录位置
安装完 MySQL 后,
datadir默认值由配置文件决定,不同系统/安装方式初始路径不同(如
/var/lib/mysql在 Linux,
C:\ProgramData\MySQL\MySQL Server 8.0\Data\在 Windows)。直接改路径前必须先查清当前实际值,否则迁移会失败。 登录 MySQL 执行:
SELECT @@datadir;或查看配置文件(Linux 常为
/etc/my.cnf或
/etc/mysql/my.cnf;Windows 常为
my.ini),搜索
datadir行 注意:如果配置文件里没显式写
datadir,就以 MySQL 启动时默认路径为准,
SELECT @@datadir最可靠
停止 MySQL 服务并复制数据文件
不能在服务运行时直接修改
datadir路径,否则启动报错
Can't start server: Bind on TCP/IP port: Address already in use或更常见的
Table 'mysql.plugin' doesn't exist—— 这是因为系统表未加载,根源是数据目录不对。 Linux:
sudo systemctl stop mysql(或
mysqld,视服务名而定) Windows:
net stop mysql(服务名为实际注册名,可用
sc query | findstr mysql查) 用
rsync -av /var/lib/mysql/ /new/path/mysql/(Linux)或完整复制整个原
datadir目录(含子目录和隐藏文件,如
ibdata1、
ib_logfile*、
mysql/、
performance_schema/等) 切勿只复制数据库名对应的子目录,否则权限表、系统表丢失,MySQL 无法启动
修改配置文件并调整权限
只改
my.cnf或
my.ini中的
datadir不够,新路径的属主和权限必须匹配 MySQL 进程运行用户(通常是
mysql),否则启动时日志报
Can't open the mysql.plugin table. Please run mysql_upgrade或直接拒绝访问。 编辑配置文件,在
[mysqld]段下设置:
datadir = /new/path/mysqlLinux:执行
sudo chown -R mysql:mysql /new/path/mysql和
sudo chmod -R 750 /new/path/mysqlWindows:右键新文件夹 → 属性 → 安全 → 编辑 → 添加
MySQL服务对应用户(如
NT SERVICE\Mysql),赋予“完全控制” 若启用了
selinux(如 CentOS/RHEL),还需运行:
sudo semanage fcontext -a -t mysqld_db_t "/new/path/mysql(/.*)?",再
sudo restorecon -Rv /new/path/mysql
验证启动与检查状态
MySQL 对
datadir内容非常敏感,哪怕多一个空格、少一个文件,都可能卡在初始化阶段,错误日志(
error.log)里常出现
InnoDB: Operating system error number 13(权限拒绝)或
unknown variable 'datadir'(配置语法错)。 Linux 启动:
sudo systemctl start mysql;查看状态:
sudo systemctl status mysqlWindows 启动:
net start mysql;检查错误日志路径(
SHOW VARIABLES LIKE 'log_error';) 成功后执行:
SELECT @@datadir, SCHEMA_NAME FROM information_schema.SCHEMATA;确认路径已更新且所有库可见 若启动失败,优先检查错误日志末尾几行,90% 的问题出在权限、SELinux、路径拼写或残留 pid 文件(
/var/run/mysqld/mysqld.pid) MySQL 数据目录迁移不是改个路径就行的事,核心在于:路径、权限、配置三者严格一致,且每一步都依赖上一步正确完成。漏掉
chown或忘了删旧
pid文件,都会让服务卡在“启动中”。
