Documentation Home

5.6.7.3 克隆远程数据

克隆插件支持以下语法来克隆远程数据;也就是说,从远程 MySQL 服务器实例(捐赠者)克隆数据并将其传输到发起克隆操作的 MySQL 实例(接收者)。

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

在哪里:

  • user是捐赠者 MySQL 服务器实例上的克隆用户。

  • passworduser 密码。

  • hosthostname捐赠者 MySQL 服务器实例的地址。不支持 Internet 协议版本 6 (IPv6) 地址格式。可以改用 IPv6 地址的别名。可以按原样使用 IPv4 地址。

  • portport捐赠者 MySQL 服务器实例的编号。(不支持指定的X Protocol端口, mysqlx_port也不支持通过MySQL Router连接到donor MySQL服务器实例。)

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

    当不使用可选子句时,克隆操作会从接收方数据目录中删除用户创建的数据(模式、表、表空间)和二进制日志,将新数据克隆到接收方数据目录,然后自动重启服务器。 DATA DIRECTORY [=] 'clone_dir'

  • [REQUIRE [NO] SSL]明确指定在通过网络传输克隆数据时是否使用加密连接。如果不能满足显式规范,则返回错误。如果未指定 SSL 子句,则默认情况下克隆会尝试建立加密连接,如果安全连接尝试失败,则回退到不安全的连接。无论是否指定此子句,克隆加密数据时都需要安全连接。有关详细信息,请参阅 为克隆配置加密连接

笔记

默认情况下,InnoDB驻留在捐赠者 MySQL 服务器实例上的数据目录中的用户创建的表和表空间被克隆到接收者 MySQL 服务器实例上的数据目录中。如果 指定了该子句,它们将被克隆到指定的目录。 DATA DIRECTORY [=] 'clone_dir'

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

默认情况下,InnoDB系统表空间、重做日志和撤消表空间被克隆到在捐赠者上配置的相同位置(分别由 innodb_data_home_dirinnodb_data_file_pathinnodb_log_group_home_dir和定义innodb_undo_directory)。如果指定了该子句,这些表空间和日志将被克隆到指定目录。 DATA DIRECTORY [=] 'clone_dir'

远程克隆先决条件

要执行克隆操作,克隆插件必须在捐赠者和接受者 MySQL 服务器实例上都处于活动状态。有关安装说明,请参阅 第 5.6.7.1 节 “安装克隆插件”

执行克隆操作需要捐赠者和接受者的 MySQL 用户(克隆用户)。

  • 在捐赠者上,克隆用户需要 BACKUP_ADMIN在克隆操作期间访问和传输来自捐赠者的数据并阻止并发 DDL 的特权。克隆操作期间的并发 DDL 在 MySQL 8.0.27 之前的供体上被阻止。从 MySQL 8.0.27 开始,捐助者默认允许并发 DDL。请参阅 第 5.6.7.4 节,“克隆和并发 DDL”

  • 在收件人上,克隆用户需要 CLONE_ADMIN替换收件人数据、在克隆操作期间阻止收件人上的 DDL 以及自动重新启动服务器的权限。CLONE_ADMIN 特权包括 隐式 BACKUP_ADMIN特权 。SHUTDOWN

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

