1. 克隆插件概述
MySQL 8.0.17
中引入的克隆插件允许在本地或从远程 MySQL
服务器实例克隆数据。克隆数据是存储在 InnoDB
中的数据的物理快照,包括模式、表、表空间和数据字典元数据。克隆的数据包含一个功能齐全的数据目录,允许使用克隆插件进行 MySQL
服务器配置。
在部署 MySQL
主从复制拓扑时,也可通过克隆插件创建主库的快照。
1.1. 使用限制
- 从
MYSQL 8.0.17
及更高版本开始支持克隆插件。 - 仅支持存储引擎为
InnoDB
的表。 - 源库及克隆库的服务器版本需一致;
- 源库与克隆库
MySQL
服务器实例,必须在相同的操作系统和平台上运行。 - 默认情况(未指定
DATA DIRECTORY
选项 )下,在克隆源库数据之前,克隆库创建的数据(模式、表、表空间)和Binlog
会在克隆库上删除,因此需为克隆数据提供足够的空间。 - 需要确保源库实例中已激活的插件,在克隆库实例上也已被激活。可通过
SHOW PLUGINS;
语句或INFORMATION_SCHEMA.PLUGINS
表查看。 - 源库与克隆库需要具有一致的字符集与排序规则。
- 源库与克隆库需要具有相同的
innodb_page_size
和innodb_data_file_path
设置。 - 克隆库中的
clone_valid_donor_list
设置必须包括源库 MySQL 服务器实例的主机地址及端口,如10.0.30.2:3306
。 - 同时只能进行一个克隆任务。可通过表
performance_schema.clone_status
查询。
mysql> SELECT* FROM performance_schema.clone_status;
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------+
| ID | PID | STATE | BEGIN_TIME | END_TIME | SOURCE | DESTINATION | ERROR_NO | ERROR_MESSAGE | BINLOG_FILE | BINLOG_POSITION | GTID_EXECUTED |
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------+
| 1 | 0 | Completed | 2022-08-30 15:48:40.889 | 2022-08-30 15:54:59.182 | 10.0.30.2:3306 | LOCAL INSTANCE | 0 | | binlog.000025 | 7678123 | |
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------+
1 row in set (0.01 sec)
复制
- 需确保源库实例与克隆库实例
max_allowed_packet
大于2MB
,否则可能会报错。默认为16MB
。 - 需确保源库实例
UNDO
表空间文件名唯一。因为源库实例的 UNDO 表空间文件会被统一复制到克隆库实例innodb_undo_directory
变量指定的位置或DATA DIRECTORY
(如果指定该选项)指定的位置。因此,若源库存在同名UNDO
表空间,当MySQL
版本>= 8.0.18
时,会报错;当MySQL
版本< 8.0.18
时,同名UNDO
表空间将被覆盖。
# 查询源库 UNDO 表空间文件名
SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_TYPE LIKE 'UNDO LOG';
复制
- 克隆任务结束,克隆库实例会自动重启。若重启失败,需要手动重启。
1.2. 拓扑结构
- 本地克隆
指将 MySQL
数据库克隆至同一服务器的不同目录。可通过为克隆库指定不同的配置文件(/etc/my.cnf
)、端口,来启动克隆库。
- 远程克隆
远程克隆操作涉及启动克隆任务(clone instance from
)的克隆库实例(“Recipient”)和源数据所在的源库实例(“Donor”)。当在克隆库上启动远程克隆操作(clone instance from
)时,克隆的数据通过网络从源库服务器传输到克隆库服务器。默认情况下,远程克隆操作会删除克隆库数据目录中现有用户创建的数据(模式、表、表空间)和 Binlog
。或者,通过指定 DATA DIRECTORY [=] 'clone_dir'
,可以将源库数据克隆到克隆库服务器上的不同目录。
2. clone 插件安装
2.1. 安装插件
源库与克隆库实例均需安装
- 方式一:通过
INSTALL PLUGIN
动态加载
mysql> SHOW GLOBAL variables LIKE 'plugin_dir';
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| plugin_dir | /usr/local/mysql/lib/plugin/ |
+---------------+------------------------------+
1 row in set (0.02 sec)
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
Query OK, 0 rows affected (0.05 sec)
复制
- 方式二:通过
/etc/my.cnf
配置文件,在 MySQL 服务启动时加载
[mysqld] plugin-load-add = mysql_clone.so clone = FORCE_PLUS_PERMANENT # 强制 MySQL 启动时,加载克隆插件
复制
2.2. 查看 clone 插件状态
- 方式一:通过
SHOW PLUGINS
查看
mysql> SHOW PLUGINS;
+---------------------------------+----------+--------------------+----------------+---------+
| Name | Status | Type | Library | License |
+---------------------------------+----------+--------------------+----------------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysqlx_cache_cleaner | ACTIVE | AUDIT | NULL | GPL |
| mysqlx | ACTIVE | DAEMON | NULL | GPL |
| clone | ACTIVE | CLONE | mysql_clone.so | GPL |
+---------------------------------+----------+--------------------+----------------+---------+
46 rows in set (0.00 sec)
复制
- 方式二:通过系统表查看
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';
+-------------+---------------+
| plugin_name | plugin_status |
+-------------+---------------+
| clone | ACTIVE |
+-------------+---------------+
1 row in set (0.00 sec)
复制
3. 用户授权
3.1. 源库为用户授权
在源库上,克隆用户需要 BACKUP_ADMIN
权限才能访问和传输来自源库的数据,并在克隆操作期间阻止并发 DDL
。
MySQL 8.0.27
版本之前,在克隆操作期间,源库上的并发 DDL
被阻止;从 MySQL 8.0.27
开始,默认情况下,在克隆操作期间,源库实例上允许并发 DDL
。
# 源库实例上执行
mysql> GRANT BACKUP_ADMIN on *.* TO 'root'@'%';
Query OK, 0 rows affected (0.10 sec)
复制
3.2. 克隆库为用户授权
在克隆库上,克隆用户需要 CLONE_ADMIN
权限来替换克隆库实例上的数据,在克隆操作期间阻止克隆库实例上的 DDL
,并在克隆结束后自动重新启动克隆库上的 MySQL
实例。 CLONE_ADMIN
权限隐含地包括 BACKUP_ADMIN
和 SHUTDOWN
权限。
# 克隆库实例上执行
mysql> GRANT CLONE_ADMIN on *.* TO 'root'@'%';
Query OK, 0 rows affected (0.03 sec)
复制
4. 克隆库指定数据源
在克隆库实例中执行,设置全局变量 clone_valid_donor_list
,指定源库的地址及端口。
mysql> SET GLOBAL clone_valid_donor_list = '10.0.30.2:3306';
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW GLOBAL variables LIKE 'clone_%';
+-------------------------------------------+----------------+
| Variable_name | Value |
+-------------------------------------------+----------------+
| clone_autotune_concurrency | ON |
| clone_block_ddl | OFF |
| clone_buffer_size | 4194304 |
| clone_ddl_timeout | 300 |
| clone_delay_after_data_drop | 0 |
| clone_donor_timeout_after_network_failure | 5 |
| clone_enable_compression | OFF |
| clone_max_concurrency | 16 |
| clone_max_data_bandwidth | 0 |
| clone_max_network_bandwidth | 0 |
| clone_ssl_ca | |
| clone_ssl_cert | |
| clone_ssl_key | |
| clone_valid_donor_list | 10.0.30.2:3306 |
+-------------------------------------------+----------------+
14 rows in set (0.00 sec)
复制
5. 开始克隆
- 设置日志级别,以便在日志中可观察克隆进度
# 1. 调整日志级别为 3,以便从 error 日志中可查看克隆进度
mysql> SHOW GLOBAL variables LIKE 'log_error_verbosity';
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| log_error_verbosity | 2 |
+---------------------+-------+
1 row in set (0.02 sec)
mysql> SET GLOBAL log_error_verbosity = 3;
Query OK, 0 rows affected (0.01 sec)
复制
- 开始克隆
执行克隆任务的语法格式:
CLONE INSTANCE FROM 'user'@'host':port IDENTIFIED BY 'password' [DATA DIRECTORY [=] 'clone_dir']
复制
DATA DIRECTORY [=] 'clone_dir'
为可选项,指定克隆库存放数据的目录。需要为 绝对路径
,并且子目录不能存在。 MySQL 服务器必须具有创建目录所需的写入权限。若省略 DATA DIRECTORY
选项,则克隆库实例的数据目录与源库实例的数据目录保持一致(目录中已存在的文件,自动删除)。
# 指定源库连接信息、认证信息,开始克隆
mysql> CLONE INSTANCE FROM root@'10.0.30.2':3306 IDENTIFIED BY '123456';
复制
6. 查看进度
在克隆库实例查看克隆日志及进度
[mysql@localhost ~]$ tail -f /mysql/mysql-log/mysql.err 2022-08-30T07:48:40.901804Z 10 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Task Connect.' 2022-08-30T07:48:40.912266Z 10 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Master ACK Connect.' 2022-08-30T07:48:40.912527Z 10 [Note] [MY-013457] [InnoDB] Clone Apply Begin Master Version Check ...... 2022-08-30T07:48:52.623590Z 0 [Note] [MY-013457] [InnoDB] Clone Apply Begin Task ID: 2 2022-08-30T07:48:52.625377Z 0 [Note] [MY-013457] [InnoDB] Clone Apply Begin Task ID: 3 2022-08-30T07:48:52.625630Z 0 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Command COM_ATTACH.' 2022-08-30T07:48:52.627091Z 0 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Command COM_ATTACH.' 2022-08-30T07:48:57.636684Z 10 [Note] [MY-013272] [Clone] Plugin Clone reported: 'Client: Tune stop, Data: 107 MiB/sec, Target: 135 MiB/sec..' 2022-08-30T07:53:53.529770Z 10 [Note] [MY-013458] [InnoDB] Clone Apply State FLUSH REDO: 2022-08-30T07:53:53.969933Z 10 [Note] [MY-012887] [InnoDB] Setting log file /mysql/redo-log/ib_logfile0.#clone size to 4096 MB. Progress : 10% 2022-08-30T07:53:54.379578Z 10 [Note] [MY-012887] [InnoDB] Setting log file /mysql/redo-log/ib_logfile0.#clone size to 4096 MB. Progress : 20% ...... 2022-08-30T07:53:56.106481Z 10 [Note] [MY-012887] [InnoDB] Setting log file /mysql/redo-log/ib_logfile0.#clone size to 4096 MB. Progress : 80% 2022-08-30T07:53:56.259861Z 10 [Note] [MY-012887] [InnoDB] Setting log file /mysql/redo-log/ib_logfile0.#clone size to 4096 MB. Progress : 90% 2022-08-30T07:53:56.444655Z 10 [Note] [MY-012887] [InnoDB] Setting log file /mysql/redo-log/ib_logfile0.#clone size to 4096 MB. Progress : 100%
复制
7. 与克隆相关系统变量
变量名 | 作用域 | 默认值 | 动态 | 说明 |
---|---|---|---|---|
clone_autotune_concurrency | GLOBAL | ON | Y | clone_autotune_concurrency=ON (默认值)时,会动态生成用于远程克隆操作的附加线程以优化数据传输速度。该设置仅适用于克隆库实例。 |
clone_buffer_size | GLOBAL | 4194304 | Y | 定义在本地克隆操作期间传输数据时使用的中间缓冲区的大小。适用于本地克隆。 |
clone_block_ddl | GLOBAL | OFF | Y | 默认为 OFF (从 8.0.27 开始)时,在克隆操作期间,允许在源库并发 DDL 操作。为 ON 时,通过增加备份锁,以禁止并发 DDL 。适用于源库与克隆库实例。 |
clone_delay_after_data_drop | GLOBAL | 0 | Y | 指定开始远程克隆的延迟,以便在开始克隆之前,文件系统有足够的实践删除文件以释放空间。适用于克隆库实例。 |
clone_ddl_timeout | GLOBAL | 300 | Y | 克隆操作等待备份锁的时间(以 秒 为单位)。执行克隆操作时,备份锁会阻止并发 DDL 。0 表示克隆操作不等待备份锁,若执行并发 DDL 操作可能会导致克隆操作失败。适用于源库与克隆库实例。 |
clone_donor_timeout_after_network_failure | GLOBAL | 5 | Y | 以分钟为单位定义源库允许克隆库,在网络故障后重新连接,并重新启动克隆操作的时间量。适用于源库实例。 |
clone_enable_compression | GLOBAL | OFF | Y | 在远程克隆操作期间启用网络层的数据压缩。适用于克隆库实例。 |
clone_max_concurrency | GLOBAL | 16 | Y | 定义远程克隆操作的最大并发线程数。适用于克隆库实例。 |
clone_max_data_bandwidth | GLOBAL | 0 | Y | 定义远程克隆操作的最大数据传输速率,以每秒兆字节 (MiB ) 为单位,0 表示无限制。适用于克隆库实例。 |
clone_max_network_bandwidth | GLOBAL | 0 | Y | 指定远程克隆操作的最大近似网络传输速率,以每秒兆字节 (MiB ) 为单位,0 表示无限制。适用于克隆库实例。 |
clone_ssl_ca | GLOBAL | 空 | Y | 指定证书颁发机构 (CA ) 文件的路径。用于为远程克隆操作配置加密连接。适用于克隆库实例。 |
clone_ssl_cert | GLOBAL | 空 | Y | 指定公钥证书的路径。用于为远程克隆操作配置加密连接。适用于克隆库实例。 |
clone_ssl_key | GLOBAL | 空 | Y | 指定私钥文件的路径。用于为远程克隆操作配置加密连接。适用于克隆库实例。 |
clone_valid_donor_list | GLOBAL | NULL | Y | 为远程克隆操作定义有效的源库主机地址(IP:端口 ),仅支持 IPv4 。多个值用逗号分隔,如 “HOST1:PORT1,HOST2:PORT2,HOST3:PORT3 ”。配置 clone_valid_donor_list 需要 SYSTEM_VARIABLES_ADMIN 权限。适用于克隆库实例。 |