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

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

相关推荐
聆风吟º4 小时前
CANN开源项目深度实践:基于amct-toolkit实现自动化模型量化与精度保障策略
运维·开源·自动化·cann
剩下了什么6 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
较劲男子汉7 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
java搬砖工-苤-初心不变7 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
wypywyp7 小时前
8. ubuntu 虚拟机 linux 服务器 TCP/IP 概念辨析
linux·服务器·ubuntu
风流倜傥唐伯虎7 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
Doro再努力7 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
senijusene8 小时前
Linux软件编程:IO编程,标准IO(1)
linux·运维·服务器
不像程序员的程序媛8 小时前
Nginx日志切分
服务器·前端·nginx
忧郁的橙子.8 小时前
02-本地部署Ollama、Python
linux·运维·服务器