乐于分享
好东西不私藏

18、克隆插件

18、克隆插件

克隆插件

有了 Clone Plugin,只用一条命令,我们就能很方便地添加一个新的节点,无论是在 Group Replication 还是普通的主从环境中。


安装

Clone Plugin 可通过以下两种方式安装:

动态加载:

mysql> install plugin clone soname 'mysql_clone.so';
也可在配置文件中指定:
[mysql]plugin-load-add=mysql_clone.so

执行 show plugins 查看插件是否安装成功。

Status 为 ACTIVE 代表插件加载成功。

(文档中包含示例图片)


Clone Plugin 的使用

本地克隆

本地克隆是将本地 MySQL 实例中的数据拷贝到本地服务器的一个目录中。本地克隆只能在实例本地发起。

本地克隆命令的语法如下:

CLONE LOCAL DATA DIRECTORY [=] 'clone_dir';
这里的 clone_dir 是克隆目录。
1. 创建用户
mysql> create user 'clone_user'@'%' identified by 'clone_pass';mysql> grant backup_admin on *.* to 'clone_user'@'%';
这里的 backup_admin 是克隆操作必需权限,它允许用户执行 LOCK INSTANCE FOR BACKUP 命令。
2. 创建克隆目录
# mkdir -p /data/backup# chown -R mysql.mysql /data/backup/
3. 执行本地克隆操作
# mysql -uclone_user -pclone_passmysql> clone local data directory='/data/backup/3307';
4. 可直接基于备份集启动实例
/usr/local/mysql/bin/mysql --no-defaults --datadir=/data/backup/3307 --user mysql --port 3307 &

这里的 /data/backup/3307 是克隆目录,它需满足以下几点要求:

  1. 克隆目录必须是绝对路径。

  2. /data/backup 必须存在,且 MySQL 对其有可写权限。

  3. 最后一级目录 3307 不能存在。


远程克隆

远程克隆涉及两个实例。被克隆的实例是 Donor,接受克隆数据的实例是 Recipient。克隆命令需在 Recipient 上发起。

远程克隆命令的语法如下:

