MySQL 数据目录迁移

因为 MySQL 数据量越来越大,导致原磁盘空间被撑满,只能将数据目录迁移到新的硬盘。这里记录一下整个过程。

1,新硬盘挂载(如果有的话)

如果你本身已有大盘,只是想把 MySQL 的 data 目录换到新的路径,那这一步可以跳过。

我这里是新增了一块硬盘,因此需要先做好分区 + 格式化 + 挂载工作,并最终让新硬盘挂载到:

如果你需要了解硬盘分区/挂载流程,可以参考这篇文章:服务器硬盘进行分区和挂载_服务器硬盘分区-CSDN博客https://blog.csdn.net/weixin_46739493/article/details/150553288?ops_request_misc=%257B%2522request%255Fid%2522%253A%25227c5594fcecda4b493174ec02ba3363dc%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=7c5594fcecda4b493174ec02ba3363dc&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-150553288-null-null.nonecase&utm_term=%E7%A1%AC%E7%9B%98&spm=1018.2226.3001.4450

2,创建新的 MySQL 数据目录

复制代码
sudo mkdir -p /data/mysql
sudo chown -R mysql:mysql /data/mysql

要确保目录权限属于 mysql 用户,否则服务无法启动。

3,迁移 MySQL 数据(推荐两遍 rsync 方案,停机时间最小)

理论上 完全不停机、保证数据完整 是非常困难的。我的方案都是需要短暂停机的,如果无法接受,只能想别的办法了。

3.1 不停机预同步

这一步不会影响线上 MySQL,可提前把大量数据同步过去,减少停机压力:

复制代码
sudo rsync -av --progress /opt/mysql-8.0.43/data/ /data/mysql/

大家改好自己相应的路径就可以了。

  • /opt/mysql-8.0.43/data/ 旧的MySQL的data目录,
  • /data/mysql/ 是新的。

注意两个路径末尾的 / ,避免目录套目录问题。

3.2 停机

复制代码
sudo systemctl stop mysql
ps -ef | grep mysql

确认所有 MySQL 进程已退出。

3.3 停机后增量同步

rsync 默认行为就是跳过目标中已存在且未变化的文件。保证数据一致性:

复制代码
sudo rsync -av --delete --progress /opt/mysql-8.0.43/data/ /data/mysql/

具体说明: rsync -av /source/ /dest/

  • -a:归档模式,会保留权限、时间戳、软硬链接等

  • -v:显示详细信息

  • 判断是否需要复制 :rsync 会对比 文件大小修改时间,如果目标文件和源文件一样,就不会再复制。

  • 所以你第一次"干跑"后,第二次停机增量同步,只会复制那段时间内新增或修改的文件,速度非常快。

如果想更严格确保文件内容完全一致,可以加 -c(checksum)参数,但会慢很多,因为会计算每个文件的校验和。

3.4 如果停机不影响业务

上面都执行了这步就不用执行了:

比如是测试库、开发库,那就可以一步到位:

复制代码
sudo systemctl stop mysql
sudo rsync -av --progress /opt/mysql-8.0.43/data/ /data/mysql/

4,修改 MySQL 配置文件 my.cnf

找到:

datadir = /opt/mysql-8.0.43/data

把它改成:

datadir = /data/mysql

同理,如果你想调整 MySQL 临时文件目录(可选),也可以:

tmpdir = /data/mysql_tmp

5,重启并验证

复制代码
sudo systemctl start mysql
systemctl status mysql

验证是否生效:

复制代码
mysql -e "show variables like 'datadir';"
mysql -e "show variables like 'tmpdir';"

输出正确路径即可。

至此,MySQL 已经使用新的数据磁盘运行。

如果运行稳定一段时间(建议至少一天),就可以考虑删除旧的数据目录,释放原磁盘空间。

相关推荐
Bert.Cai12 分钟前
Linux tail命令详解
linux·运维
舒一笑28 分钟前
AI 系统落地难的,从来不只是模型:一次企业级部署实施复盘
运维·后端·程序员
sbjdhjd38 分钟前
Docker | 核心概念科普 + 保姆级部署
linux·运维·服务器·docker·云原生·面试·eureka
Agent产品评测局41 分钟前
企业生产报工自动化落地,数据采集全流程实现方案 —— 2026制造业数字化转型深度选型指南
运维·人工智能·ai·chatgpt·自动化
以太浮标41 分钟前
华为eNSP模拟器综合实验之- DHCP、DNS、HTTP和FTP服务器配置案例Client-Server
linux·服务器·windows·http·华为·信息与通信
志栋智能43 分钟前
安全超自动化如何缩短平均检测与响应时间?
运维·安全·自动化
Project_Observer1 小时前
为您的项目选择最合适的Zoho Projects自动化巧能
大数据·运维·人工智能·深度学习·机器学习·自动化·编辑器
西柚小萌新1 小时前
【人工智能:Agent】--OpenClaw设计架构解析
运维·服务器·架构
一只大袋鼠1 小时前
MySQL 事务从入门到精通(上):概念、操作、特性、隔离级别全解析
java·mysql·事务