SELECT @@datadir; 是最权威的MySQL数据目录路径查询方式,反映运行时真实路径;需结合配置加载顺序、SELinux标签、权限设置及启动参数覆盖等综合验证。

确认 MySQL 当前数据目录位置
别猜,直接查。MySQL 启动时读取的配置决定实际数据路径,my.cnf 里写的不一定生效,得看它最终加载的是哪个配置文件、哪些参数被覆盖了。
- 登录 MySQL 执行
SELECT @@datadir;—— 这是最权威的结果,反映运行时真实路径 - 检查配置加载顺序:
mysqld --help --verbose | grep "Default options",看/etc/my.cnf、/etc/mysql/my.cnf、~/.my.cnf等谁在前谁生效 - 注意:systemd 管理的 MySQL(如 Ubuntu 20.04+、CentOS 7+)可能在
/usr/lib/systemd/system/mysqld.service里用Environment=MYSQLD_OPTS=--datadir=/xxx强制覆盖配置文件设置
停机迁移前必须做的三件事
跳过任何一步都可能导致启动失败或数据损坏,尤其容易栽在 SELinux 和权限上。
- 确保 MySQL 已完全停止:
sudo systemctl stop mysqld(或mysql,取决于服务名),再用ps aux | grep mysql确认无残留进程 - 用
rsync -avh --progress /var/lib/mysql/ /new/path/mysql/迁移(注意末尾斜杠!漏掉会嵌套一层目录),别用cp -r,它不保留 socket 文件权限和部分扩展属性 - SELinux 必须重打标签:
sudo semanage fcontext -a -t mysqld_db_t "/new/path/mysql(/.*)?",然后sudo restorecon -Rv /new/path/mysql;否则即使权限全对,也会因上下文拒绝访问
修改 datadir 的两种可靠方式
改配置不是简单替换路径字符串,关键在于让 mysqld 启动时能“信得过”这个新位置。
- 推荐方式:只改
my.cnf中的datadir,同时确保socket、pid-file、log-error等路径仍指向原位置或同步更新——否则启动报错Can't start server: Bind on unix socket: Permission denied - 不推荐但可行:用 systemd 覆盖启动参数,在
/etc/systemd/system/mysqld.service.d/override.conf里写[Service]\nEnvironment=MYSQLD_OPTS="--datadir=/new/path/mysql",然后sudo systemctl daemon-reload;好处是配置文件干净,坏处是排查时容易漏看 - 绝对不要改
basedir或试图移动bin目录——这和数据路径无关,只会让 mysqld 找不到可执行文件
启动失败时最该查的三个地方
90% 的迁移失败不是路径写错,而是环境没对齐。
- 看错误日志:
sudo tail -n 50 /var/log/mysqld.log(或log-error配置指向的位置),重点搜Permission denied、Can't open file、Table 'mysql.plugin' doesn't exist - 检查新路径属主:
sudo chown -R mysql:mysql /new/path/mysql,不能只改目录,里面所有子目录和文件都要递归归属 - 验证
mysql用户能否进入父目录:sudo -u mysql ls /new/path;如果父目录权限是750且不在mysql组里,就会卡在“找不到目录”阶段,连日志都不写
迁移后第一次启动慢是正常的——InnoDB 要校验表空间、重建 buffer pool,等几分钟再连;如果超过 5 分钟没反应,基本就是权限或 SELinux 没到位。


















