MySQL Clone Plugin

一、clone插件介绍

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

  • 本地克隆:本地克隆操作将启动克隆操作的 MySQL 服务器实例中的数据克隆到同服务器或同节点上的一个目录里。
    在这里插入图片描述
  • 远程克隆操作涉及启动克隆操作的本地MySQL服务器实例(“接收者”)和源数据所在的远程MySQL服务器实例( “捐赠者”)。在接收者上启动远程克隆操作时,克隆的数据会通过网络从捐赠者传输到接收者。默认情况下,远程克隆操作会删除接收者数据目录中的数据,并将其替换为克隆的数据。(可选)可以将数据克隆到接收者的其他目录中,以避免删除现有数据。
    在这里插入图片描述
      远程克隆操作和本地克隆操作克隆的数据没有区别,数据是相同的。克隆插件支持复制。除克隆数据外,克隆操作还从捐赠者中提取并传输复制位置信息,并将其应用于接受者,从而可以使用克隆插件来配置组复制或主从复制。使用克隆插件进行配置比复制大量事务要快得多,效率更高。

二、安装克隆插件

  插件库文件必须位于MySQL插件目录(由plugin_dir系统变量命名的目录)中,插件库文件的基本名称为 mysql_clone.so。文件名后缀因平台.so而异(例如,对于Unix和类似Unix的系统,.dll对于Windows。

root@mysql 14:12:  [(none)]> show variables like '%plugin_dir%';
+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| plugin_dir    | /var/soft/mysql/lib/plugin/ |
+---------------+-----------------------------+
1 row in set (0.01 sec)

  要在服务器启动时加载插件,请使用–plugin-load-add选项来命名包含该插件 的库文件。使用此插件加载方法,每次服务器启动时都必须给出该选项。例如,将这些行放在my.cnf 文件中,并.so根据需要调整平台的后缀:

#--plugin-load-add在从以前的MySQL版本升级期间重新启动服务器时,无法使用该选项加​​载克隆插件。例如,将二进制文件或程序包从MySQL 5.7升级到MySQL 8.0后,尝试重新启动服务器 plugin-load-add=mysql_clone.so 会导致以下错误:[ERROR] [MY-013238] [Server]安装插件'clone'时出错:升级期间无法安装。解决方法是在尝试使用启动服务器之前先升级服务器 plugin-load-add=mysql_clone.so。
[mysqld]
plugin-load-add=mysql_clone.so

  使用INSTALL PLUGIN加载插件,并将其注册到mysql.plugins 系统表中,以使插件在每次后续的正常服务器启动时都加载,而无需 --plugin-load-add。

root@mysql 14:12:  [(none)]> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
Query OK, 0 rows affected (0.01 sec)
root@mysql 14:12:  [(none)]> SELECT * FROM INFORMATION_SCHEMA.PLUGINS        WHERE PLUGIN_NAME = 'clone'\G
*************************** 1. row ***************************
           PLUGIN_NAME: clone
        PLUGIN_VERSION: 1.0
         PLUGIN_STATUS: ACTIVE
           PLUGIN_TYPE: CLONE
   PLUGIN_TYPE_VERSION: 1.0
        PLUGIN_LIBRARY: mysql_clone.so
PLUGIN_LIBRARY_VERSION: 1.10
         PLUGIN_AUTHOR: Oracle Corporation
    PLUGIN_DESCRIPTION: CLONE PLUGIN
        PLUGIN_LICENSE: GPL
           LOAD_OPTION: ON

root@mysql 14:12:  [(none)]> show variables like '%clone%';
+-----------------------------+---------+
| Variable_name               | Value   |
+-----------------------------+---------+
| clone_autotune_concurrency  | ON      |
| clone_buffer_size           | 4194304 |
| clone_ddl_timeout           | 300     |
| 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      |         |
+-----------------------------+---------+
11 rows in set (0.00 sec)

三、克隆数据

3.1 克隆本地数据

  拥有BACKUP_ADMIN权限才能执行CLONE LOCAL DATA DIRECTORY的语句。

root@mysql 14:42:  [(none)]> create user clone_user;
Query OK, 0 rows affected (0.01 sec)

root@mysql 14:42:  [(none)]> GRANT BACKUP_ADMIN ON *.* TO 'clone_user';
Query OK, 0 rows affected (0.01 sec)

  clone插件支持以下用于在本地克隆数据的语法:将数据从本地MySQL数据目录克隆到运行MySQL服务器实例的同一服务器或节点上的另一个目录:

clone_user@mysql 14:48:  [(none)]> CLONE LOCAL DATA DIRECTORY = '/data/mysql/clone';
Query OK, 0 rows affected (1 min 23.15 sec)

  其中/data/mysql/clone是将数据克隆到的本地目录的完整路径。绝对路径是必需的,并且指定的目录(“ clone_dir”)一定不存在,但是指定的路径必须是存在的路径。MySQL服务器必须具有创建目录所需的写权限。
  克隆目录可以直接作为数据目录启动数据库。

[root@zijie mysql]#  mv data/ data_bak
[root@zijie mysql]#  mv clone/ data/
[root@zijie mysql]#  mysqld_safe --defaults-file=/etc/my.cnf &
root@mysql 17:39:  [performance_schema]> select * from clone_status;
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------------------------------------+
| ID   | PID  | STATE     | BEGIN_TIME              | END_TIME                | SOURCE         | DESTINATION    | ERROR_NO | ERROR_MESSAGE | BINLOG_FILE   | BINLOG_POSITION | GTID_EXECUTED                               |
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------------------------------------+
|    1 |    0 | Completed | 2020-12-27 15:01:31.205 | 2020-12-27 15:10:08.372 | LOCAL INSTANCE | LOCAL INSTANCE |        0 |               | binlog.000013 |             196 | 594f981f-43ac-11eb-abbb-00163e0c8a51:1-2101 |
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------------------------------------+
1 row in set (0.01 sec)

root@mysql 17:39:  [performance_schema]> select * from clone_progress;
+------+-----------+-----------+----------------------------+----------------------------+---------+------------+------------+---------+------------+---------------+
| ID   | STAGE     | STATE     | BEGIN_TIME                 | END_TIME                   | THREADS | ESTIMATE   | DATA       | NETWORK | DATA_SPEED | NETWORK_SPEED |
+------+-----------+-----------+----------------------------+----------------------------+---------+------------+------------+---------+------------+---------------+
|    1 | DROP DATA | Completed | 2020-12-27 15:01:31.204701 | 2020-12-27 15:01:31.213885 |       1 |          0 |          0 |       0 |          0 |             0 |
|    1 | FILE COPY | Completed | 2020-12-27 15:01:31.213946 | 2020-12-27 15:02:15.155140 |       2 | 2357319361 | 2357319361 |       0 |          0 |             0 |
|    1 | PAGE COPY | Completed | 2020-12-27 15:02:15.155312 | 2020-12-27 15:02:15.460111 |       2 |          0 |          0 |       0 |          0 |             0 |
|    1 | REDO COPY | Completed | 2020-12-27 15:02:15.460294 | 2020-12-27 15:02:15.661953 |       2 |       3072 |       3072 |       0 |          0 |             0 |
|    1 | FILE SYNC | Completed | 2020-12-27 15:02:15.662069 | 2020-12-27 15:02:58.471690 |       2 |          0 |          0 |       0 |          0 |             0 |
|    1 | RESTART   | Completed | 2020-12-27 15:02:58.471690 | 2020-12-27 15:10:01.386918 |       0 |          0 |          0 |       0 |          0 |             0 |
|    1 | RECOVERY  | Completed | 2020-12-27 15:10:01.386918 | 2020-12-27 15:10:08.371822 |       0 |          0 |          0 |       0 |          0 |             0 |
+------+-----------+-----------+----------------------------+----------------------------+---------+------------+------------+---------+------------+---------------+
7 rows in set (0.00 sec)

3.2 克隆远程数据

  clone插件支持从远程MySQL服务器实例(捐赠者)克隆数据,并将其传输到发起克隆操作的MySQL实例(接受者)。

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

#DATA DIRECTORY [=] 'clone_dir'是一个可选子句,用于指定接受者上要克隆的数据的目录。如果不想删除接受者数据目录中的现有数据,可以使用此选项。必须使用绝对路径,且目录必须不存在。MySQL服务器必须具有创建目录所需的写权限。如果不使用optional子句,则克隆操作将删除接受者数据目录中的现有数据,将其替换为克隆的数据,然后自动重新启动服务器。 
#[REQUIRE [NO] SSL]指定在通过网络传输克隆数据时是否使用加密连接。如果无法满足显式规范,则返回错误。如果未指定SSL子句,则克隆会默认尝试建立加密连接,如果安全连接尝试失败,则会回退到不安全的连接。无论是否指定此子句,克隆加密数据时都需要安全连接。

  要执行克隆操作,克隆插件必须在捐赠者和和接收者MySQL服务器实例上均处于活动状态。执行克隆操作需要捐赠者和和接收者上的MySQL用户。

  • 在捐赠者上,克隆用户需要 BACKUP_ADMIN特权才能访问和传输来自捐赠者的数据,并在克隆操作期间阻止DDL。
  • 在接收者上,克隆用户需要具有以下 CLONE_ADMIN特权:替换接收者的数据,在克隆操作期间阻止DDL以及自动重新启动服务器。CLONE_ADMIN权限包括BACKUP_ADMIN和 SHUTDOWN隐含的权限。

注意:

  • 捐赠者和接收者必须具有相同的MySQL服务器版本。MYSQL 8.0.17及更高版本支持clone插件。

  • 捐赠者和接收者MySQL服务器实例必须在相同的操作系统和平台上运行。

  • 接收者必须具有足够的磁盘空间来存储克隆的数据。默认情况下,在克隆供体数据之前会删除接收者的数据,因此只需要足够的空间即可存储捐赠者数据。如果使用该DATA DIRECTORY子句克隆到命名目录,则必须有足够的磁盘空间用于现有的接收者的数据和克隆的数据。

  • InnoDB允许在数据目录之外创建一些表空间类型。如果捐赠者MySQL服务器实例的表空间位于数据目录之外,则克隆操作必须能够访问这些表空间。可以查询 INFORMATION_SCHEMA.FILES 表以标识驻留在数据目录之外的表空间。驻留在数据目录之外的文件具有到数据目录以外的目录的标准路径。

  • 在捐赠者上活动的插件(包括任何密钥插件)也必须在接收者上活动。您可以通过发布SHOW PLUGINS语句或查询 INFORMATION_SCHEMA.PLUGINS 表来标识活动插件 。

  • 捐赠者和接受者必须具有相同的MySQL服务器字符集和排序规则。

  • 捐赠者和接受者必须具有相同的innodb_page_size和innodb_data_file_path。

  • 如果克隆加密或页面压缩的数据,则捐赠者和接受者必须具有相同的文件系统块大小。

  clone_valid_donor_list 参数需要在接收者设置,值为捐赠者MySQL服务器实例的主机地址。只能从有效捐赠者列表上的主机克隆数据。
  一次只能进行一次克隆操作。要确定克隆操作是否正在运行,可以查询 clone_status表。
  克隆插件以1MB数据包以及元数据的形式传输数据。因此,在捐助者和接收者MySQL服务器实例上的最低要求max_allowed_packet值为2MB。max_allowed_packet小于2MB的 值将导致错误。使用以下查询来检查您的 max_allowed_packet 设置:
  捐赠者上的undo表空间文件名必须唯一。当将数据克隆到接收者时,undo表空间(无论在捐赠者上的位置如何)都将克隆到innodb_undo_directory 接收者的位置或子句指定的目录(如果使用)中。因此,不允许在施主上使用重复的undo表空间文件名。从MySQL 8.0.18开始,如果在克隆操作期间遇到重复的undo表空间文件名,则会报告错误。在MySQL 8.0.18之前,克隆具有相同文件名的undo表空间可能导致undo表空间文件在接收者上被覆盖。
  默认情况下,克隆数据后,接收者MySQL服务器实例将自动重新启动(停止和启动)。为了进行自动重启,接收者上必须有一个监视过程来检测服务器关闭。否则,在克隆数据并关闭接收方MySQL服务器实例后,克隆操作会因以下错误而暂停:
ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
  此错误并不表示克隆失败。这意味着克隆数据后,必须再次手动启动接收者MySQL服务器实例。手动启动服务器后,可以连接到接收者MySQL服务器实例,并检查克隆操作是否成功完成。
示例:

捐赠者:
CREATE USER 'donor_clone_user'@'%' IDENTIFIED BY '123456';
GRANT BACKUP_ADMIN on *.* to 'donor_clone_user'@'%';
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
接受者:
CREATE USER 'recipient_clone_user'@'%' IDENTIFIED BY '123456';
GRANT CLONE_ADMIN on *.* to 'recipient_clone_user'@'%';
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
SET GLOBAL clone_valid_donor_list = '127.0.0.1:3306';

#在接收者执行
root@mysql 17:36:  [(none)]> CLONE INSTANCE FROM 'donor_clone_user'@'127.0.0.1':3306 IDENTIFIED BY '123456';
Query OK, 0 rows affected (1 min 1.33 sec)

root@mysql 17:37:  [(none)]> Restarting mysqld...
2020-12-27T09:37:35.504997Z mysqld_safe Number of processes running now: 0
2020-12-27T09:37:35.509610Z mysqld_safe mysqld restarted
root@mysql 17:38:  [performance_schema]> select * from clone_progress;
+------+-----------+-----------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+
| ID   | STAGE     | STATE     | BEGIN_TIME                 | END_TIME                   | THREADS | ESTIMATE   | DATA       | NETWORK    | DATA_SPEED | NETWORK_SPEED |
+------+-----------+-----------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+
|    1 | DROP DATA | Completed | 2020-12-27 17:36:31.099998 | 2020-12-27 17:36:31.479585 |       1 |          0 |          0 |          0 |          0 |             0 |
|    1 | FILE COPY | Completed | 2020-12-27 17:36:31.479697 | 2020-12-27 17:36:51.912601 |       2 | 1128502977 | 1128502977 | 1128571265 |          0 |             0 |
|    1 | PAGE COPY | Completed | 2020-12-27 17:36:51.912710 | 2020-12-27 17:36:52.319905 |       2 |          0 |          0 |        197 |          0 |             0 |
|    1 | REDO COPY | Completed | 2020-12-27 17:36:52.320053 | 2020-12-27 17:36:52.620652 |       2 |       3584 |       3584 |       4079 |          0 |             0 |
|    1 | FILE SYNC | Completed | 2020-12-27 17:36:52.620782 | 2020-12-27 17:37:32.412985 |       2 |          0 |          0 |          0 |          0 |             0 |
|    1 | RESTART   | Completed | 2020-12-27 17:37:32.412985 | 2020-12-27 17:37:35.863105 |       0 |          0 |          0 |          0 |          0 |             0 |
|    1 | RECOVERY  | Completed | 2020-12-27 17:37:35.863105 | 2020-12-27 17:37:37.250319 |       0 |          0 |          0 |          0 |          0 |             0 |
+------+-----------+-----------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+
7 rows in set (0.01 sec)

root@mysql 17:39:  [performance_schema]> select * from clone_status;
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------------------------------------------------------------------------------+
| ID   | PID  | STATE     | BEGIN_TIME              | END_TIME                | SOURCE         | DESTINATION    | ERROR_NO | ERROR_MESSAGE | BINLOG_FILE   | BINLOG_POSITION | GTID_EXECUTED                                                                         |
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------------------------------------------------------------------------------+
|    1 |    0 | Completed | 2020-12-27 17:36:31.085 | 2020-12-27 17:37:37.250 | 127.0.0.1:3306 | LOCAL INSTANCE |        0 |               | binlog.000014 |            1278 | 594f981f-43ac-11eb-abbb-00163e0c8a51:1-2101,
8e07f60e-4812-11eb-b202-00163e0c8a51:1-5 |
+------+------+-----------+-------------------------+-------------------------+----------------+----------------+----------+---------------+---------------+-----------------+---------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

#克隆到指定目录
root@mysql 17:47:  [performance_schema]> select * from clone_progress;
+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+
| ID   | STAGE     | STATE       | BEGIN_TIME                 | END_TIME                   | THREADS | ESTIMATE   | DATA       | NETWORK    | DATA_SPEED | NETWORK_SPEED |
+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+
|    1 | DROP DATA | Completed   | 2020-12-27 17:42:02.556278 | 2020-12-27 17:42:02.688091 |       1 |          0 |          0 |          0 |          0 |             0 |
|    1 | FILE COPY | Completed   | 2020-12-27 17:42:02.688182 | 2020-12-27 17:42:23.207776 |       2 | 1128388289 | 1128388289 | 1128456442 |          0 |             0 |
|    1 | PAGE COPY | Completed   | 2020-12-27 17:42:23.207910 | 2020-12-27 17:42:23.519334 |       2 |          0 |          0 |        197 |          0 |             0 |
|    1 | REDO COPY | Completed   | 2020-12-27 17:42:23.519444 | 2020-12-27 17:42:23.819936 |       2 |       3584 |       3584 |       4079 |          0 |             0 |
|    1 | FILE SYNC | Completed   | 2020-12-27 17:42:23.820066 | 2020-12-27 17:43:03.065116 |       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 |
+------+-----------+-------------+----------------------------+----------------------------+---------+------------+------------+------------+------------+---------------+
7 rows in set (0.00 sec)

root@mysql 17:47:  [performance_schema]> select * from clone_status;
+------+------+-----------+-------------------------+-------------------------+----------------+------------------------+----------+---------------+-------------+-----------------+---------------+
| ID   | PID  | STATE     | BEGIN_TIME              | END_TIME                | SOURCE         | DESTINATION            | ERROR_NO | ERROR_MESSAGE | BINLOG_FILE | BINLOG_POSITION | GTID_EXECUTED |
+------+------+-----------+-------------------------+-------------------------+----------------+------------------------+----------+---------------+-------------+-----------------+---------------+
|    1 |   11 | Completed | 2020-12-27 17:42:02.383 | 2020-12-27 17:43:03.065 | 127.0.0.1:3306 | /data/mysql/clone_dir/ |        0 |               |             |               0 |               |
+------+------+-----------+-------------------------+-------------------------+----------------+------------------------+----------+---------------+-------------+-----------------+---------------+
1 row in set (0.01 sec)

3.3 基于clone建立复制

  克隆插件支持复制。除了克隆数据之外,克隆操作还从捐赠者提取复制位点并将其传递给接收者,从而可以使用克隆插件来配置组复制成员和副本。与复制大量事务相比,使用克隆插件进行配置要快得多,效率也更高。在克隆操作期间,二进制日志位置(文件名,偏移量)和 gtid_executed提取GTID集,并将其从捐赠者MySQL服务器实例传输到接收者。此数据允许在复制流中的一致位置启动复制。二进制日志和中继日志(保存在文件中)不会从捐赠者复制到收件人。要启动复制,在克隆数据的时间和开始复制的时间之间,不能清除接收者追赶捐赠者所需的二进制日志。如果所需的二进制日志不可用,则会报告复制握手错误。因此,应将克隆的实例添加到复制组中,而不会产生过多的延迟,以避免清除必需的二进制日志或新成员明显滞后。还可以将组复制成员配置为使用克隆插件作为分布式恢复的选项,在这种情况下,加入成员会自动选择最有效的方式从现有组成员中检索组数据。

root@mysql 17:57:  [(none)]> SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;
+---------------+-----------------+
| BINLOG_FILE   | BINLOG_POSITION |
+---------------+-----------------+
| binlog.000014 |            1459 |
+---------------+-----------------+
1 row in set (0.00 sec)

root@mysql 17:57:  [(none)]> SELECT @@GLOBAL.GTID_EXECUTED;
+---------------------------------------------------------------------------------------+
| @@GLOBAL.GTID_EXECUTED                                                                |
+---------------------------------------------------------------------------------------+
| 594f981f-43ac-11eb-abbb-00163e0c8a51:1-2101,
8e07f60e-4812-11eb-b202-00163e0c8a51:1-6 |
+---------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
CHANGE MASTER TO MASTER_HOST ='127.0.0.1',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_PORT=3306,MASTER_AUTO_POSITION = 1;

  在MySQL 8.0中,默认情况下,复制元数据存储库保存在表中,这些表在克隆操作期间从捐赠者复制到接收者。复制元数据存储库包含与复制相关的配置设置,可用于在克隆操作之后正确地恢复复制。

  • 在MySQL 8.0.17和8.0.18中,仅mysql.slave_master_info复制表 (连接元数据存储库)。
  • 从MySQL 8.0.19,还复制了表mysql.slave_relay_log_info(应用程序元数据存储库)和表 (应用程序 mysql.slave_worker_info工作者元数据存储库)。
      对于基于GTID的复制,如果接收者被配置有 gtid_mode=ON和已经从捐赠者克隆与 gtid_mode=ON, ON_PERMISSIVE或 OFF_PERMISSIVE,将 gtid_executed来自捐赠者GTID集在接收方应用。如果接收者是从副本已经在拓扑克隆,接收者的复制渠道GTID使用自动定位(由指定 MASTER_AUTO_POSITION的选项 CHANGE MASTER TO 语句)可以在通道启动克隆操作后自动恢复复制。如果您只想使用这些相同的通道,则无需执行任何手动设置。
      对于基于二进制日志文件位置的复制,如果接收者位于MySQL 8.0.17或8.0.18,则来自捐赠者的二进制日志位置不会应用于接收者,仅记录在clone_status表中。因此,必须手动设置使用二进制日志文件基于位置的复制的接收者上的复制通道,以在克隆操作后恢复复制。确保这些通道没有配置为在服务器启动时自动启动复制,因为它们还没有二进制日志位置,并尝试从头开始复制。
      对于基于二进制日志文件位置的复制,如果接收者使用的是MySQL 8.0.19或更高版本,则将来自捐赠者的二进制日志位置应用于接受者。接收者上使用基于二进制日志文件位置的复制的复制通道在重新启动复制之前,会使用克隆的中继日志信息自动尝试执行中继日志恢复过程。对于单线程副本(slave_parallel_workers 设置为0),中继日志恢复应该在没有其他问题的情况下成功完成,从而使通道无需进一步设置即可恢复复制。对于多线程副本(slave_parallel_workers 大于0),则中继日志恢复很可能会失败,因为它通常无法自动完成。在这种情况下,将发出错误消息,并且您必须手动设置通道。

四、clone运维相关

4.1 相关文件

  克隆数据后,将创建以下目录和文件以供内部使用。它们不应该被修改。
#clone:包含克隆操作使用的内部克隆文件。在要克隆数据的目录中创建。
#ib_archive:包含内部存档的日志文件,该日志文件在克隆操作期间存档在捐赠者上。
*.#clone files:当现有数据目录被远程克隆操作替换时,在收件人上创建的临时数据文件。

4.2 故障处理

  • 采取备用锁定来阻止DDL操作。
  • 如果克隆操作在clone_ddl_timeout 变量指定的时限内无法获得DDL锁定 ,则会报告错误。
  • 在将数据克隆到接收者数据目录之前,将删除收件人上用户创建的数据和二进制日志。
  • 在远程克隆操作期间从接收者中删除用户创建的数据时,接收者数据目录中的现有数据不会保存,并且如果发生故障可能会丢失。如果要替换接收者上的数据很重要,则应在启动远程克隆操作之前进行备份。警告会打印到服务器错误日志中,以指定何时开始和结束数据删除:
[Warning] [MY-013453] [InnoDB] Clone removing all user data for provisioning:
Started...
[Warning] [MY-013453] [InnoDB] Clone removing all user data for provisioning:
Finished

  如果在删除数据时发生故障,则在克隆操作之前,接收者可能会剩下一部分模式,表和表空间。在执行克隆操作期间或发生故障之后的任何时间,服务器始终处于一致状态。
  从捐赠者克隆数据。克隆了用户创建的数据,字典元数据和其他系统数据。如果在克隆数据时发生故障,则回滚克隆操作并删除所有克隆的数据。在此阶段,还删除了接受者上先前存在的数据,这使接收者没有用户数据。
  如果发生这种情况,可以纠正故障原因并重新执行克隆操作,也可以放弃克隆操作并从克隆操作之前进行的备份中还原接收者数据。
  服务器自动重新启动(适用于不克隆到命名目录的远程克隆操作)。在启动期间,将执行典型的服务器启动任务。如果服务器自动重启失败,则可以手动重启服务器以完成克隆操作。
  如果在克隆操作期间发生网络错误,并且在五分钟内解决了错误,则操作将恢复。否则,该操作将中止并返回错误。

4.3 clone监控

  接收者使用clone_status和 clone_progress表来监视克隆操作

  • clone_status表提供了当前或上次执行的克隆操作的状态。克隆操作有四种可能的状态: Not Started,In Progress,Completed,和 Failed。
  • clone_progress表按阶段提供了当前或上次执行的克隆操作的进度信息。克隆操作的各个阶段包括DROP DATA, FILE COPY, PAGE_COPY, REDO_COPY, FILE_SYNC,RESTART,和RECOVERY。

  捐赠者需要通过Performance Schema下的事件表进行监控

  • stage/innodb/clone (file copy):指示克隆操作的文件复制阶段的进度。 WORK_ESTIMATED和 WORK_COMPLETED单位是文件块。在文件复制阶段开始时就知道要传输的文件数,并且基于文件数来估计块数。 WORK_ESTIMATED设置为估计的文件块数。WORK_COMPLETED 发送每个块后更新。

  • stage/innodb/clone (page copy):指示克隆操作的页面复制阶段的进度。WORK_ESTIMATED和 WORK_COMPLETED单位是页面。一旦完成文件复制阶段,就知道要传输的页数,并将 WORK_ESTIMATED其设置为该值。 WORK_COMPLETED发送每页后更新。

  • stage/innodb/clone (redo copy):指示克隆操作的重做复制阶段的进度。WORK_ESTIMATED和 WORK_COMPLETED单位是重做块。一旦页面复制阶段完成,就知道要传输的重做块的数量,并将 WORK_ESTIMATED其设置为该值。 WORK_COMPLETED发送每个块后更新。

UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/clone%';
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
root@mysql 18:30:  [(none)]> SELECT * FROM performance_schema.setup_instruments WHERE  NAME LIKE '%clone%';
+----------------------------------------------+---------+-------+------------+------------+---------------+
| NAME                                         | ENABLED | TIMED | PROPERTIES | VOLATILITY | DOCUMENTATION |
+----------------------------------------------+---------+-------+------------+------------+---------------+
| wait/synch/mutex/innodb/clone_snapshot_mutex | NO      | NO    |            |          0 | NULL          |
| wait/synch/mutex/innodb/clone_sys_mutex      | NO      | NO    |            |          0 | NULL          |
| wait/synch/mutex/innodb/clone_task_mutex     | NO      | NO    |            |          0 | NULL          |
| wait/io/file/innodb/innodb_clone_file        | YES     | YES   |            |          0 | NULL          |
| stage/innodb/clone (file copy)               | YES     | YES   | progress   |          0 | NULL          |
| stage/innodb/clone (redo copy)               | YES     | YES   | progress   |          0 | NULL          |
| stage/innodb/clone (page copy)               | YES     | YES   | progress   |          0 | NULL          |
| statement/abstract/clone                     | YES     | YES   | mutable    |          0 | NULL          |
| statement/clone/local                        | YES     | YES   |            |          0 | NULL          |
| statement/clone/client                       | YES     | YES   |            |          0 | NULL          |
| statement/clone/server                       | YES     | YES   |            |          0 | NULL          |
| memory/innodb/clone                          | YES     | NULL  |            |          0 | NULL          |
| memory/clone/data                            | YES     | NULL  |            |          0 | NULL          |
+----------------------------------------------+---------+-------+------------+------------+---------------+
13 rows in set (0.00 sec)
root@mysql 18:27:  [performance_schema]> SELECT EVENT_NAME,WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history WHERE EVENT_NAME LIKE 'stage/innodb/clone%';
+--------------------------------+----------------+----------------+
| EVENT_NAME                     | WORK_COMPLETED | WORK_ESTIMATED |
+--------------------------------+----------------+----------------+
| stage/innodb/clone (file copy) |           1077 |           1077 |
| stage/innodb/clone (page copy) |              0 |              0 |
| stage/innodb/clone (redo copy) |              1 |              1 |
+--------------------------------+----------------+----------------+
3 rows in set (0.00 sec)
root@mysql 18:29:  [(none)]> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_current WHERE EVENT_NAME LIKE 'stage/innodb/clone%';
+--------------------------------+----------------+----------------+
| EVENT_NAME                     | WORK_COMPLETED | WORK_ESTIMATED |
+--------------------------------+----------------+----------------+
| stage/innodb/clone (file copy) |            520 |           1077 |
+--------------------------------+----------------+----------------+
1 row in set (0.01 sec)

相关等待事件:

  • wait/synch/mutex/innodb/clone_snapshot_mutex:跟踪克隆快照互斥锁的等待事件,该事件在多个克隆线程之间同步对动态快照对象(在施主和受主上)的访问。
  • wait/synch/mutex/innodb/clone_sys_mutex:跟踪克隆sys互斥锁的等待事件。MySQL服务器实例中有一个克隆系统对象。此互斥锁同步对供体和收件人上的克隆系统对象的访问。它是由克隆线程以及其他前台和后台线程获取的。
  • wait/synch/mutex/innodb/clone_task_mutex:跟踪克隆任务互斥锁的等待事件,该事件用于克隆任务管理。该 clone_task_mutex被克隆的线程收购。
  • wait/io/file/innodb/innodb_clone_file:跟踪克隆所操作的文件的所有I / O等待操作。

4.4 clone插件限制

  • 克隆操作期间不允许使用 DDL。允许并发DML。
  • 无法从其他MySQL服务器版本或发行版克隆实例。捐赠者和接受者必须具有完全相同的MySQL服务器版本和发行版。例如,无法在MySQL 5.7和MySQL 8.0之间或MySQL 8.0.19和MySQL 8.0.20之间进行克隆。仅MySQL 8.0.17及更高版本支持clone插件。
  • 一次只能克隆一个MySQL实例。不支持在单个克隆操作中克隆多个MySQL实例。
  • mysqlx_port远程克隆操作(在CLONE INSTANCE语句中指定施主MySQL服务器实例的端口号时)不支持 由指定的X协议端口 。
  • clone插件不支持MySQL服务器配置的克隆。。
  • clone插件不支持二进制日志的克隆。
  • clone插件仅克隆存储在中的数据 InnoDB。其他存储引擎数据未克隆。MyISAM和 CSV存储在任何架构,包括表sys架构中克隆为空表。
  • 不支持通过MySQL router连接到捐赠者MySQL服务器实例。
  • 本地克隆操作不支持克隆使用绝对路径创建的常规表空间。与源表空间文件具有相同路径的克隆表空间文件将导致冲突。

猜你喜欢

转载自blog.csdn.net/qq_42979842/article/details/111771339