#### 18.5.4.2 用于分布式恢复的克隆

MySQL 服务器的克隆插件可从 MySQL 8.0.17 获得。如果要在群组中使用远程克隆操作进行分布式恢复，则必须预先设置现有成员和加入成员以支持该功能。如果不想在组中使用此功能，请不要设置，在这种情况下，Group Replication 仅使用二进制日志中的状态传输。

要使用克隆，必须预先设置至少一个现有组成员和加入成员以支持远程克隆操作。作为最低要求，您必须在捐赠者和加入成员上安装克隆插件，授予[`BACKUP_ADMIN`](privileges-provided.html#priv_backup-admin)复制用户的分布式恢复权限，并设置[`group_replication_clone_threshold`](group-replication-options.html#sysvar_group_replication_clone_threshold)系统变量到适当的水平。为确保捐赠者的​​最大可用性，建议设置所有当前和未来的组成员以支持远程克隆操作。

请注意，在从捐赠者传输数据之前，远程克隆操作会从加入成员中删除用户创建的表空间和数据。如果操作在进行中停止，加入成员可能会留下部分数据或没有数据。这可以通过重试远程克隆操作来修复，组复制会自动执行该操作。

##### 18.5.4.2.1 克隆的先决条件

有关设置和配置克隆插件的完整说明，请参阅[第 5.6.7 节，“克隆插件”](clone-plugin.html).远程克隆操作的详细先决条件包含在[第 5.6.7.3 节，“克隆远程数据”](clone-plugin-remote.html).对于 Group Replication，请注意以下关键点和区别：

-   捐赠者（现有组成员）和接收者（加入成员）必须安装并激活克隆插件。有关执行此操作的说明，请参阅[第 5.6.7.1 节，“安装克隆插件”](clone-plugin-installation.html).

-   捐赠者和接受者必须在相同的操作系统上运行，并且必须具有相同的 MySQL Server 版本（必须是 MySQL 8.0.17 或更高版本才能支持克隆插件）。因此，克隆不适用于成员运行不同 MySQL 服务器版本的组。

-   捐赠者和接受者必须安装并激活 Group Replication 插件，并且捐赠者上活动的任何其他插件（例如密钥环插件）也必须在接受者上处于活动状态。

-   如果分布式恢复配置为使用 SSL ([`group_replication_recovery_use_ssl=ON`](group-replication-options.html#sysvar_group_replication_recovery_use_ssl))，组复制将此设置应用于远程克隆操作。组复制自动配置克隆 SSL 选项的设置 ([`clone_ssl_ca`](clone-plugin-options-variables.html#sysvar_clone_ssl_ca),[`clone_ssl_cert`](clone-plugin-options-variables.html#sysvar_clone_ssl_cert)， 和[`clone_ssl_key`](clone-plugin-options-variables.html#sysvar_clone_ssl_key)) 以匹配相应组复制分布式恢复选项的设置 ([`group_replication_recovery_ssl_ca`](group-replication-options.html#sysvar_group_replication_recovery_ssl_ca),[`group_replication_recovery_ssl_cert`](group-replication-options.html#sysvar_group_replication_recovery_ssl_cert)， 和[`group_replication_recovery_ssl_key`](group-replication-options.html#sysvar_group_replication_recovery_ssl_key)）。

-   您无需在[`clone_valid_donor_list`](clone-plugin-options-variables.html#sysvar_clone_valid_donor_list)用于加入复制组的系统变量。在从现有组成员中选择捐赠者后，组复制会自动为您配置此设置。请注意，远程克隆操作使用服务器的 SQL 协议主机名和端口。

-   克隆插件有许多系统变量来管理远程克隆操作的网络负载和性能影响。组复制不配置这些设置，因此您可以查看它们并根据需要进行设置，或者允许它们默认设置。请注意，当远程克隆操作用于分布式恢复时，克隆插件的[`clone_enable_compression`](clone-plugin-options-variables.html#sysvar_clone_enable_compression)设置应用于操作，而不是组复制压缩设置。

-   为了在接收者上调用远程克隆操作，组复制使用内部`mysql.session`用户，已经拥有[`CLONE_ADMIN`](privileges-provided.html#priv_clone-admin)特权，因此您无需进行设置。

-   作为远程克隆操作的供体上的克隆用户，组复制使用您为分布式恢复设置的复制用户（在[第 18.2.1.3 节，“分布式恢复的用户凭证”](group-replication-user-credentials.html)）。因此，您必须给出[`BACKUP_ADMIN`](privileges-provided.html#priv_backup-admin)此复制用户对所有支持克隆的组成员的权限。当您为组复制配置复制用户时，还要授予复制用户加入成员的权限，因为他们可以在加入组后充当捐赠者。同一复制用户用于每个组成员的分布式恢复。要将此权限授予现有成员上的复制用户，您可以在禁用二进制日志记录的情况下单独对每个组成员发出此语句，或者在启用二进制日志记录的一个组成员上发出此语句：

    ```
    GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
    ```

-   如果你使用[`开始 GROUP_REPLICATION`](start-group-replication.html)在以前提供用户凭据的服务器上指定复制用户凭据，使用[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)，请确保在进行任何远程克隆操作之前从复制元数据存储库中删除用户凭据。还要确保[`group_replication_start_on_boot=OFF`](group-replication-options.html#sysvar_group_replication_start_on_boot)设置在加入成员上。有关说明，请参阅[第 18.6.3 节，“保护分布式恢复连接”](group-replication-distributed-recovery-securing.html).如果您不取消设置用户凭据，它们将在远程克隆操作期间转移到加入成员。这`group_replication_recovery`然后，可能会在原始成员或从中克隆的成员上无意中使用存储的凭据启动通道。在服务器启动时（包括在远程克隆操作之后）自动启动组复制将使用存储的用户凭据，如果操作员未在服务器上指定分布式恢复凭据，也会使用它们。[`开始 GROUP_REPLICATION`](start-group-replication.html)命令。

##### 18.5.4.2.2 克隆阈值

当组成员设置为支持克隆时，[`group_replication_clone_threshold`](group-replication-options.html#sysvar_group_replication_clone_threshold)系统变量指定一个阈值，表示为事务数，用于分布式恢复中的远程克隆操作。如果捐助者上的交易和加入成员上的交易之间的差距大于这个数字，那么在技术上可行的情况下，将使用远程克隆操作将状态转移到加入成员。Group Replication 计算是否超过阈值[`gtid_executed`](replication-options-gtids.html#sysvar_gtid_executed)现有组成员的集合。在出现较大事务间隙时使用远程克隆操作可以让您向组中添加新成员，而无需事先手动将组的数据传输到服务器，并且还可以使非常过时的成员更有效地赶上。

的默认设置[`group_replication_clone_threshold`](group-replication-options.html#sysvar_group_replication_clone_threshold)Group Replication 系统变量非常高（GTID 中事务的最大允许序列号），因此它有效地停用了从二进制日志进行状态传输的任何地方的克隆。要使 Group Replication 能够在更合适的情况下为状态传输选择远程克隆操作，请设置系统变量以指定许多事务作为您希望克隆发生的事务间隙。

警告

不要使用低设置[`group_replication_clone_threshold`](group-replication-options.html#sysvar_group_replication_clone_threshold)在一个活跃的群体中。如果在进行远程克隆操作时，组中发生了超过阈值的事务数，则加入的成员在重新启动后会再次触发远程克隆操作，并且可以无限期地继续此操作。为避免这种情况，请确保将阈值设置为高于在远程克隆操作所用时间期间您预期组中发生的事务数。

当无法从捐赠者的二进制日志传输状态时，组复制会尝试执行远程克隆操作，而不考虑您的阈值，例如，因为加入成员所需的事务在任何现有组成员的二进制日志中都不可用。组复制根据[`gtid_purged`](replication-options-gtids.html#sysvar_gtid_purged)现有组成员的集合。您不能使用[`group_replication_clone_threshold`](group-replication-options.html#sysvar_group_replication_clone_threshold)当所需的事务在任何成员的二进制日志文件中不可用时，系统变量会停用克隆，因为在这种情况下，克隆是手动将数据传输到加入成员的唯一替代方法。

##### 18.5.4.2.3 克隆操作

为克隆设置组成员和加入成员时，组复制会为您管理远程克隆操作。远程克隆操作可能需要一些时间才能完成，具体取决于数据的大小。看[第 5.6.7.10 节，“监控克隆操作”](clone-plugin-monitoring.html)有关监控过程的信息。

笔记

状态转移完成后，Group Replication 会重新启动加入成员以完成该过程。如果[`group_replication_start_on_boot=OFF`](group-replication-options.html#sysvar_group_replication_start_on_boot)在加入成员上设置，例如因为您在[`开始 GROUP_REPLICATION`](start-group-replication.html)声明，您必须发出[`开始 GROUP_REPLICATION`](start-group-replication.html)重新启动后再次手动。如果[`group_replication_start_on_boot=ON`](group-replication-options.html#sysvar_group_replication_start_on_boot)以及启动组复制所需的其他设置在配置文件中设置或使用`设置坚持`声明，您无需干预，该过程会自动继续以使加入的成员联机。

如果远程克隆过程需要很长时间，在 MySQL 8.0.22 之前的版本中，在此期间为组累积的证书信息集可能变得太大而无法传输给加入成员。在这种情况下，加入的成员会记录一条错误消息并且不会加入该组。从 MySQL 8.0.22 开始，Group Replication 以不同方式管理应用事务的垃圾收集过程以避免这种情况。在早期版本中，如果您确实看到此错误，则在远程克隆操作完成后，请等待两分钟以允许进行一轮垃圾收集以减少组的认证信息的大小。然后对加入的成员发出以下语句，使其停止尝试应用之前的一组认证信息：

```
RESET SLAVE FOR CHANNEL group_replication_recovery;
Or from MySQL 8.0.22:
RESET REPLICA FOR CHANNEL group_replication_recovery;
```

远程克隆操作克隆保存在表中的设置，从捐赠者到接受者，以及数据。组复制管理与组复制通道特别相关的设置。保留在配置文件中的组复制成员设置（例如组复制本地地址）不会克隆，也不会在加入成员上更改。Group Replication 还保留了与 SSL 的使用相关的通道设置，因此这些设置对于单个成员来说是唯一的。

如果捐助者使用的复制用户凭据用于`group_replication_recovery`复制通道已使用[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)声明，它们在克隆后转移给加入成员并由加入成员使用，并且它们必须在那里有效。使用存储的凭据，通过远程克隆操作接收状态传输的所有组成员因此会自动接收复制用户和密码以进行分布式恢复。如果您在[`开始 GROUP_REPLICATION`](start-group-replication.html)语句，这些用于启动远程克隆操作，但在克隆后不会转移给加入成员使用。如果您不希望将凭据转移到新加入者并在那里记录，请确保在远程克隆操作发生之前取消设置，如中所述[第 18.6.3 节，“保护分布式恢复连接”](group-replication-distributed-recovery-securing.html), 并使用[`开始 GROUP_REPLICATION`](start-group-replication.html)改为供应它们。

如果一个`PRIVILEGE_CHECKS_USER`帐户已用于帮助保护复制应用程序（请参阅[第 17.3.3.2 节，“组复制通道的权限检查”](replication-privilege-checks-gr.html))，从 MySQL 8.0.19 开始，`PRIVILEGE_CHECKS_USER`来自捐赠者的帐户和相关设置被克隆到加入成员。如果加入成员设置为在启动时启动组复制，它会自动使用该帐户在适当的复制通道上进行权限检查。（在 MySQL 8.0.18 中，由于一些限制，建议您不要使用`PRIVILEGE_CHECKS_USER`具有组复制通道的帐户。）

##### 18.5.4.2.4 用于其他目的的克隆

组复制启动并管理用于分布式恢复的克隆操作。已设置为支持克隆的组成员也可以参与用户手动启动的克隆操作。例如，您可能希望通过从作为捐赠者的组成员克隆来创建新的服务器实例，但您不希望新的服务器实例立即加入该组，或者可能永远不会。

在所有支持克隆的版本中，您可以手动启动克隆操作，其中涉及停止组复制的组成员。请注意，由于克隆要求捐赠者和接受者上的活动插件必须匹配，因此必须在其他服务器实例上安装并激活组复制插件，即使您不打算让该服务器实例加入组。您可以通过发出以下语句来安装插件：

```
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
```

在 MySQL 8.0.20 之前的版本中，如果操作涉及正在运行 Group Replication 的组成员，则无法手动启动克隆操作。从 MySQL 8.0.20 开始，您可以执行此操作，前提是克隆操作不会删除和替换收件人上的数据。因此，启动克隆操作的语句必须包括`数据目录`子句如果组复制正在运行。
