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 已经使用新的数据磁盘运行。

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

相关推荐
数智工坊11 小时前
Zotero自建Ubuntu WebDAV附件同步方案(完美解决存储空间不足)
linux·运维·ubuntu
江畔柳前堤12 小时前
HBM:大语言模型时代的「算力血液」——从内存墙到带宽革命的深度拆解
服务器·人工智能·windows·目标检测·语言模型·自然语言处理·软件工程
独隅12 小时前
GitHub Actions 自动化运维实战:CI/CD 流水线一体化效果展示
运维·自动化·github
饺子大魔王的男人13 小时前
CentOS部署Cockpit:图形化查看系统、日志与服务状态
linux·运维·centos
不会就选b13 小时前
Linux之信号(二)
linux·运维·服务器
GlueNa2SiO314 小时前
第十八章 Linux故障排查与恢复
linux·服务器·笔记·学习
qq_2676128914 小时前
Gitee项目管理推荐:从工具链割裂到DevOps全链路贯通的企业级协作实践
运维·gitee·devops
灯澜忆梦14 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
寺中人15 小时前
Linux 基础命令入门实战教程:从零掌握常用操作,新手快速上手
linux·运维·服务器·shell·linux 命令·linux 基础教程·linux 入门
V哥AI增长15 小时前
Schema.org 结构化数据与GEO技术落地:AI引擎引用机制与JSON-LD部署实证研究
大数据·运维·人工智能