暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 8.0 新特性之 Clone Plugin(数据库克隆)实践案例

原创 OnTheRoad 2022-08-30
974

1. 克隆插件概述

MySQL 8.0.17 中引入的克隆插件允许在本地或从远程 MySQL 服务器实例克隆数据。克隆数据是存储在 InnoDB 中的数据的物理快照,包括模式、表、表空间和数据字典元数据。克隆的数据包含一个功能齐全的数据目录,允许使用克隆插件进行 MySQL 服务器配置。

在部署 MySQL 主从复制拓扑时,也可通过克隆插件创建主库的快照。

1.1. 使用限制

  1. MYSQL 8.0.17 及更高版本开始支持克隆插件。
  2. 仅支持存储引擎为 InnoDB 的表。
  3. 源库及克隆库的服务器版本需一致;
  4. 源库与克隆库 MySQL 服务器实例,必须在相同的操作系统和平台上运行。
  5. 默认情况(未指定 DATA DIRECTORY 选项 )下,在克隆源库数据之前,克隆库创建的数据(模式、表、表空间)和 Binlog 会在克隆库上删除,因此需为克隆数据提供足够的空间。
  6. 需要确保源库实例中已激活的插件,在克隆库实例上也已被激活。可通过 SHOW PLUGINS; 语句或 INFORMATION_SCHEMA.PLUGINS 表查看。
  7. 源库与克隆库需要具有一致的字符集与排序规则。
  8. 源库与克隆库需要具有相同的 innodb_page_sizeinnodb_data_file_path 设置。
  9. 克隆库中的 clone_valid_donor_list 设置必须包括源库 MySQL 服务器实例的主机地址及端口,如 10.0.30.2:3306
  10. 同时只能进行一个克隆任务。可通过表 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)
复制
  1. 需确保源库实例与克隆库实例 max_allowed_packet 大于 2MB,否则可能会报错。默认为 16MB
  2. 需确保源库实例 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. 克隆任务结束,克隆库实例会自动重启。若重启失败,需要手动重启。

1.2. 拓扑结构

  1. 本地克隆

指将 MySQL 数据库克隆至同一服务器的不同目录。可通过为克隆库指定不同的配置文件(/etc/my.cnf)、端口,来启动克隆库。

image.png

  1. 远程克隆

远程克隆操作涉及启动克隆任务(clone instance from)的克隆库实例(“Recipient”)和源数据所在的源库实例(“Donor”)。当在克隆库上启动远程克隆操作(clone instance from)时,克隆的数据通过网络从源库服务器传输到克隆库服务器。默认情况下,远程克隆操作会删除克隆库数据目录中现有用户创建的数据(模式、表、表空间)和 Binlog。或者,通过指定 DATA DIRECTORY [=] 'clone_dir',可以将源库数据克隆到克隆库服务器上的不同目录。

image.png

2. clone 插件安装

2.1. 安装插件

源库与克隆库实例均需安装

  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)
复制
  1. 方式二:通过 /etc/my.cnf 配置文件,在 MySQL 服务启动时加载
[mysqld] plugin-load-add = mysql_clone.so clone = FORCE_PLUS_PERMANENT # 强制 MySQL 启动时,加载克隆插件
复制

2.2. 查看 clone 插件状态

  1. 方式一:通过 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)
复制
  1. 方式二:通过系统表查看
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_ADMINSHUTDOWN 权限。

# 克隆库实例上执行 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. 设置日志级别,以便在日志中可观察克隆进度
# 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)
复制
  1. 开始克隆

执行克隆任务的语法格式:

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 克隆操作等待备份锁的时间(以 为单位)。执行克隆操作时,备份锁会阻止并发 DDL0 表示克隆操作不等待备份锁,若执行并发 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 权限。适用于克隆库实例。
最后修改时间:2023-05-14 19:19:50
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论