#### 5.6.7.3 克隆远程数据

[](<>)

克隆插件支持以下用于克隆远程数据的语法；也就是说，从远程 MySQL 服务器实例（捐助者）克隆数据并将其传输到启动克隆操作的 MySQL 实例（接收者）。

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

在哪里：

-   `*`用户`*`是捐赠者 MySQL 服务器实例上的克隆用户。

-   `*`密码`*`是个`*`用户`*`密码。

-   `*`主持人`*`是个[`主机名`](server-system-variables.html#sysvar_hostname)捐助者 MySQL 服务器实例的地址。不支持 Internet 协议版本 6 (IPv6) 地址格式。可以改为使用 IPv6 地址的别名。IPv4 地址可以按原样使用。

-   `*`港口`*`是个[`港口`](server-system-variables.html#sysvar_port)捐赠者 MySQL 服务器实例的数量。（由指定的 X 协议端口[`mysqlx_port`](x-plugin-options-system-variables.html#sysvar_mysqlx_port)不支持。也不支持通过 MySQL Router 连接到供体 MySQL 服务器实例。）

-   `数据目录 [=] '*`克隆目录`*'`是一个可选子句，用于指定要克隆的数据的收件人目录。如果您不想从收件人数据目录中删除现有的用户创建的数据（模式、表、表空间）和二进制日志，请使用此选项。需要绝对路径，并且该目录不能存在。MySQL 服务器必须具有创建目录所需的写入权限。

    当可选`数据目录 [=] '*`克隆目录`*'`如果不使用子句，则克隆操作会从收件人数据目录中删除用户创建的数据（模式、表、表空间）和二进制日志，将新数据克隆到收件人数据目录，然后自动重新启动服务器。

-   `[需要 [否] SSL]`明确指定通过网络传输克隆数据时是否使用加密连接。如果无法满足显式规范，则返回错误。如果未指定 SSL 子句，则克隆默认尝试建立加密连接，如果安全连接尝试失败，则回退到不安全的连接。无论是否指定此子句，克隆加密数据时都需要安全连接。有关详细信息，请参阅[为克隆配置加密连接](clone-plugin-remote.html#clone-plugin-remote-ssl).

笔记

默认情况下，用户创建`InnoDB`驻留在供方 MySQL 服务器实例上的数据目录中的表和表空间被克隆到接收方 MySQL 服务器实例上的数据目录中。如果`数据目录 [=] '*`克隆目录`*'`子句被指定，它们被克隆到指定目录。

用户创建`InnoDB`驻留在供方 MySQL 服务器实例上的数据目录之外的表和表空间被克隆到接收方 MySQL 服务器实例上的相同路径。如果表或表空间已存在，则会报告错误。

默认情况下，`InnoDB`系统表空间、重做日志和撤消表空间被克隆到施主上配置的相同位置（由[`innodb_data_home_dir`](innodb-parameters.html#sysvar_innodb_data_home_dir)和[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path),[`innodb_log_group_home_dir`](innodb-parameters.html#sysvar_innodb_log_group_home_dir)， 和[`innodb_undo_directory`](innodb-parameters.html#sysvar_innodb_undo_directory)， 分别）。如果`数据目录 [=] '*`克隆目录`*'`子句被指定，那些表空间和日志被克隆到指定的目录。

##### 远程克隆先决条件

[](<>)

要执行克隆操作，克隆插件必须在捐赠者和接受者 MySQL 服务器实例上都处于活动状态。有关安装说明，请参阅[第 5.6.7.1 节，“安装克隆插件”](clone-plugin-installation.html).

执行克隆操作需要捐助者和接收者上的 MySQL 用户（“克隆用户”）。

-   在捐赠者上，克隆用户需要[`BACKUP_ADMIN`](privileges-provided.html#priv_backup-admin)在克隆操作期间访问和传输来自捐赠者的数据并阻止并发 DDL 的特权。克隆操作期间的并发 DDL 在 MySQL 8.0.27 之前的供体上被阻止。从 MySQL 8.0.27 开始，默认情况下，捐助者上允许并发 DDL。看[第 5.6.7.4 节，“克隆和并发 DDL”](clone-plugin-concurrent-ddl.html).

-   在收件人上，克隆用户需要[`CLONE_ADMIN`](privileges-provided.html#priv_clone-admin)用于替换收件人数据、在克隆操作期间阻止收件人上的 DDL 以及自动重新启动服务器的权限。这[`CLONE_ADMIN`](privileges-provided.html#priv_clone-admin)特权包括[`BACKUP_ADMIN`](privileges-provided.html#priv_backup-admin)和[`关掉`](privileges-provided.html#priv_shutdown)隐含的特权。

    创建克隆用户和授予所需权限的说明包含在遵循此先决条件信息的远程克隆示例中。

    下列先决条件被检查时[`克隆实例`](clone.html)执行语句：

-   MYSQL 8.0.17 及更高版本支持克隆插件。捐赠者和接受者必须是相同的 MySQL 服务器版本和发行版。要确定 MySQL 服务器版本和发行版，请发出以下查询：

    ```
    mysql> SHOW VARIABLES LIKE 'version';
     +---------------+--------+
    | Variable_name | Value  |
    +---------------+--------+
    | version       | 8.0.17 |
    +---------------+--------+
    ```

    从 MySQL 8.0.26 开始，支持从供体 MySQL 服务器实例克隆到相同版本和发行版的修补程序 MySQL 服务器实例。

-   捐赠者和接受者 MySQL 服务器实例必须在相同的操作系统和平台上运行。例如，如果捐赠者实例在 Linux 64 位平台上运行，那么接受者实例也必须在该平台上运行。有关如何确定您的操作系统平台的信息，请参阅您的操作系统文档。

-   收件人必须有足够的磁盘空间来存放克隆数据。默认情况下，在克隆捐赠者数据之前，用户创建的数据（模式、表、表空间）和二进制日志会在接收者上删除，因此您只需为捐赠者数据提供足够的空间。如果您使用`数据目录`子句，您必须有足够的磁盘空间来存放现有的收件人数据和克隆的数据。您可以通过检查文件系统上的数据目录大小以及驻留在数据目录之外的任何表空间的大小来估计数据的大小。在估计捐赠者的数据大小时，请记住只有`InnoDB`数据被克隆。如果您将数据存储在其他存储引擎中，请相应地调整您的数据大小估计。

-   `InnoDB`允许在数据目录之外创建一些表空间类型。如果施主 MySQL 服务器实例具有驻留在数据目录之外的表空间，则克隆操作必须能够访问这些表空间。您可以查询[`INFORMATION_SCHEMA.FILES`](information-schema-files-table.html)table 来标识驻留在数据目录之外的表空间。驻留在数据目录之外的文件具有指向数据目录以外的目录的完全限定路径。

    ```
    mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES;
    ```

-   在捐赠者上处于活动状态的插件，包括任何密钥环插件，也必须在接收者上处于活动状态。您可以通过发出[`显示插件`](show-plugins.html)声明或通过查询[`INFORMATION_SCHEMA.PLUGINS`](information-schema-plugins-table.html)桌子。

-   捐赠者和接受者必须具有相同的 MySQL 服务器字符集和排序规则。有关 MySQL 服务器字符集和排序规则配置的信息，请参阅[第 10.15 节，“字符集配置”](charset-configuration.html).

-   相同[`innodb_page_size`](innodb-parameters.html#sysvar_innodb_page_size)和[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path)需要对捐赠者和接受者进行设置。这[`innodb_data_file_path`](innodb-parameters.html#sysvar_innodb_data_file_path)捐赠者和接受者的设置必须指定相同数量的相同大小的数据文件。您可以使用检查变量设置[`显示变量`](show-variables.html)句法。

    ```
    mysql> SHOW VARIABLES LIKE 'innodb_page_size';
    mysql> SHOW VARIABLES LIKE 'innodb_data_file_path';
    ```

-   如果克隆加密或页面压缩的数据，供者和接收者必须具有相同的文件系统块大小。对于页面压缩数据，接收方文件系统必须支持稀疏文件和打孔，以便在接收方上进行打孔。有关这些功能以及如何识别使用它们的表和表空间的信息，请参阅[第 5.6.7.5 节，“克隆加密数据”](clone-plugin-encrypted-data.html)， 和[第 5.6.7.6 节，“克隆压缩数据”](clone-plugin-compressed-data.html).要确定您的文件系统块大小，请参阅您的操作系统文档。

-   如果要克隆加密数据，则需要安全连接。看[为克隆配置加密连接](clone-plugin-remote.html#clone-plugin-remote-ssl).

-   这[`clone_valid_donor_list`](clone-plugin-options-variables.html#sysvar_clone_valid_donor_list)接收者的设置必须包括捐赠者 MySQL 服务器实例的主机地址。您只能从有效捐赠者列表中的主机克隆数据。一个 MySQL 用户[`SYSTEM_VARIABLES_ADMIN`](privileges-provided.html#priv_system-variables-admin)配置此变量需要权限。设置说明[`clone_valid_donor_list`](clone-plugin-options-variables.html#sysvar_clone_valid_donor_list)本节后面的远程克隆示例中提供了变量。你可以检查[`clone_valid_donor_list`](clone-plugin-options-variables.html#sysvar_clone_valid_donor_list)设置使用[`显示变量`](show-variables.html)句法。

    ```
    mysql> SHOW VARIABLES LIKE 'clone_valid_donor_list';
    ```

-   不得有其他克隆操作正在运行。一次只允许进行一次克隆操作。要确定克隆操作是否正在运行，请查询[`克隆状态`](performance-schema-clone-status-table.html)桌子。看[使用性能模式克隆表监控克隆操作](clone-plugin-monitoring.html#clone-plugin-monitoring-performance-schema-clone-tables).

-   克隆插件以 1MB 数据包和元数据传输数据。最低要求[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)因此，在捐赠者和接受者 MySQL 服务器实例上的值为 2MB。一种[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)小于 2MB 的值会导致错误。使用以下查询检查您的[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)环境：

    ```
    mysql> SHOW VARIABLES LIKE 'max_allowed_packet';
    ```

    以下先决条件也适用：

-   施主上的撤消表空间文件名必须是唯一的。当数据被克隆到接收者时，撤消表空间，无论它们在捐助者上的位置如何，都被克隆到[`innodb_undo_directory`](innodb-parameters.html#sysvar_innodb_undo_directory)收件人上的位置或由收件人指定的目录`数据目录 [=] '*`克隆目录`*'`子句，如果使用的话。由于这个原因，不允许在施主上使用重复的撤消表空间文件名。从 MySQL 8.0.18 开始，如果在克隆操作期间遇到重复的 undo 表空间文件名，则会报告错误。在 MySQL 8.0.18 之前，克隆具有相同文件名的撤消表空间可能会导致撤消表空间文件在接收方上被覆盖。

    要查看施主上的撤消表空间文件名以确保它们是唯一的，请查询[`INFORMATION_SCHEMA.FILES`](information-schema-files-table.html)：

    ```
    mysql> SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES
           WHERE FILE_TYPE LIKE 'UNDO LOG';
    ```

    有关删除和添加撤消表空间文件的信息，请参阅[第 15.6.3.4 节，“撤消表空间”](innodb-undo-tablespaces.html).

-   默认情况下，克隆数据后，接收方 MySQL 服务器实例会自动重新启动（停止和启动）。要发生自动重启，接收方必须有一个监控进程来检测服务器关闭。否则，在克隆数据后，克隆操作将停止并出现以下错误，并且接收 MySQL 服务器实例将关闭：

    ```
    ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
    ```

    此错误并不表示克隆失败。这意味着在克隆数据后，必须手动重新启动接收方 MySQL 服务器实例。手动启动服务器后，您可以连接到接收方 MySQL 服务器实例并检查 Performance Schema 克隆表以验证克隆操作是否成功完成（请参阅[使用性能模式克隆表监控克隆操作](clone-plugin-monitoring.html#clone-plugin-monitoring-performance-schema-clone-tables)。） 这[`重新开始`](restart.html)声明具有相同的监控过程要求。有关详细信息，请参阅[第 13.7.8.8 节，“RESTART 语句”](restart.html).如果使用`数据目录`子句，因为在这种情况下不执行自动重启。

-   几个变量控制远程克隆操作的各个方面。在执行远程克隆操作之前，请查看变量并根据需要调整设置以适应您的计算环境。克隆变量在执行克隆操作的接收 MySQL 服务器实例上设置。看[第 5.6.7.13 节，“克隆系统变量”](clone-plugin-options-variables.html).

##### 克隆远程数据

[](<>)

以下示例演示了克隆远程数据。默认情况下，远程克隆操作会删除收件人上用户创建的数据（模式、表、表空间）和二进制日志，将新数据克隆到收件人数据目录，然后重新启动 MySQL 服务器。

该示例假定满足远程克隆先决条件。看[远程克隆先决条件](clone-plugin-remote.html#clone-remote-prerequisites).

1.  使用管理用户帐户登录到捐赠者 MySQL 服务器实例。

    1.  创建一个克隆用户[`BACKUP_ADMIN`](privileges-provided.html#priv_backup-admin)特权。

        ```
        mysql> CREATE USER 'donor_clone_user'@'example.donor.host.com' IDENTIFIED BY 'password';
        mysql> GRANT BACKUP_ADMIN on *.* to 'donor_clone_user'@'example.donor.host.com';
        ```

    2.  安装克隆插件：

        ```
        mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
        ```

2.  使用管理用户帐户登录到接收 MySQL 服务器实例。

    1.  创建一个克隆用户[`CLONE_ADMIN`](privileges-provided.html#priv_clone-admin)特权。

        ```
        mysql> CREATE USER 'recipient_clone_user'@'example.recipient.host.com' IDENTIFIED BY 'password';
        mysql> GRANT CLONE_ADMIN on *.* to 'recipient_clone_user'@'example.recipient.host.com';
        ```

    2.  安装克隆插件：

        ```
        mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
        ```

    3.  将捐赠者 MySQL 服务器实例的主机地址添加到[`clone_valid_donor_list`](clone-plugin-options-variables.html#sysvar_clone_valid_donor_list)变量设置。

        ```
        mysql> SET GLOBAL clone_valid_donor_list = 'example.donor.host.com:3306';
        ```

3.  以您之前创建的克隆用户身份登录到接收 MySQL 服务器实例 (`recipient_clone_user'@'example.recipient.host.com`) 并执行[`克隆实例`](clone.html)陈述。

    ```
    mysql> CLONE INSTANCE FROM 'donor_clone_user'@'example.donor.host.com':3306
           IDENTIFIED BY 'password';
    ```

    数据克隆完成后，接收方的 MySQL 服务器实例会自动重启。

    有关监控克隆操作状态和进度的信息，请参阅[第 5.6.7.10 节，“监控克隆操作”](clone-plugin-monitoring.html).

##### 克隆到命名目录

[](<>)

默认情况下，远程克隆操作会在从捐助 MySQL 服务器实例克隆数据之前从接收数据目录中删除用户创建的数据（模式、表、表空间）和二进制日志。通过克隆到命名目录，您可以避免从当前收件人数据目录中删除数据。

克隆到命名目录的过程与中描述的过程相同[克隆远程数据](clone-plugin-remote.html#clone-plugin-remote-example)除了一个例外：[`克隆实例`](clone.html)声明必须包括`数据目录`条款。例如：

```
mysql> CLONE INSTANCE FROM 'user'@'example.donor.host.com':3306
       IDENTIFIED BY 'password'
       DATA DIRECTORY = '/path/to/clone_dir';
```

需要绝对路径，并且该目录不能存在。MySQL 服务器必须具有创建目录所需的写入权限。

克隆到命名目录时，克隆数据后，接收 MySQL 服务器实例不会自动重新启动。如果要在命名目录上重新启动 MySQL 服务器，则必须手动执行此操作：

```
$> mysqld_safe --datadir=/path/to/clone_dir
```

在哪里*`/path/to/clone_dir`*是收件人指定目录的路径。

##### 为克隆配置加密连接

[](<>)

您可以为远程克隆操作配置加密连接，以在通过网络克隆数据时保护数据。克隆加密数据时，默认需要加密连接。（看[第 5.6.7.5 节，“克隆加密数据”](clone-plugin-encrypted-data.html).)

以下说明描述了如何配置接收 MySQL 服务器实例以使用加密连接。假设捐赠者 MySQL 服务器实例已配置为使用加密连接。如果没有，请参考[第 6.3.1 节，“配置 MySQL 以使用加密连接”](using-encrypted-connections.html)用于服务器端配置说明。

要将接收方 MySQL 服务器实例配置为使用加密连接：

1.  使捐助者 MySQL 服务器实例的客户端证书和密钥文件对接收者主机可用。使用安全通道将文件分发到接收主机，或者将它们放置在接收主机可访问的已安装分区上。要提供的客户端证书和密钥文件包括：

    -   `卡佩姆`

        自签名证书颁发机构 (CA) 文件。

    -   `客户端-cert.pem`

        客户端公钥证书文件。

    -   `客户端密钥.pem`

        客户端私钥文件。

2.  在接收 MySQL 服务器实例上配置以下 SSL 选项。

    -   [`clone_ssl_ca`](clone-plugin-options-variables.html#sysvar_clone_ssl_ca)

        指定自签名证书颁发机构 (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)

        指定客户端私钥文件的路径。

        例如：

    ```
    clone_ssl_ca=/path/to/ca.pem
    clone_ssl_cert=/path/to/client-cert.pem
    clone_ssl_key=/path/to/client-key.pem
    ```

3.  要要求使用加密连接，请包括`需要 SSL`签发时的条款[`克隆`](clone.html)收件人的声明。

    ```
    mysql> CLONE INSTANCE FROM 'user'@'example.donor.host.com':3306
           IDENTIFIED BY 'password'
           DATA DIRECTORY = '/path/to/clone_dir'
           REQUIRE SSL;
    ```

    如果未指定 SSL 子句，则克隆插件默认尝试建立加密连接，如果加密连接尝试失败，则回退到未加密连接。

    笔记

    如果您正在克隆加密数据，默认情况下需要加密连接，无论是否`需要 SSL`条款被指定。使用`不需要 SSL`如果您尝试克隆加密数据，则会导致错误。
