登录mysql执行select @@datadir;可获真实datadir路径,比查配置文件更可靠;若返回旧路径,说明配置未被加载,需用mysqld --verbose --help | grep "default options"确认实际读取的配置文件及顺序。

直接改 datadir 配置不生效,90% 是因为 MySQL 实际加载的不是你改的那个配置文件,或者路径权限/SELinux 上下文没对齐。
怎么确认 MySQL 当前真正用的 datadir?
登录 MySQL 后执行:SELECT @@datadir; —— 这个值才是运行时真实路径,比看 my.cnf 或 my.ini 更可靠。
如果返回空或报错,说明 MySQL 根本没起来;如果返回旧路径,说明你的配置修改没被读到。
- 用
mysqld --verbose --help | grep "Default options"查 MySQL 启动时实际扫描哪些配置文件(顺序决定覆盖关系) - 常见路径包括:
/etc/my.cnf、/etc/mysql/my.cnf、/usr/etc/my.cnf、~/.my.cnf,Windows 下多是C:ProgramDataMySQLMySQL Server X.Xmy.ini - 检查
[mysqld]段落是否写对了——写成[client]或漏掉段落名,datadir就完全无效
rsync 迁移数据目录时为什么不能用 cp -r?
cp -r 会丢 socket 文件权限、SELinux 上下文、扩展属性,导致重启后报 Permission denied 或 Can't open file。
正确做法是用 rsync -avh --progress /var/lib/mysql/ /new/path/mysql/(注意源路径末尾有 /,否则目标里会多嵌套一层 mysql 目录)。
- 迁移前必须停服务:
systemctl stop mysqld(Linux)或net stop MySQL80(Windows) - 迁移后要修复 SELinux 上下文:
semanage fcontext -a -t mysqld_db_t "/new/path/mysql(/.*)?"+restorecon -Rv /new/path/mysql - 父目录权限必须允许
mysql用户进入:/new/path至少要有755,且属主能执行cd
改完 datadir 后启动失败,常见报错怎么对应处理?
错误日志永远是最先要看的:tail -n 50 /var/log/mysqld.log(Linux)或查 log-error 配置指向的文件(Windows 多在 C:ProgramDataMySQLMySQL Server X.XData*.err)。
-
Can't start server: Bind on unix socket: Permission denied→socket路径没同步更新,要在[mysqld]段加socket=/new/path/mysql/mysql.sock -
Table 'mysql.plugin' doesn't exist→ 数据没完整拷过去,或新目录权限不对(chown -R mysql:mysql /new/path/mysql必做) -
Can't connect to local MySQL server through socket→ 客户端还在找旧.sock,需在[client]和[mysql]段也配一遍socket= - 服务启动成功但连不上 → 检查
ss -l | grep mysql看新.sock是否生成,以及属主是不是mysql
Windows 下修改 my.ini 容易忽略的细节
路径写法必须用正斜杠或双反斜杠:datadir="D:/mysql/data" 或 datadir="D:\mysql\data",单反斜杠会出错。
别只改 datadir,log-error、pid-file、socket 如果还指向 C 盘旧路径,服务大概率起不来。
- my.ini 修改后务必用管理员权限保存(记事本右键“以管理员身份运行”再打开)
- 服务名不一定是
MySQL,可能是MySQL80、mysqld等,查services.msc确认准确名称 - 验证时别只看 Workbench 或 Navicat 的连接状态,一定要再执行一次
SHOW VARIABLES LIKE 'datadir';
最常被跳过的动作:改完配置后没验证 mysqld --validate-config(MySQL 5.7.20+ 支持),也没用 mysqld --defaults-file=/etc/my.cnf --verbose --help | grep datadir 确认参数是否真被读取。这些步骤省了,后面排查就全靠猜。











