Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


7.6.7.3 克隆远程数据

克隆插件支持以下语法来克隆远程数据,即从远程 MySQL 服务器实例(捐赠者)中克隆数据并将其转移到克隆操作的起始点(受益者)中的 MySQL 实例。

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

where:

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

  • passworduser 密码。

  • host 是捐赠 MySQL 服务器实例的hostname 地址。IPv6 地址格式不支持,可以使用别名代替。可以直接使用 IPv4 地址。

  • port 是捐赠 MySQL 服务器实例的port 号码。(由mysqlx_port 指定的 X 协议端口不支持。通过 MySQL 路由器连接捐赠 MySQL 服务器实例也不可行。)

  • DATA DIRECTORY [=] 'clone_dir' 是一个可选的子句,用于指定要克隆数据的目录。如果不使用这个选项,clone操作将删除目标服务器上的用户创建的数据(模式、表、表空间)和二进制日志,并自动重启服务器。需要指定绝对路径且目标服务器必须有写权限。

    如果不使用可选的 DATA DIRECTORY [=] 'clone_dir' 子句,克隆操作将删除目标服务器上的用户创建的数据(模式、表、表空间)和二进制日志,然后将新数据克隆到目标服务器上,并自动重启服务器。

  • [REQUIRE [NO] SSL] 明确指定是否使用加密连接传输克隆数据,否则返回错误。如果不指定SSL子句,clone操作将尝试建立加密连接,如果失败则降级到非安全连接。无论是否指定这个子句,clone操作都需要在克隆加密数据时使用安全连接。详见配置克隆加密连接

Note

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

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

默认情况下,InnoDB系统表空间、redo日志和undo表空间在捐赠服务器上配置的位置(由innodb_data_home_dirinnodb_data_file_pathinnodb_log_group_home_dirinnodb_undo_directory定义)被克隆到接收方服务器上。如果指定了DATA DIRECTORY [=] 'clone_dir'子句,那些表空间和日志将被克隆到指定的目录。

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

捐赠和接受 MySQL 服务器实例上都需要一个 MySQL 用户执行克隆操作(称为““clone 用户””)。

创建 clone 用户并授予所需特权的指南在后续的远程克隆示例中包括。

CLONE INSTANCE 语句执行时,检查以下前提条件:

  • 捐赠服务器和接受服务器必须是同一个 MySQL 服务系列,例如 8.4.0 和 8.4.11。要确定 MySQL 服务版本,可以执行以下查询:

    mysql> SHOW VARIABLES LIKE 'version';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | version       | 8.4.0 |
    +---------------+-------+
  • 捐赠和接受的 MySQL 服务器实例必须在相同的操作系统和平台上。例如,如果捐赠实例运行在 Linux 64 位平台,接受实例也必须运行在该平台上。请参阅您的操作系统文档,以了解如何确定您的操作系统平台。

  • 接受服务器必须有足够的磁盘空间来存储克隆数据。默认情况下,用户创建的数据(模式、表、表空间)和二进制日志在接受服务器上被删除,然后只需要足够的空间来存储捐赠数据。如果您使用 DATA DIRECTORY 子句克隆到指定目录,您必须有足够的磁盘空间来存储现有的接受数据和克隆数据。可以通过检查文件系统中的数据目录大小和外部表空间大小来估算数据大小。当估算捐赠数据时,记住只有 InnoDB 数据被克隆。如果您在其他存储引擎中存储数据,根据情况进行数据大小调整。

  • InnoDB 允许在数据目录外创建一些表空间类型。如果捐赠 MySQL 服务器实例中有位于数据目录外的表空间,那么克隆操作必须能够访问这些表空间。您可以通过查询信息_schema FILES 表来确定位于数据目录外的表空间。位于数据目录外的文件有一个完全限定路径,除非是数据目录。

    mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES;
  • 捐赠服务器上活动插件,包括任何密钥环插件,也必须在接收方上活动。您可以通过执行 SHOW PLUGINS 语句或查询信息_schema PLUGINS 表来确定活动插件。

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

  • 捐赠服务器和接收服务器必须具有相同的innodb_page_sizeinnodb_data_file_path 设置。捐赠服务器和接收服务器的innodb_data_file_path 设置必须指定相同数量的等价大小文件。你可以使用SHOW VARIABLES 语法来检查变量设置。

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

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

  • 在接收端,必须将clone_valid_donor_list设置为捐赠 MySQL 服务器实例的主机地址。只能从有效捐赠列表中克隆数据。需要SYSTEM_VARIABLES_ADMIN特权来配置该变量。关于设置clone_valid_donor_list变量的说明,请参阅后续的远程克隆示例。你可以使用SHOW VARIABLES语法来检查clone_valid_donor_list设置。

    mysql> SHOW VARIABLES LIKE 'clone_valid_donor_list';
  • 不能有其他克隆操作正在运行。一次只能进行单个克隆操作。要确定是否正在运行克隆操作,请查询clone_status表。详见

  • 克隆插件将数据传输为1MB数据包加元数据。因此,捐赠和接收方MySQL服务器实例的最小要求max_allowed_packet值是2MB。小于2MB的max_allowed_packet值将导致错误。使用以下查询来检查您的max_allowed_packet设置:

    mysql> SHOW VARIABLES LIKE 'max_allowed_packet';