CLONE INSTANCE FROM 'user'@'host':portIDENTIFIED BY 'password'[DATA DIRECTORY [='clone_dir'][REQUIRE [NO] SSL];

这里面:

  • hostport:被克隆实例 (Donor) 的 IP 和端口。

  • userpassword:Donor 上的克隆用户和密码,需要 backup_admin 权限。

  • DATA DIRECTORY:备份目录。不指定的话,则默认克隆到 Recipient 的数据目录下。

  • REQUIRE [NO] SSL:是否开启 SSL 通信。

1. 在 Donor 实例上创建克隆用户,加载 Clone Plugin

mysql> create user 'donor_user'@'%' identified by 'donor_pass';mysql> grant backup_admin on *.* to 'donor_user'@'%';mysql> install plugin clone soname 'mysql_clone.so';
2. 在 Recipient 实例上创建克隆用户,加载 Clone Plugin
mysql> create user 'recipient_user'@'%' identified by 'recipient_pass';mysql> grant clone_admin on *.* to 'recipient_user'@'%';mysql> install plugin clone soname 'mysql_clone.so';
3. 在 Recipient 实例上设置 Donor 白名单Recipient 只能克隆白名单中的实例。
mysql> set global clone_valid_donor_list = '192.168.79.10:3306';
4. 在 Recipient 上发起克隆命令
# mysql -urecipient_user -precipient_passmysql> clone instance from 'donor_user'@'192.168.79.10':3306 identified by 'donor_pass';

远程克隆会依次执行以下操作:

  1. 获取备份锁(Backup Lock)。备份锁和 DDL 互斥。注意,获取的不仅仅是 Recipient 上的备份锁,Donor 上的同样也要获取。

  2. Drop 用户表空间。

  3. 从 Donor 实例拷贝数据。

  4. 重启实例。


查看克隆操作的进度

查看克隆操作的进度,主要依托于 performance_schema 中的两张表:clone_status 和 clone_progress

mysql> select * from performance_schema.clone_status\G*************************** 1. row ***************************              ID: 1             PID: 0           STATE: Completed       BEGIN_TIME: 2024-01-14 14:11:42.972         END_TIME: 2024-01-14 14:11:48.104          SOURCE: 192.168.79.10:3306     DESTINATION: LOCAL INSTANCE        ERROR_NO: 0    ERROR_MESSAGE:      BINLOG_FILE: mysql-bin.000002  BINLOG_POSITION: 2731   GTID_EXECUTED: 1 row in set (0.00 sec)
mysql> select * from performance_schema.clone_progress;+----+-------------+-----------+----------------------------+----------------------------+---------+-----------+-----------+---------+-----------------+----------------+| ID | STAGE       | STATE     | BEGIN_TIME                 | END_TIME                   | THREADS | ESTIMATE  | DATA      | NETWORK | DATA_SPEED     | NETWORK_SPEED  |+----+-------------+-----------+----------------------------+----------------------------+---------+-----------+-----------+---------+-----------------+----------------+|  1 | DROP DATA   | Completed | 2024-01-14 14:11:43.069825 | 2024-01-14 14:11:43.193118 |       1 |         0 |         0 |       0 |               0 |              0 ||  1 | FILE COPY   | Completed | 2024-01-14 14:11:43.193175 | 2024-01-14 14:11:44.288469 |       1 |  72586857 |  72586857 |       0 |        72599404 |              0 ||  1 | PAGE COPY   | Completed | 2024-01-14 14:11:44.288645 | 2024-01-14 14:11:44.290764 |       1 |         0 |        99 |       0 |               0 |              0 ||  1 | REDO COPY   | Completed | 2024-01-14 14:11:44.290871 | 2024-01-14 14:11:44.292016 |       1 |      2560 |      2560 |       0 |            2901 |              0 ||  1 | FILE SYNC   | Completed | 2024-01-14 14:11:44.292066 | 2024-01-14 14:11:44.315454 |       1 |         0 |         0 |       0 |               0 |              0 ||  1 | RESTART     | Completed | 2024-01-14 14:11:44.315454 | 2024-01-14 14:11:47.822686 |       0 |         0 |         0 |       0 |               0 |              0 ||  1 | RECOVERY    | Completed | 2024-01-14 14:11:47.822686 | 2024-01-14 14:11:48.103821 |       0 |         0 |         0 |       0 |               0 |              0 |+----+-------------+-----------+----------------------------+----------------------------+---------+-----------+-----------+---------+-----------------+----------------+7 rows in set (0.00 sec)

基于克隆数据搭建从库

这里,区分两种场景:GTID 复制和基于位置点的复制。

GTID 复制

对于 GTID 复制,无需关心具体的位置点信息,直接设置 MASTER_AUTO_POSITION = 1 即可。具体命令如下:

mysql> CHANGE MASTER TO MASTER_HOST = 'master_host_name',         MASTER_PORT = master_port_num,         MASTER_AUTO_POSITION = 1;mysql> START SLAVE;

基于位置点的复制

mysql> SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;mysql> CHANGE MASTER TO MASTER_HOST = 'master_host_name',         MASTER_PORT = master_port_num,         MASTER_LOG_FILE = 'master_log_name',         MASTER_LOG_POS = master_log_pos;mysql> START SLAVE;

master_log_namemaster_log_pos 分别取自 performance_schema.clone_status 中的 BINLOG_FILE 和 BINLOG_POSITION


使用限制

在使用 Clone Plugin 时,注意以下限制:

  1. 克隆期间,会阻塞 DDL。同样,DDL 也会阻塞克隆命令的执行。不过从 MySQL 8.0.27 开始,克隆命令不会阻塞 Donor 上的 DDL。

  2. Clone Plugin 不会拷贝 Donor 的配置参数、Binlog。

  3. Clone Plugin 只会拷贝 InnoDB 表的数据,对于其它存储引擎的表,只会拷贝表结构。

  4. Donor 实例中如果有表通过 DATA DIRECTORY 子句设置了绝对路径,在进行本地克隆时,会提示文件已存在。在进行远程克隆时,绝对路径必须存在且有可写权限。

  5. 不允许通过 MySQL Router 连接 Donor 实例。

  6. 执行 CLONE INSTANCE 操作时,指定的 Donor 端口不能为 X Protocol 端口。

除此之外,在进行远程克隆时,还有如下要求:

  • MySQL 版本(包括小版本)、主机的操作系统和位数(32 位,64 位)、字符集相关参数(character_set_servercollation_server 和 character_set_filesystem)、innodb_page_size 必须一致。

  • Recipient 必须有足够的磁盘空间存储克隆数据。

  • 无论是 Donor,还是 Recipient,同一时间,只能执行一个克隆操作。

  • Recipient 需要重启,所以其必须通过 mysqld_safe 等进程管理工具进行管理,否则的话,实例关闭后,需手动拉起。


17、mysqldump
16、MySQL备份
15、MySQL 主从延迟的常见原因及解决方法
14、复制的常见管理操作
13、多线程复制、过滤复制和延迟复制
12、多源复制
11、半同步复制
10、GTID复制
9、MySQL如何搭建复制
8、MySQL日志介绍
7、MySQL 5.5, 5.6, 5.7, 8.0的新特性
6、企业级MySQL自动化部署流程
5、MySQL 配置文件参数模板
4、MySQL 安装及服务管理
3、MySQL 体系架构
2、MySQL 历史及知识体系
1、数据库基本概念