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

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

相关推荐
Bruce_Liuxiaowei6 小时前
Nmap+Fofa 一体化信息搜集工具打造
运维·开发语言·网络·网络安全
Xの哲學6 小时前
Linux SLAB分配器深度解剖
linux·服务器·网络·算法·边缘计算
iconball7 小时前
个人用云计算学习笔记 --24 虚拟化、KVM 基础使用与热迁移实验、VMware ESXi笔记
运维·笔记·学习·云计算
齐鲁大虾7 小时前
UOS(统信操作系统)如何更新CUPS(通用Unix打印系统)
linux·服务器·chrome·unix
冰冰菜的扣jio8 小时前
MySQL三大重要日志详解
数据库·mysql
ICT技术最前线8 小时前
企业ICT传输系统资源管理:资源分配规范
运维·服务器·资源分配
元亓亓亓8 小时前
考研408--计算机网络--day12--网络应用模型&DNS&FTP
服务器·计算机网络·考研·408
哈里谢顿8 小时前
django操作mysql常见错误大全
mysql·django
虾..8 小时前
Linux 简单日志程序
linux·运维·算法
小李独爱秋8 小时前
计算机网络经典问题透视:在浏览器中应当有几个可选解释程序?
服务器·网络·网络协议·tcp/ip·计算机网络