MySQL 数据目录迁移到数据盘
发布时间:2026-05-22 17:26       
更新时间:2026-05-23 06:13
系统盘用量报警,占空间的大户经常是 /var/lib/mysql。把数据目录整体迁到独立数据盘,四步完成:停服、复制、改配置、验证。整个过程业务要停写,选低峰期做。
## 一、停服并确认干净
应用侧先停写入或挂维护页,别只停定时任务就当万事大吉。然后停库,定时任务一并注释掉,避免迁移途中 cron 把服务拉起来。停库命令:
```
systemctl stop mysqld
ps -ef | grep mysqld
```
确认没有残留进程再动手,带着进程复制数据目录,复制出来的数据可能不一致。
## 二、复制目录并修正属主
新盘先完成格式化和挂载,写进 /etc/fstab 固定挂载点,重启后路径不丢;容量按现有数据量的两倍起步预留,数据库只会越长越大。之后:
```
rsync -av /var/lib/mysql/ /data/mysql/
chown -R mysql:mysql /data/mysql
```
rsync 会保留权限和属主,比 cp 稳;源路径结尾的斜杠表示拷贝目录内容而不是目录本身,别写错。属主不对是迁移后起不来的头号原因,chown 一定不要省。开启 SELinux(Linux 的强制访问控制机制)的机器还要执行 restorecon -Rv /data/mysql,否则照样拒绝访问。
## 三、改配置并启动
```
[mysqld]
datadir = /data/mysql
socket = /data/mysql/mysql.sock
```
socket 路径变了的话,[client] 段里同步指过去,不然客户端还去老位置找;配置文件里 [mysqld_safe] 段也可能引用路径,一并检查。然后 systemctl start mysqld。
## 四、验证与收尾
三件事确认:mysql -uroot -p 能正常进入;SHOW VARIABLES LIKE 'datadir' 指向新路径;用业务账号连上跑几个核心查询。迁移后顺手检查备份脚本里的路径引用,配置还指向老目录的情况不少见。都正常后,旧目录改名保留几天:
```
mv /var/lib/mysql /var/lib/mysql.bak
```
别急着删。万一要回滚,把配置改回去、目录改回来、重启,十分钟内结束战斗。
启动失败时先看 error.log:Permission denied 查属主和 SELinux,找不到 sock 查 socket 配置,日志里写得很明白。
数据大的库 rsync 也要几分钟,这段窗口业务是停的。正式迁移前拿测试库把四步完整演练一遍,到点上就心里有底。数据盘选型看写入性能,数据库对磁盘延迟敏感,盘的档次差距会直接写进查询耗时里。