能不动配置就别动,优先用软链接;真要改路径,必须停服务、改datadir、调权限、验证日志,缺一不可。因为mysql启动时校验ibdata1、mysql系统库等结构,硬链接跨分区无效,重命名导致权限和路径不匹配而报错;软链接是官方支持的唯一不改配置切换物理位置的方式,且需确保停服、完整迁移、权限与selinux上下文正确、日志路径同步更新。

直接结论:能不动配置就别动,优先用软链接;真要改路径,必须停服务、改datadir、调权限、验证日志,缺一不可。
为什么不能直接改/var/lib/mysql目录名或硬链接?
MySQL启动时会校验datadir路径下的ibdata1、mysql系统库、server-uuid等文件结构。硬链接跨分区无效,重命名后mysqld找不到mysql库直接报错Can't open and lock privilege tables。软链接是唯一不改配置就能切换物理位置的方式,且MySQL官方文档明确支持。
datadir配置修改后启动失败的常见原因
改完/etc/my.cnf里的datadir却起不来,十有八九卡在这几个地方:
-
systemctl stop mysqld没真正停掉——检查ps aux | grep mysqld,残留进程必须kill -9干净 - 新目录
/data/mysql_data没递归赋权:chown -R mysql:mysql /data/mysql_data,只改顶层目录没用 - SELinux开着但没更新上下文:
semanage fcontext -a -t mysqld_db_t "/data/mysql_data(/.*)?",然后restorecon -Rv /data/mysql_data - MySQL 8.0初始化未重做:若新目录为空,必须运行
mysqld --initialize --user=mysql --datadir=/data/mysql_data生成root临时密码和系统表 - 日志路径没同步改:
log-error和pid-file也要在[mysqld]段里显式指定,否则写不到新位置,journalctl -u mysqld看不到错误
软链接方案:不改配置、不停业务(仅限迁移前无写入)
适用于临时扩容或快速切换存储位置,前提是MySQL已停止且原数据完整:
先确认当前路径:mysql -e "select @@datadir;" 输出/var/lib/mysql;
再执行:
systemctl stop mysqld mv /var/lib/mysql /var/lib/mysql.old mkdir -p /data/mysql_data chown mysql:mysql /data/mysql_data cp -a /var/lib/mysql.old/* /data/mysql_data/ ln -s /data/mysql_data /var/lib/mysql systemctl start mysqld
注意:cp -a保留权限和时间戳,ln -s必须是相对路径或绝对路径,不能漏-s参数;启动后立刻mysql -e "show databases;"验证数据可见性。
tmpdir单独调整能缓解/tmp满的问题
大批量DELETE或ORDER BY导致/tmp爆满,不是数据目录问题,而是临时文件路径冲突:
在/etc/my.cnf的[mysqld]段加一行:tmpdir = /data/mysql_tmp;
然后:
- 创建目录:
mkdir -p /data/mysql_tmp && chown mysql:mysql /data/mysql_tmp && chmod 700 /data/mysql_tmp - 重启服务:
systemctl restart mysqld - 进MySQL验证:
SHOW VARIABLES LIKE 'tmpdir';应返回/data/mysql_tmp
这个操作不影响主数据目录,但能避免因/tmp空间不足导致的查询失败——很多运维卡在“磁盘满”却查df -h发现/没满,其实是/tmp独立挂载且只有1G。
最后提醒:MySQL 8.0 的datadir迁移必须用mysqld --initialize重建系统库,5.7及以前可直接拷贝;无论哪种方式,/var/log/mysqld.log永远是你第一个该看的地方。











