克隆插件支持以下语法来克隆远程数据,即从远程 MySQL 服务器实例(donor)克隆数据并将其传输到启动克隆操作的 MySQL 实例(recipient).
CLONE INSTANCE FROM 'user'@'host':port
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];
其中:
-
是克隆用户在 donor MySQL 服务器实例上的用户名。用户
-
是密码
的密码。用户
-
是 donor MySQL 服务器实例的主机
主机名
地址。Internet 协议版本 6(IPv6)地址格式不支持。可以使用 IPv6 地址的别名代替。IPv4 地址可以原样使用。 -
是 donor MySQL 服务器实例的端口
端口
号。(X 协议端口指定的mysqlx_port
不支持。也不支持通过 MySQL 路由器连接到 donor MySQL 服务器实例。) -
数据目录 [=] '
是一个可选子句,用于指定 recipient 上的目录,以便克隆数据。使用此选项可以避免删除 recipient 数据目录中的现有用户创建的数据(模式、表、表空间)和二进制日志。如果不使用此选项,克隆操作将删除 recipient 数据目录中的用户创建的数据(模式、表、表空间)和二进制日志,然后将新数据克隆到 recipient 数据目录,并自动重新启动服务器。clone_dir
'当不使用可选的
数据目录 [=] '
子句时,克隆操作将删除 recipient 数据目录中的用户创建的数据(模式、表、表空间)和二进制日志,然后将新数据克隆到 recipient 数据目录,并自动重新启动服务器。clone_dir
' -
[REQUIRE [NO] SSL]
明确指定是否使用加密连接来传输克隆的数据。如果不指定 SSL 子句,克隆操作将尝试建立加密连接,否则将回退到不安全的连接。如果指定了 SSL 子句,克隆操作将尝试建立加密连接,否则将返回错误。无论是否指定了 SSL 子句,克隆加密数据时都需要安全连接。有关详细信息,请参阅 配置克隆加密连接。
默认情况下,用户创建的 InnoDB
表和表空间驻留在捐赠 MySQL 服务器实例的数据目录中,将被克隆到接收 MySQL 服务器实例的数据目录中。如果指定了 DATA DIRECTORY [=] '
子句,则它们将被克隆到指定的目录中。clone_dir
'
用户创建的 InnoDB
表和表空间驻留在捐赠 MySQL 服务器实例的数据目录外,将被克隆到接收 MySQL 服务器实例的相同路径中。如果表或表空间已经存在,将报告错误。
默认情况下,InnoDB
系统表空间、重做日志和撤销表空间将被克隆到捐赠服务器实例上配置的相同位置(由 innodb_data_home_dir
和 innodb_data_file_path
、innodb_log_group_home_dir
和 innodb_undo_directory
定义)。如果指定了 DATA DIRECTORY [=] '
子句,这些表空间和日志将被克隆到指定的目录中。clone_dir
'
要执行克隆操作,克隆插件必须在捐赠和接收 MySQL 服务器实例上均处于活动状态。有关安装说明,请参阅 第 7.6.7.1 节,“安装克隆插件”。
在捐赠和接收 MySQL 服务器实例上都需要一个 MySQL 用户来执行克隆操作(即“克隆用户”)。
-
在捐赠服务器上,克隆用户需要
BACKUP_ADMIN
权限,以访问和传输捐赠服务器实例的数据,并阻止克隆操作期间的并发 DDL。默认情况下,捐赠服务器实例允许并发 DDL。请参阅 第 7.6.7.4 节,“克隆和并发 DDL”。 -
在接收方上,克隆用户需要
CLONE_ADMIN
权限以替换接收方数据,在克隆操作期间阻止 DDL 在接收方上,并自动重新启动服务器。CLONE_ADMIN
权限隐式包括BACKUP_ADMIN
和SHUTDOWN
权限。
创建克隆用户和授予所需权限的说明包含在以下远程克隆示例中。
以下先决条件是在执行 CLONE INSTANCE
语句时检查的:
-
捐赠者和接收方必须是相同的 MySQL 服务器版本和发布版本。要确定 MySQL 服务器版本和发布版本,请发出以下查询:
mysql> SHOW VARIABLES LIKE 'version'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | version | 8.1.0 | +---------------+-------+
-
捐赠者和接收方 MySQL 服务器实例必须在相同的操作系统和平台上运行。例如,如果捐赠者实例在 Linux 64 位平台上运行,则接收方实例也必须在该平台上运行。请参阅操作系统文档以获取有关如何确定操作系统平台的信息。
-
接收方必须有足够的磁盘空间来存储克隆数据。默认情况下,在克隆捐赠者数据之前,用户创建的数据(模式、表、表空间)和二进制日志将从接收方删除,因此您只需要足够的空间来存储捐赠者数据。如果您使用
DATA DIRECTORY
子句克隆到命名目录,则必须有足够的磁盘空间来存储现有的接收方数据和克隆数据。您可以通过检查文件系统上的数据目录大小和表空间大小来估算数据大小。在估算捐赠者数据大小时,请记住只有InnoDB
数据被克隆。如果您在其他存储引擎中存储数据,请相应地调整数据大小估算。 -
InnoDB
允许在数据目录外创建某些表空间类型。如果捐赠者 MySQL 服务器实例具有驻留在数据目录外的表空间,则克隆操作必须能够访问这些表空间。您可以查询信息模式FILES
表以确定驻留在数据目录外的表空间。驻留在数据目录外的文件具有指向其他目录的完全限定路径,而不是数据目录。mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES;
-
包括密钥环插件在内的所有活动插件必须在donor和recipient上都处于活动状态。你可以通过发出
SHOW PLUGINS
语句或查询信息模式PLUGINS
表来标识活动插件。 -
donor和recipient必须具有相同的MySQL服务器字符集和排序规则。有关MySQL服务器字符集和排序规则配置的信息,请参阅第12.15节,“字符集配置”。
-
donor和recipient需要具有相同的
innodb_page_size
和innodb_data_file_path
设置。donor和recipient的innodb_data_file_path
设置必须指定相同数量的数据文件,大小相同。你可以使用SHOW VARIABLES
语法检查变量设置。mysql> SHOW VARIABLES LIKE 'innodb_page_size'; mysql> SHOW VARIABLES LIKE 'innodb_data_file_path';
-
如果克隆加密或页压缩数据,donor和recipient必须具有相同的文件系统块大小。对于页压缩数据,recipient文件系统必须支持稀疏文件和hole punching,以便在recipient上发生hole punching。有关这些功能的信息以及如何标识使用它们的表和表空间,请参阅第7.6.7.5节,“克隆加密数据”和第7.6.7.6节,“克隆压缩数据”。要确定文件系统块大小,请参阅操作系统文档。
-
如果您正在克隆加密数据,则需要安全连接。请参阅配置克隆的加密连接。
-
在接收器上,
clone_valid_donor_list
设置必须包括捐赠 MySQL 服务器实例的主机地址。您只能从有效捐赠者列表中的主机克隆数据。需要具有SYSTEM_VARIABLES_ADMIN
权限的 MySQL 用户来配置该变量。配置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。如果max_allowed_packet
值小于 2MB,将出现错误。使用以下查询来检查您的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 服务器实例必须在克隆数据后手动重新启动。手动启动服务器后,可以连接到目标 MySQL 服务器实例并检查性能模式克隆表以验证克隆操作是否成功(请参阅使用性能模式克隆表监控克隆操作)。
RESTART
语句也需要相同的监控进程。有关更多信息,请参阅第 15.7.8.8 节,“RESTART 语句”。如果使用DATA DIRECTORY
子句克隆到命名目录,则不需要自动重新启动。 -
几个变量控制远程克隆操作的各个方面。在执行远程克隆操作之前,请查看变量并根据需要调整设置以适应您的计算环境。克隆变量是在执行克隆操作的目标 MySQL 服务器实例上设置的。请参阅第 7.6.7.13 节,“克隆系统变量”。
以下示例演示了远程克隆数据。默认情况下,远程克隆操作将删除目标上的用户创建的数据(模式、表、表空间)和二进制日志,然后将新数据克隆到目标数据目录,并在完成后重新启动 MySQL 服务器。
该示例假设满足远程克隆的先决条件。请参阅远程克隆先决条件。
-
使用管理员用户账户登录到捐赠者 MySQL 服务器实例。
-
创建一个具有
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';
-
安装克隆插件:
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
-
-
使用管理员用户账户登录到目标 MySQL 服务器实例。
-
使用具有
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';
-
安装克隆插件:
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
-
将捐赠 MySQL 服务器实例的主机地址添加到
clone_valid_donor_list
变量设置中。mysql> SET GLOBAL clone_valid_donor_list = 'example.donor.host.com:3306';
-
-
以之前创建的克隆用户身份(
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 节,“监控克隆操作”。
默认情况下,远程克隆操作将从接收者数据目录中删除用户创建的数据(模式、表、表空间)和二进制日志,然后从捐赠 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
是接收者上的命名目录路径。
您可以配置加密连接以保护克隆操作期间网络上的数据。当克隆加密数据时,默认情况下需要加密连接(请参阅 第 7.6.7.5 节,“克隆加密数据”)。
以下说明如何配置接收器 MySQL 服务器实例以使用加密连接。假设捐赠者 MySQL 服务器实例已经配置了使用加密连接。如果不是,请参阅 第 8.3.1 节,“配置 MySQL 以使用加密连接” 了解服务器端配置说明。
要配置接收器 MySQL 服务器实例以使用加密连接:
-
将捐赠者 MySQL 服务器实例的客户端证书和密钥文件提供给接收主机。可以通过安全通道将文件分发到接收主机,或者将它们放在可供接收主机访问的挂载分区上。需要提供的客户端证书和密钥文件包括:
-
ca.pem
自签名证书颁发机构(CA)文件。
-
client-cert.pem
客户端公钥证书文件。
-
client-key.pem
客户端私钥文件。
-
-
在接收器 MySQL 服务器实例上配置以下 SSL 选项。
-
指定自签名证书颁发机构(CA)文件的路径。
-
指定客户端公钥证书文件的路径。
-
指定客户端私钥文件的路径。
例如:
clone_ssl_ca=/path/to/ca.pem clone_ssl_cert=/path/to/client-cert.pem clone_ssl_key=/path/to/client-key.pem
-
-
要要求使用加密连接,请在接收器上发出
CLONE
语句时包含REQUIRE SSL
子句。mysql> CLONE INSTANCE FROM 'user'@'example.donor.host.com':3306 IDENTIFIED BY 'password' DATA DIRECTORY = '/path/to/clone_dir' REQUIRE SSL;
如果未指定 SSL 子句,clone 插件将尝试建立加密连接,默认情况下,如果加密连接尝试失败,将回退到未加密连接。
Note如果您正在克隆加密数据,默认情况下需要加密连接,无论是否指定了
REQUIRE SSL
子句。使用REQUIRE NO SSL
将导致错误,如果您尝试克隆加密数据。