MySQL8.0.17推出了Clone plugin功能,其允许用户对当前示例进行本地或远程克隆,对快速搭建复制环境,备份等场景非常有用。
- 本地克隆:将数据从当前MySQL Server克隆到当前主机上的一个指定目录下面
- 远程克隆:启动克隆的MySQL Server称之为recipient(接收者),远程数据源的MySQL Server称之为donor(提供者),在recipient上执行远程克隆,数据会通过网络传输到recipient。克隆过程中会覆盖清除recipient上的所有数据,如果不希望被覆盖需指定克隆数据放在其它目录
- clone plugin支持在复制拓扑中使用。除了克隆数据外,克隆还会携带复制信息(binlog位置),并将其应用于接收方。我们可以用于在组复制中添加成员,也可以在主从环境中添加新的从节点。当组成员和待加入组的Server都支持Clone plugin,待加入的组成员可以自行选择一个更高效的方式获取数据。
- 克隆插件支持克隆数据加密的和数据页压缩
安装Clone Plugin
安装插件
1
|
root@(none) 10:46: INSTALL PLUGIN clone SONAME 'mysql_clone.so';
|
查看插件
1
2
3
4
5
6
|
root@(none) 10:47: select plugin_name,plugin_status from information_schema.plugins where plugin_name='clone';
+-------------+---------------+
| plugin_name | plugin_status |
+-------------+---------------+
| clone | ACTIVE |
+-------------+---------------+
|
如果想要防止MySQL Server在没有克隆插件的情况下运行,可以在配置文件设置参数控制克隆插件状态。在插件初始化失败时,强制MySQL Server启动失败
1
|
clone=FORCE_PLUS_PERMANENT
|
本地克隆
本地克隆需要backup_admin的权限
1
|
GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'localhost';
|
执行克隆
1
|
root@(none) 11:11: CLONE LOCAL DATA DIRECTORY = '/service/mysql/backup/20200515';
|
- mysql用户需要对目录有写权限
- 20200515目录事先不能存在
- 备份路径需要设置绝对路径
查看克隆状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
root@performance_schema 16:06: select * from clone_status;
+------+-------+-----------+-------------------------+-------------------------+----------------+---------------------------------+----------+---------------+-------------+-----------------+---------------+
| ID | PID | STATE | BEGIN_TIME | END_TIME | SOURCE | DESTINATION | ERROR_NO | ERROR_MESSAGE | BINLOG_FILE | BINLOG_POSITION | GTID_EXECUTED |
+------+-------+-----------+-------------------------+-------------------------+----------------+---------------------------------+----------+---------------+-------------+-----------------+---------------+
| 1 | 21847 | Completed | 2020-05-15 15:46:23.868 | 2020-05-15 15:46:45.992 | LOCAL INSTANCE | /service/mysql/backup/20200515/ | 0 | | | 0 | |
+------+-------+-----------+-------------------------+-------------------------+----------------+---------------------------------+----------+---------------+-------------+-----------------+---------------+
1 row in set (0.00 sec)
root@performance_schema 16:06: select * from clone_progress;
+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+---------+------------+---------------+
| ID | STAGE | STATE | BEGIN_TIME | END_TIME | THREADS | ESTIMATE | DATA | NETWORK | DATA_SPEED | NETWORK_SPEED |
+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+---------+------------+---------------+
| 1 | DROP DATA | Completed | 2020-05-15 15:46:23.868239 | 2020-05-15 15:46:23.868924 | 1 | 0 | 0 | 0 | 0 | 0 |
| 1 | FILE COPY | Completed | 2020-05-15 15:46:23.868972 | 2020-05-15 15:46:37.725829 | 2 | 1393161217 | 1393161217 | 0 | 0 | 0 |
| 1 | PAGE COPY | Completed | 2020-05-15 15:46:37.725944 | 2020-05-15 15:46:37.928775 | 2 | 0 | 0 | 0 | 0 | 0 |
| 1 | REDO COPY | Completed | 2020-05-15 15:46:37.928857 | 2020-05-15 15:46:38.129620 | 2 | 3072 | 3072 | 0 | 0 | 0 |
| 1 | FILE SYNC | Completed | 2020-05-15 15:46:38.129712 | 2020-05-15 15:46:45.992192 | 2 | 0 | 0 | 0 | 0 | 0 |
| 1 | RESTART | Not Started | NULL | NULL | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | RECOVERY | Not Started | NULL | NULL | 0 | 0 | 0 | 0 | 0 | 0 |
+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+---------+------------+---------------+
|
远程克隆
远程克隆语法
1
|
CLONE INSTANCE FROM 'user'@'host':port IDENTIFIED BY 'password' [DATA DIRECTORY [=] 'clone_dir'] [REQUIRE [NO] SSL];
|
将提供者信息添加到接收者上
1
|
MySQL> SET GLOBAL clone_valid_donor_list = '10.0.139.162:33006';
|
接收者上执行克隆命令
1
|
MySQL> CLONE INSTANCE FROM 'clone_user'@'10.0.139.162':33006 IDENTIFIED BY 'Abcd123#' ;
|
克隆限制
远程克隆存在下列限制:
- 远程克隆操作不支持由mysqlx端口指定的X协议端口
- 提供者和接收者都需要安装插件
- 提供者和接收者都需要创建克隆用户,提供者需要BACKUP_ADMIN权限,接收者需要CLONE_ADMIN权限,其中CLONE_ADMIN包含BACKUP_ADMIN和shutdown权限
- 提供者和接收者版本需要一致
- 提供者和接收者字符集设置需要一致
- 不支持通过mysql router连接提供者
- 克隆插件只克隆存储在InnoDB中的数据。其他存储引擎数据不是克隆的,binlog以及配置文件都不会被复制
- 如果没有设置data directory,接收者默认在克隆前会清除自身数据,并在clone完成后进行重启
- 提供者和接收者需要具有相同的innodb_page_size和innodb_data_file_path系统变量设置
- 如果克隆加密数据或压缩页数据,则提供者和接收者必须具有相同的文件系统块大小
- 如果要克隆加密数据,则需要启用安全连接
- 接收者的系统变量clone_valid_donor_list必须包含提供者的主机地址
- 克隆操作只能串行执行,不能多个克隆操作并行执行,可通过performance_schema.clone_status确认
- 克隆插件以1MB大小的数据包和1M大小的元数据的形式传输数据,max_allowed_packet不能低于2M
- UNDO表空间文件名必须是唯一的。无论提供者的undo表空间放在什么位置,克隆后接收者都存放在innodb_undo_directory系统变量下
- 在Clone过程中DDL以及truncate table会被阻塞
克隆流程
克隆流程主要包含:INIT->FILE COPY->PAGE COPY->REDO COPY->Done
INIT
需要持有backup lock, 阻止ddl进行
FILE COPY
按照文件进行拷贝,同时开启page tracking功能,记录在文件拷贝过程中修改的page。此时会设置buf_pool->track_page_lsn为当前lsn,track_page_lsn在flush page阶段用到
PAGE COPY
开启redo archiving功能,从当前点存储新增的redo log,这样从当前点开始的增量修改都不会丢失;同时在page track的page被发送到目标端,确保当前点之前所做的变更一定发送到目标端。
redo copy
停止Redo Archiving, 所有归档的日志被发送到目标端,这些日志包含了从page copy阶段开始到现在的所有日志
Done
接收者重启示例,通过Crash Recovery应用redo log
Tips
1. 初探 Clone Plugin
2. MySQL 8.0 clone plugin