MySQL集群数据目录满了,如何迁移

艺帆风顺 发布于 2025-04-07 15 次阅读


今天分享一下MySQL主从复制集群如何迁移数据目录。

操作目标

将主库和从库的数据目录 从 ➡️ /data/mysql/data/迁移到 ➡️ /dataroot/mysql/data/

接下来是迁移的详细步骤


1 迁移前准备

1.1 备份数据库数据

在进行数据目录迁移之前,一定要做好完整备份主库和从库都需要备份。可以通过物理备份或逻辑备份两种方式

备份方法 1:物理备份

使用 rsync 或 cp 直接备份当前 data 目录

# 停止 MySQL 服务(避免写入导致数据不一致)systemctl stop mysqld# 备份当前数据目录cp -a /data/mysq/data /data/mysql/data_bak_$(date +%F)# 或使用 rsyncrsync -avh /data/mysql/data/ /data/mysql/data_bak_$(date +%F)/

备份方法 2:逻辑备份(按需)

mysqldump -uroot -p --all-databases --master-data=2 --single-transaction --flush-logs - --triggers --routines > /backup/mysql_full_$(date +%F).sql

2 确认主从复制状态

在主库:

SHOW MASTER STATUS;

在从库:

SHOW SLAVE STATUSG;

确保从库:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
  • 没有 Seconds_Behind_Master 很大

⚠️ 建议暂停应用写操作后,再确认一次状态!


3  停止数据库服务

🚫 一定要先停从库,再停主库

# 从库systemctl stop mysqld# 主库systemctl stop mysqld

4  迁移数据目录

4.1 创建新目录

mkdir -p /dataroot/mysql/data

4.2 复制旧目录到新目录(保留权限/软链接等信息)

rsync -avhP /data/mysql/data/ /dataroot/mysql/data/

4.3 确认目录完整性

确保新目录数据完整、权限无误

ls -l /dataroot/mysql/data

5 修改配置文件

修改数据目录路径

主从库都要改

配置文件通常位置:/etc/my.cnf 或 /etc/mysql/my.cnf;有些是自定义的

我的配置文件是/data/mysql/my.cnf

[mysqld]datadir=/dataroot/mysql/data# socket 文件路径(如有需要),我的socket不放在之前的数据目录下,我不修改# socket=/dataroot/mysql/data/mysql.sock   

6 权限设置

6.1 修改目录权限

确保 mysql 用户拥有新目录权限

chown -R mysql:mysql /dataroot/mysql/datachmod 750 /dataroot/mysql/data

7 检查 systemd 配置(如有)

7.1 检查 mysqld.service 文件

vim /usr/lib/systemd/system/mysqld.service

如果里面有 datadir,要和 my.cnf 保持一致。

7.2 重载 systemd

systemctl daemon-reexec

8 启动数据库服务

8.1 启动主库

systemctl start mysqld

检查日志:

tail -f /var/log/mysqld.log

8.2 启动从库

systemctl start mysqld

9 验证新数据目录是否生效

登录 MySQL,检查当前 datadir

mysql -uroot -p -e "SHOW VARIABLES LIKE 'datadir';"

输出应该是:/dataroot/mysql/data/


10 验证主从同步状态

在从库执行:

mysql -uroot -p -e  "SHOW SLAVE STATUSG;"

✅ 关键状态

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
  • Seconds_Behind_Master: 0(或很小)

11 验证应用访问与功能

  1. 确认业务可以正常访问 MySQL

  2. 检查主从复制 10-30 分钟稳定同步

  3. 观察 mysqld.log,确保无报错

本次分享结束!

关注小编,添加微信,可进入技术交流群。


往期推荐