admin管理员组

文章数量:1794759

mysql clone 插件使用

Clone 操作的标准流程如下:

  1. 清空 Recipient 节点的数据
  2. 复制 Donor 节点的数据文件
  3. 复制 Donor 节点的数据页
  4. 复制 Donor 节点的 redo log
  5. 同步 Donor 节点的数据文件
  6. 重启 Recipient 节点
  7. 在 Recipient 节点上完成 Crash recovery

使用 Clone 插件需要注意以下几点:

  1. Recipient 节点并不会 Clone Donor 节点的 MySQL 配置文件,因为 Recipient 节点一般会有不同的 IP 或者端口。但是涉及到一些存储相关的参数(例如 innodb_page_size)出现不一致的时候,Clone 插件会报错,这些参数可能会导致 Recipient 节点重启失败,因此要提前准备好 Recipient 节点的配置文件。
  2. Clone 插件复制的文件不包括 binlog,因为加入原有的 HA 结构并不需要 Donor 节点的 binlog。
  3. Clone 插件当前仅支持 InnoDB 引擎的表,MyISAM 和 CSV 等引擎的表在 Clone 之后是一个空表。Clone 插件最初设计的时候会支持 MySQL 的所有引擎,但是目前仅实现了 InnoDB 引擎的功能。
  4. Clone 操作会阻塞 Donor 节点上的所有 DDL 操作。
  5. Clone 操作会清空 Recipient 节点的所有数据和 binlog,因此要特别注意是否要在 Clone 操作执行之前备份 Recipient 节点的数据。
  6. Clone 操作最好是挂到后台执行(尽量避免网络问题)。

使用限制

  1. MySQL 版本不低于 8.0.17
  2. 到 8.0.17 版本为止,Clone 插件仅支持 InnoDB 引擎的表。
  3. Donor 节点在 Clone 的过程中,IO 读取的吞吐量和 CPU 使用率会有非常明显的上涨。

安装插件

代码语言:sql复制
-- 两个节点都要安装
INSTALL PLUGIN CLONE SONAME "mysql_clone.so"; 

创建用户

代码语言:sql复制
-- 两个节点都要创建
CREATE USER 'clone_user'@'%' IDENTIFIED BY 'Zzj@123456';
GRANT CLONE_ADMIN on *.* to 'clone_user'@'%';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'%';

执行clone

代码语言:sql复制
-- 在需要clone机器上执行
set global clone_valid_donor_list='192.168.30.139:3306';
CLONE INSTANCE FROM 'clone_user'@'192.168.30.139':3306 IDENTIFIED BY 'Zzj@123456';

查看clone状态

代码语言:sql复制
-- 在需要clone机器上执行
SELECT STATE, CAST(BEGIN_TIME AS DATETIME) as "START TIME",
CASE WHEN END_TIME IS NULL THEN
LPAD(sys.format_time(POWER(10,12) * (UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(BEGIN_TIME))), 10, ' ')
ELSE
LPAD(sys.format_time(POWER(10,12) * (UNIX_TIMESTAMP(END_TIME) - UNIX_TIMESTAMP(BEGIN_TIME))), 10, ' ')
END as DURATION
FROM performance_schema.clone_status;
代码语言:sql复制
SELECT STAGE, STATE, CAST(BEGIN_TIME AS TIME) as "START TIME",
   CASE WHEN END_TIME IS NULL THEN
   LPAD(sys.format_time(POWER(10,12) * (UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(BEGIN_TIME))), 10, ' ')
   ELSE
   LPAD(sys.format_time(POWER(10,12) * (UNIX_TIMESTAMP(END_TIME) - UNIX_TIMESTAMP(BEGIN_TIME))), 10, ' ')
   END as DURATION,
   LPAD(CONCAT(FORMAT(ROUND(ESTIMATE/1024/1024,0), 0), " MB"), 16, ' ') as "Estimate",
   CASE WHEN BEGIN_TIME IS NULL THEN LPAD('0%', 7, ' ')
   WHEN ESTIMATE > 0 THEN
   LPAD(CONVERT(CONCAT(CAST(ROUND(DATA*100/ESTIMATE, 0) AS BINARY), "%"), CHAR), 7, ' ')
   WHEN END_TIME IS NULL THEN LPAD('0%', 7, ' ')
   ELSE LPAD('100%', 7, ' ') END as "Done(%)"
FROM performance_schema.clone_progress;

特殊情况

代码语言:sql复制
STOP GROUP_REPLICATION;
set global read_only=0;

本文标签: mysql clone 插件使用