===
可选方案
将A 套MySql Innodb Cluster数据迁移到B 套MySql Innodb Cluster,可选方案如下,三种方案都可以将割接操作步骤压缩为断开A->B主从同步关系,尽量将数据迁移同步等复杂操作放到准备工作中。
-
使用mysqldump mydumper 进行数据迁移入 B 套,然后使用–replicate-do-db 功能(指定主从同步只同步某些数据库)建立A -> B的主从同步,在割接期间只需断开A->B主从同步关系。
-
使用物理备份软件Xtrabackup Mysql backup进行数据迁移,然后使用–replicate-do-db 功能建立A->B的主从同步,再恢复B套MGR(步骤同恢复B套MGR集群),重新配置B 套INNODB CLUSTER(步骤同恢复B套MGR集群 ),在割接期间只需断开A->B主从同步关系。
-
使用MYSQL 克隆功能进行数据迁移,然后建立A->B的主从同步,然后使用–replicate-do-db 功能建立A->B的主从同步,再恢复B套MGR(步骤同恢复B套MGR集群),重新配置B 套INNODB CLUSTER(步骤同恢复B套MGR集群 ),在割接期间只需断开A->B主从同步关系。
本文档演示方案3的操作。
演示环境
B套集群已经部署为MySql Innodb Cluster,初始业务数据为空。
IP 主机名 角色 数据目录 端口 版本
源端A 10.9.50.112 mycl112 PRIMARY /mysql/ 3306 Mysql 8.0.19
源端A 10.9.50.113 mycl113 SECONDARY /mysql/ 3306 Mysql 8.0.19
源端A 10.9.50.114 mycl114 SECONDARY /mysql/ 3306 Mysql 8.0.19
目标B 10.9.50.107 mycl107 PRIMARY /mysql/ 3306 Mysql 8.0.19
目标B 10.9.50.108 mycl108 SECONDARY /mysql/ 3306 Mysql 8.0.19
注释:源端:A 套集群 目标:B套集群
克隆前置条件
Doner 和 recipient 可理解为源(数据提供者)和目标(数据接收者)。
-
donor和recipient必须版本相同
-
clone插件要求8.0.17及以上版本
-
在donor和recipient都需要安装clone插件
-
克隆用户需要BACKUP_ADMIN权限来访问和传输数据
-
克隆期间group replication必须停止
-
donor和recipient必须运行在相同的操作系统平台上
-
donor和recipient必须有相同的字符集和校验规则
-
donor和recipient必须有相同的 innodb_page_size 和 innodb_data_file_path 参数配置
-
recipient 上必须有足够的磁盘空间存储克隆数据
克隆限制
-
源端在克隆操作期间,DDL包含truncate table不允许执行,DML可以执行。
-
克隆操作不能并发执行,同一时间只能克隆一个节点。
-
克隆操作不支持对MySQL配置信息进行克隆,包括my.cnf中的配置信息。
-
克隆操作不支持对binlog日志进行克隆。
-
克隆操作针对InnoDB引擎的表进行克隆,非InnoDB表,比如MyISAM,CSV等,只克隆出空表。
-
不支持通过MySQL Router连接到donor节点执行克隆操作。
-
克隆完成后,recipient实例自动重启
-
本地克隆不支持创建在绝对路径的通用表空间,可能导致表空间命名冲突。
克隆A套数据
停止B套 group_replication
以下操作在B套每个节点操作,原则上先停SECONDARY,后停PRIAMRY节点。
先确认B套集群状态:
{width=“5.764583333333333in” height=“0.49027777777777776in”}
mycl108
mysql> stop group_replication;
mycl107
mysql> stop group_replication;
开始克隆
节点mycl107操作
将A 套PRIAMRY节点(10.9.50.112)作为数据提供者:
mysql> SET GLOBAL clone_valid_donor_list = "10.9.50.112:3306";
mysql> set global super_read_only=0;
mysql> CLONE INSTANCE FROM root@'10.9.50.112':3306 IDENTIFIED BY 'Root15()';
Query OK, 0 rows affected (3.11 sec) -- 显示克隆完成
注意:演示使用root用户做为克隆用户,可提前在A套创建专用的克隆用户,示例如下:
CREATE USER ‘donor_clone_user’@’%’ IDENTIFIED BY ‘password’;
GRANT BACKUP_ADMIN on . to ‘donor_clone_user’@’%’;
克隆监控
使用以下语句进行监控和确认克隆是否完成,在数据接收数据库执行:
select STAGE, STATE, CAST(BEGIN_TIME AS DATETIME) as "START TIME",
CAST(END_TIME AS DATETIME) as "FINISH TIME",
LPAD(sys.format_time(POWER(10,12) * (UNIX_TIMESTAMP(END_TIME) - UNIX_TIMESTAMP(BEGIN_TIME))), 10, ' ')
as DURATION
from performance_schema.clone_progress;
{width=“5.7659722222222225in” height=“1.225in”}
注意事项
B套克隆完数据后,mycl107 的数据和用户及密码都与A 套完全一致,后面操作B套都需使用A套用户密码,或是可以在此步骤就更改B套 root密码。
配置A->B主从
创建到A 套的复制通道
change master to master_user=‘root’, master_password=‘Root15()’, master_host=‘10.9.50.112’, master_auto_position=1, master_port=6446 for channel ‘ms_ch’;
设置过滤复制
只复制A 的test1 database变更到B
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (test1) for channel ‘ms_ch’;
启动复制
mysql> START SLAVE;
确认复制状态
mysql> show slave status G;
显示复制的database是 test1,且同步状态正常。
Replicate_Do_DB: test1
恢复B套MGR集群
因为在克隆A套数据之前,B套MGR组复制已经全部停止,且MGR集群内其他节点已经与mycl107节点数据不同,现在同样使用克隆方式恢复B套MGR。
从MYSQL 8.0.17 版本开始,MGR内数据同步,可以使用一定手段自动调起克隆组件来自动同步主节点的数据。
开启mycl107组复制
操作节点:mycl107
mysql> set global group_replication_bootstrap_group=on;
mysql> start group_replication;
mysql> set global group_replication_bootstrap_group=off;
清理INNODB CLUSTER元数据
操作节点:mycl107
此时B套数据库内包含的是A套 INNODB CLUSTER的元数据,需要先清理。
select * from performance_schema.replication_group_members;
清除A
mysql> drop database mysql_innodb_cluster_metadata;
Query OK, 15 rows affected (0.07 sec)
MGR内克隆同步数据
- 操作节点mycl108
mysql> reset master;
Query OK, 0 rows affected (0.00 sec)
mysql> change master to master_user=‘root’, master_password=‘Root15()’ for channel ‘group_replication_recovery’;
mysql> start group_replication;
克隆监控
同样可以使用以下语句进行监控和确认克隆是否完成,在数据接收数据库执行:
select STAGE, STATE, CAST(BEGIN_TIME AS DATETIME) as “START TIME”,
CAST(END_TIME AS DATETIME) as “FINISH TIME”,
LPAD(sys.format_time(POWER(10,12) * (UNIX_TIMESTAMP(END_TIME) - UNIX_TIMESTAMP(BEGIN_TIME))), 10, ’ ')
as DURATION
from performance_schema.clone_progress;
MGR状态确认
mycl108操作完成后,使用以下语句确认MGR集群状态:
select * from performance_schema.replication_group_members;
本次演示 B 套MGR 只有两个节点,如果有三个节点,请在B套第三节点按照mycl108的操作MGR内克隆同步数据。
MGR & MGR 主从架构多源FAILOVER复制请参考:
文档:mgr – mgr slave.note
演示链接:http://note.youdao.com/noteshare?id=0d2b5a1628ede545e86e4762e7f4655f&sub=5A5FAD1EC7804AFE9982F347E2F0F0F3
恢复B套INNODB CLUSTER配置
目前B套数据库里存储的是A套INNODB CLUSTER的元数据,需要进行以下操作重配置B套INNODB CLUSTER。
INNODB CLUSTER接管MGR
MGR集群接管: 如果在已经配置好的组复制上创建InnoDB Cluster,并且希望使用它来创建集群,可将adoptFromGR选项传递给dba.createCluster()函数。创建的InnoDB Cluster会匹配复制组是以单主数据库还是多主数据库运行。要采用现有的组复制组,使用MySQL Shell连接到组成员。
- 使用mysqlsh登录mycl107
mysqlsh --uri root@mycl107:3306
- INNODB CLUSTER接管MGR
MySQL mycl107:3306 SQL > js
MySQL mycl107:3306 JS > var cluster = dba.createCluster(‘my_cluster’, {adoptFromGR: true});
MySQL mycl107:3306 JS > cluster.status();
{width=“4.627083333333333in” height=“3.736111111111111in”}
此时INNODB CLUSTER已经重新配置好。
重新配置MYSQLROUTER
B套集群每个节点都操作。
-
mysqlrouter --bootstrap root@mycl107:3306 --user mysqlrouter --force
-
检查mysqlrouter配置文件,将自定义参数加入配置文件
-
重启mysqlrouter
$ /etc/init.d/mysqlrouter restart
or
$ systemctl start mysqlrouter
or
$ mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf
- 连接验证
mysql -uroot -P6446 -h10.9.50.107 -p
至此B套已经是与A套数据实时同步的单独INNODB CLUSTER。
B 套设置为只读
为避免同步过程中,有其他用户更改B套 MGR中的数据。
操作PRIAMRY节点:mycl107
mysql> set global super_read_only=on;
mysql> set global read_only=on;
割接窗口操作
本章节主要是在割接阶段执行,割接前先将连接A 套所有应用停止,确认A 套不再有数据写入,再确认B套数据已经完全同步完成。
确认A 套连接
登录A 套PRIAMRY 节点
mysql> show processlist;
确认B 套数据同步完成
- DB层确认同步应用情况
登录mycl107
mysql> show slave status G
- 开发确认数据完整性
解除A->B 主从关系
登录mycl107
mysql -uroot -p
mysql> stop slave; --停止复制
mysql> RESET SLAVE ALL FOR CHANNEL ‘ms_ch’; --清除复制通道配置
mysql> set global super_read_only=off; --开启可读可写
mysql> set global read_only=off; --开启可读可写




