MySQL 数据目录修改需先查 SELECT @@datadir 确认当前路径,停服务后 rsync 迁移并修正属主,再更新配置文件中 datadir 和 socket 路径,最后处理 SELinux 或 AppArmor 权限。

确认当前 MySQL 数据目录位置
修改前必须先知道 MySQL 正在用哪个路径存数据,否则容易导致服务无法启动。直接连上 MySQL 执行:
SELECT @@datadir;返回结果类似
/var/lib/mysql,这就是当前实际使用的数据目录。也可以查配置文件里有没有显式指定:mysqld --verbose --help | grep "datadir"注意这个命令输出的是编译默认值或配置文件中读到的值,不一定是运行时生效值,以
SELECT @@datadir 为准。
停止 MySQL 服务并迁移数据文件
不能在 MySQL 运行时直接改路径,否则会损坏数据。先停服务:
sudo systemctl stop mysql(Ubuntu/Debian)或
sudo systemctl stop mysqld(CentOS/RHEL)。然后用
rsync 安全复制(保留权限和符号链接):sudo rsync -avh /var/lib/mysql/ /new/path/mysql/别漏掉末尾斜杠,否则会把整个
mysql 目录嵌套进去。复制完检查目标目录属主是否为 mysql:mysql:sudo chown -R mysql:mysql /new/path/mysql
修改配置文件中的 datadir 和 socket 路径
编辑 MySQL 主配置文件,通常是 /etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu)或 /etc/my.cnf(CentOS),在 [mysqld] 段下修改:
[mysqld] datadir = /new/path/mysql socket = /new/path/mysql/mysql.sock如果系统里有其他组件(比如 PHP 的
mysqli.default_socket 或 Python 的 mysql-connector)硬编码了 socket 路径,也要同步更新。另外,pid-file 和 log-error 如果也放在旧 datadir 下,建议一并移到新路径并更新配置。
SELinux 或 AppArmor 权限问题常被忽略
Linux 发行版启用安全模块后,即使路径、权限都对了,MySQL 也可能因策略限制无法访问新目录。Ubuntu/Debian 上检查 AppArmor:
sudo aa-status | grep mysql若启用,需更新配置文件(如
/etc/apparmor.d/usr.sbin.mysqld),添加类似两行:/new/path/mysql/ r, /new/path/mysql/** rwk,然后重载:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqldCentOS/RHEL 上检查 SELinux 状态:
sestatus若为
enforcing,需打标签:sudo semanage fcontext -a -t mysqld_db_t "/new/path/mysql(/.*)?"再执行:
sudo restorecon -Rv /new/path/mysql
MySQL 启动失败时最常卡在权限或 SELinux/AppArmor,而不是配置写错。务必先看错误日志:sudo tail -n 50 /var/log/mysql/error.log 或 sudo journalctl -u mysql -n 50,里面通常明确提示“Permission denied”还是“No such file”。










