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

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

相关推荐
zhou周大哥12 小时前
银河麒麟安装mysql
数据库·mysql
KKKlucifer12 小时前
全域安全运维服务能力建设关键技术解析
运维·安全
Joseph Cooper13 小时前
Linux regmap 子系统实战:在驱动中 dump PMIC 寄存器定位供电问题
linux·运维·服务器
计算机安禾13 小时前
【Linux从入门到精通】第35篇:容器化技术预备——Docker安装与基本概念
linux·运维·docker
子木HAPPY阳VIP13 小时前
信创UOS,Docker 完整操作部署(Dockerfile部署方式)&排错整合
linux·运维·redis·nginx·docker·容器·tomcat
AOwhisky13 小时前
Kubernetes调度与服务暴露:从“定时任务”到“服务发现”的完全指南
linux·运维·云原生·容器·kubernetes·服务发现
勤劳的进取家13 小时前
应用层基础
运维·网络·学习
Sherry Wangs13 小时前
MySQL 与向量数据库的核心区别:从结构化数据到语义搜索
数据库·mysql
hahaha 1hhh13 小时前
中文乱码 ubuntu autodl
linux·运维·前端
@小柯555m13 小时前
MySql(高级操作符--高级操作符练习(2))
数据库·sql·mysql