CLONE INSTANCE执行语句 时会检查以下先决条件 :

  • 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 位平台上运行,则接受者实例也必须在该平台上运行。有关如何确定操作系统平台的信息,请参阅操作系统文档。

  • 收件人必须有足够的磁盘空间来存储克隆的数据。默认情况下,在克隆捐赠者数据之前,用户创建的数据(模式、表、表空间)和二进制日志会在接收者上删除,因此您只需要足够的空间来容纳捐赠者数据。如果使用该DATA DIRECTORY 子句克隆到命名目录,则必须有足够的磁盘空间用于现有的收件人数据和克隆的数据。您可以通过检查文件系统上的数据目录大小和驻留在数据目录之外的任何表空间的大小来估计数据的大小。在估算捐赠者的数据大小时,请记住只有 InnoDB数据被克隆。如果您将数据存储在其他存储引擎中,请相应地调整您的数据大小估计。

  • InnoDB允许在数据目录之外创建一些表空间类型。如果供体 MySQL 服务器实例具有驻留在数据目录之外的表空间,则克隆操作必须能够访问这些表空间。您可以查询该 INFORMATION_SCHEMA.FILES 表以识别驻留在数据目录之外的表空间。驻留在数据目录之外的文件具有指向数据目录以外目录的完全限定路径。

    mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES;
  • 在捐赠者上激活的插件,包括任何密钥环插件,也必须在接收者上激活。您可以通过发出 SHOW PLUGINS语句或查询 INFORMATION_SCHEMA.PLUGINS 表来识别活动插件。

  • 捐赠者和接受者必须具有相同的 MySQL 服务器字符集和排序规则。有关 MySQL 服务器字符集和排序规则配置的信息,请参阅 第 10.15 节,“字符集配置”

  • 捐赠者和接受者需要相同的innodb_page_size 设置innodb_data_file_path 。捐助者和接受者的 innodb_data_file_path 设置必须指定相同数量的同等大小的数据文件。SHOW VARIABLES您可以使用语法 检查变量设置。

    mysql> SHOW VARIABLES LIKE 'innodb_page_size';
    mysql> SHOW VARIABLES LIKE 'innodb_data_file_path';
  • 如果克隆加密或页面压缩数据,捐赠者和接受者必须具有相同的文件系统块大小。对于页面压缩数据,收件人文件系统必须支持稀疏文件和打孔,以便在收件人上进行打孔。有关这些功能以及如何识别使用它们的表和表空间的信息,请参阅 第 5.6.7.5 节,“克隆加密数据”第 5.6.7.6 节,“克隆压缩数据”。要确定您的文件系统块大小,请参阅您的操作系统文档。

  • 如果您要克隆加密数据,则需要安全连接。请参阅 为克隆配置加密连接

  • 收件人的 clone_valid_donor_list 设置必须包括捐赠者 MySQL 服务器实例的主机地址。您只能从有效捐赠者列表中的主机克隆数据。SYSTEM_VARIABLES_ADMIN 需要具有权限的 MySQL 用户 来配置此变量。本节后面的远程克隆示例中提供了设置 clone_valid_donor_list 变量的说明。您可以 clone_valid_donor_list 使用SHOW VARIABLES语法检查设置。

    mysql> SHOW VARIABLES LIKE 'clone_valid_donor_list';
  • 不得有其他克隆操作在运行。一次只允许一个克隆操作。要确定克隆操作是否正在运行,请查询该 clone_status表。请参阅 使用性能模式克隆表监视克隆操作

  • 克隆插件以 1MB 数据包和元数据的形式传输数据。max_allowed_packet因此,在捐赠者和接受者 MySQL 服务器实例上所需的最小值 是 2MB。max_allowed_packet小于 2MB的 值会导致错误。使用以下查询检查您的 max_allowed_packet 设置:

    mysql> SHOW VARIABLES LIKE 'max_allowed_packet';

以下先决条件也适用:

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

    要查看捐赠者上的撤消表空间文件名以确保它们是唯一的,请查询 INFORMATION_SCHEMA.FILES

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

    有关删除和添加撤消表空间文件的信息,请参阅第 15.6.3.4 节,“撤消表空间”

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

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

    此错误并不表示克隆失败。这意味着在克隆数据后,必须手动重新启动接收方 MySQL 服务器实例。手动启动服务器后,您可以连接到接收方 MySQL 服务器实例并检查性能模式克隆表以验证克隆操作是否成功完成(请参阅 使用性能模式克隆表监视克隆操作。)该RESTART语句具有相同的监视过程要求. 有关详细信息,请参阅第 13.7.8.8 节,“RESTART 语句”. 如果使用该子句克隆到命名目录,则此要求不适用DATA DIRECTORY ,因为在这种情况下不会执行自动重启。

  • 几个变量控制远程克隆操作的各个方面。在执行远程克隆操作之前,请检查变量并根据需要调整设置以适应您的计算环境。克隆变量在执行克隆操作的收件人 MySQL 服务器实例上设置。请参阅 第 5.6.7.13 节,“克隆系统变量”

克隆远程数据

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

该示例假定满足远程克隆先决条件。请参阅远程克隆先决条件

  1. 使用管理用户帐户登录到供体 MySQL 服务器实例。

    1. 创建具有 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权限的克隆用户。

      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 变量设置中。

      mysql> SET GLOBAL clone_valid_donor_list = 'example.donor.host.com:3306';
  3. 以您之前创建的克隆用户身份登录到接收方 MySQL 服务器实例 ( recipient_clone_user'@'example.recipient.host.com) 并执行该 CLONE INSTANCE语句。

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

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

    有关监控克隆操作状态和进度的信息,请参阅 第 5.6.7.10 节,“监控克隆操作”

克隆到命名目录

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

克隆到指定目录的过程与 克隆远程数据中描述的过程相同,但有一个例外:该CLONE INSTANCE语句必须包含DATA DIRECTORY子句。例如:

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 节,“克隆加密数据”。)

以下说明描述了如何配置收件人 MySQL 服务器实例以使用加密连接。假定捐赠者 MySQL 服务器实例已配置为使用加密连接。如果不是,请参阅第 6.3.1 节“配置 MySQL 以使用加密连接”以获取服务器端配置说明。

将收件人 MySQL 服务器实例配置为使用加密连接:

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

    • ca.pem

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

    • client-cert.pem

      客户端公钥证书文件。

    • client-key.pem

      客户端私钥文件。

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

    例如:

    clone_ssl_ca=/path/to/ca.pem
    clone_ssl_cert=/path/to/client-cert.pem
    clone_ssl_key=/path/to/client-key.pem
  3. 要要求使用加密连接,请在向收件人 REQUIRE SSL发出声明时包含该子句 。CLONE

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

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

    笔记

    REQUIRE SSL如果您正在克隆加密数据,则无论是否指定该子句 ,默认情况下都需要加密连接。REQUIRE NO SSL如果您尝试克隆加密数据, 使用会导致错误。