因为 mysql 数据量越来越大,导致原磁盘空间被撑满,只能将数据目录迁移到新的硬盘。这里记录一下整个过程。
1,新硬盘挂载(如果有的话)
如果你本身已有大盘,只是想把 mysql 的 data 目录换到新的路径,那这一步可以跳过。
我这里是新增了一块硬盘,因此需要先做好分区 + 格式化 + 挂载工作,并最终让新硬盘挂载到:

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 已经使用新的数据磁盘运行。
如果运行稳定一段时间(建议至少一天),就可以考虑删除旧的数据目录,释放原磁盘空间。
到此这篇关于mysql数据目录迁移的完整过程的文章就介绍到这了,更多相关mysql数据目录迁移内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论