以下前提条件也适用:

  • 捐赠服务器上的回滚表空间文件名必须唯一。将数据克隆到接收方时,回滚表空间,无论其在捐赠服务器上的位置,都会被克隆到接收方的innodb_undo_directory位置或由DATA DIRECTORY [=] 'clone_dir'子句指定的目录。如果捐赠服务器上的回滚表空间文件名重复,克隆操作将报告错误。

    为了确保捐赠服务器上的回滚表空间文件名唯一,请查询FILES表:

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

    关于删除和添加回滚表空间文件的信息,见第17.6.3.4节,“回滚表空间”

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

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

    这个错误不表示克隆失败。它意味着接收方 MySQL 服务器实例必须手动启动后才能连接到该实例,检查性能chema克隆表以验证克隆操作是否成功(见使用性能schema克隆表监控克隆操作)。RESTART 语句也需要同样的监控进程要求。更多信息,见第15.7.8.8节,“RESTART 语句”。这个要求在使用DATA DIRECTORY子句克隆到指定目录时不适用,因为自动重启不会发生。

  • 远程克隆操作有多个变量控制其各方面。执行远程克隆操作前,查看变量并根据计算环境调整设置。克隆变量在执行克隆操作的接收方 MySQL 服务器实例上设置。见第7.6.7.13节,“克隆系统变量”

克隆远程数据

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

示例假设已经满足远程克隆前提条件。请参阅远程克隆前提条件

  1. 使用管理员用户账户登录捐赠 MySQL 服务器实例。

    1. 创建一个 clone 用户,授予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 用户,授予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. 以之前创建的 clone 用户(recipient_clone_user'@'example.recipient.host.com)登录接收端 MySQL 服务器实例,执行CLONE INSTANCE语句。

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

    克隆数据完成后,接收端 MySQL 服务器实例将自动重新启动。

    关于监控克隆操作状态和进度的信息,请参见第7.6.7.10节,“监控克隆操作”

默认情况下,远程克隆操作在从donor MySQL Server实例中删除用户创建的数据(模式、表、表空间)和二进制日志,然后从donor MySQL Server实例中克隆数据。通过克隆到命名目录,可以避免删除当前recipient数据目录中的数据。

克隆到命名目录的过程与远程数据克隆相同,唯一的例外是:CLONE INSTANCE 语句必须包含DATA DIRECTORY子句。例如:

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

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

克隆到命名目录时,recipient MySQL服务器实例不会自动重启数据clone完成。如果要手动重启MySQL服务器,请执行:

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

其中,/path/to/clone_dir 是 recipient 中的命名目录路径。

您可以配置远程克隆操作的加密连接,以保护在网络上克隆数据。对加密数据进行克隆时,需要默认使用加密连接。(见第7.6.7.5节,“克隆加密数据”。)

以下说明如何配置接收端MySQL服务器实例使用加密连接。假设捐赠端MySQL服务器实例已经配置了加密连接。如果不是,请参阅第8.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子句,克隆插件将尝试建立加密连接,默认情况下,如果加密连接尝试失败,则降级到未加密连接。

    Note

    如果您正在克隆加密数据,无论是否指定 REQUIRE SSL 子句,均需要加密连接。使用 REQUIRE NO SSL 将导致错误,如果尝试克隆加密数据。