mysql从单机迁移到集群如何操作_mysql集群迁移指南

来源:这里教程网 时间:2026-02-28 20:51:17 作者:

确认当前 MySQL 单机版本与集群组件兼容性

迁移前必须核对

mysqld --version
输出的版本号,尤其是小版本(如 8.0.33 vs 8.0.37),部分 MySQL Group Replication 或 InnoDB Cluster 要求最低版本为 8.0.19,而 Percona XtraDB Cluster 对 5.7 支持已逐步终止。若单机是 5.6 或更早,不能直连 MGR 或 PXC,需先升级到 5.7.25+ 或 8.0.19+ 并完成
mysql_upgrade

运行
SELECT VERSION();
SHOW VARIABLES LIKE 'log_bin';
,确保 binlog 已启用且格式为
ROW
检查是否使用 MyISAM 表:MGR 不支持,需提前转为 InnoDB:
ALTER TABLE t ENGINE=InnoDB;
禁用
super_read_only=ON
read_only=ON
等限制,否则后续加入集群时节点无法写入

导出数据时避开 GTID 冲突和自增主键重复

直接

mysqldump
全库导出会把原实例的
gtid_purged
写入 dump 文件,若目标集群已有 GTID 集合,恢复时会报错
GTID_PURGED can only be set when GTID_EXECUTED is empty
。必须显式跳过 GTID 相关语句。

导出命令加
--set-gtid-purged=OFF
,例如:
mysqldump -u root -p --all-databases --set-gtid-purged=OFF > full_backup.sql
若表含
AUTO_INCREMENT
,且集群多写节点可能并发插入,建议在导入后执行
ALTER TABLE t AUTO_INCREMENT = <em>N</em>;
手动设偏移(N 取原库最大 ID + 1000)
避免用
--single-transaction
导出大表:某些集群复制延迟下,可能导致从节点读到不一致快照;改用
--lock-all-tables
(停写窗口可控时)

在集群中初始化第一个节点并加载数据

以 MySQL InnoDB Cluster(基于 Group Replication)为例,不能把单机 mysqld 直接“升级”为集群节点,必须重装实例并清空 datadir。新节点启动后,再导入数据,最后才加入集群。

停止原单机 MySQL,备份
/var/lib/mysql
后清空该目录
用相同版本 MySQL 初始化:
mysqld --initialize-insecure --datadir=/var/lib/mysql
,然后启动干净实例
导入前执行
SET SQL_LOG_BIN = 0;
,再 source dump 文件,防止导入过程产生 binlog 干扰集群同步
导入完成后执行
RESET MASTER;
清空本地 binlog,并设置
SET GLOBAL gtid_purged = 'xxx';
(值来自 dump 文件头或原库
SELECT @@GLOBAL.GTID_EXECUTED;

添加其余节点时注意复制账户和网络权限

集群节点间靠异步/半同步复制通信,但新节点加入时需能连接种子节点的 MySQL 端口(默认 3306),且账号必须有

REPLICATION SLAVE
权限。常见错误是防火墙放行了应用端口却漏掉复制端口,或账号未授权
host='%' 
导致连接被拒。

在种子节点创建复制用户:
CREATE USER 'repl'@'%' IDENTIFIED BY 'pwd'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
确认所有节点
bind_address
不是
127.0.0.1
,应设为
0.0.0.0
或具体内网 IP
加入集群命令(MySQL Shell):
cluster.addInstance('repl@node2:3306');
,若卡住超时,优先查
telnet node2 3306
是否通,而非怀疑配置项

真正麻烦的是跨机房或云厂商 VPC 的 MTU 不一致,会导致 Group Replication 心跳包被截断,现象是节点反复 offline,日志里出现

Connection lost during packet read
—— 这类问题不会在文档里强调,但实际迁移中高频发生。

相关推荐