克隆插件支持以下语法来克隆远程数据;也就是说,从远程 MySQL 服务器实例(捐赠者)克隆数据并将其传输到启动克隆操作的 MySQL 实例(接收者)。
CLONE INSTANCE FROM 'user'@'host':port
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];
其中
是捐赠者 MySQL 服务器实例上的克隆用户。user
是password
密码。user
是捐赠者 MySQL 服务器实例的host
hostname
地址。不支持互联网协议版本 6 (IPv6) 地址格式。可以改为使用 IPv6 地址的别名。可以按原样使用 IPv4 地址。
是捐赠者 MySQL 服务器实例的port
port
端口号。(不支持由mysqlx_port
指定的 X 协议端口。也不支持通过 MySQL Router 连接到捐赠者 MySQL 服务器实例。)DATA DIRECTORY [=] '
是一个可选子句,用于指定接收者上的目录,用于存放您要克隆的数据。如果您不想从接收者数据目录中删除现有的用户创建的数据(架构、表、表空间)和二进制日志,请使用此选项。需要使用绝对路径,并且目录必须不存在。MySQL 服务器必须具有创建目录的必要写入权限。clone_dir
'当可选的
DATA DIRECTORY [=] '
子句未被使用时,克隆操作会从接收者数据目录中删除用户创建的数据(架构、表、表空间)和二进制日志,将新数据克隆到接收者数据目录中,并在之后自动重新启动服务器。clone_dir
'[REQUIRE [NO] SSL]
明确指定在网络上传输克隆数据时是否使用加密连接。如果无法满足显式规范,则会返回错误。如果未指定 SSL 子句,则克隆默认情况下尝试建立加密连接,如果安全连接尝试失败,则回退到不安全连接。克隆加密数据时需要安全连接,无论是否指定了此子句。有关更多信息,请参阅 配置克隆的加密连接。
默认情况下,位于捐赠者 MySQL 服务器实例数据目录中的用户创建的 InnoDB
表和表空间会被克隆到接收者 MySQL 服务器实例的数据目录中。如果指定了 DATA DIRECTORY [=] '
子句,则会将它们克隆到指定的目录中。clone_dir
'
位于捐赠者 MySQL 服务器实例数据目录之外的用户创建的 InnoDB
表和表空间会被克隆到接收者 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 用户需要执行克隆操作(“克隆用户”)。
在捐赠者上,克隆用户需要
BACKUP_ADMIN
权限才能访问和传输数据从捐赠者那里获取数据,并在克隆操作期间阻止并发 DDL。默认情况下,在捐赠者上允许并发 DDL。见 第 7.6.7.4 节,“克隆和并发 DDL”.在接收者上,克隆用户需要
CLONE_ADMIN
权限才能替换接收者数据,在克隆操作期间阻止接收者上的 DDL,并自动重新启动服务器。CLONE_ADMIN
权限包含BACKUP_ADMIN
和SHUTDOWN
权限,隐式包含。
在以下先决条件信息之后的远程克隆示例中,包含了创建克隆用户并授予所需权限的说明。
当 CLONE INSTANCE
语句执行时,会检查以下先决条件
捐赠者和接收者必须是相同的 MySQL 服务器系列,例如 8.4.0 和 8.4.11。要确定 MySQL 服务器版本,请发出以下查询
mysql> SHOW VARIABLES LIKE 'version'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | version | 9.0.0 | +---------------+-------+
捐赠者和接收者 MySQL 服务器实例必须在相同的操作系统和平台上运行。例如,如果捐赠者实例在 Linux 64 位平台上运行,则接收者实例也必须在该平台上运行。有关如何确定操作系统平台的信息,请参考您的操作系统文档。
接收者必须有足够的磁盘空间来存放克隆数据。默认情况下,在克隆捐赠者数据之前,会从接收者上删除用户创建的数据(架构、表、表空间)和二进制日志,因此您只需要足够的空间来存放捐赠者数据。如果您使用
DATA DIRECTORY
子句克隆到命名目录,则必须有足够的空间来存放现有的接收者数据和克隆数据。您可以通过检查文件系统上数据目录的大小以及位于数据目录之外的所有表空间的大小来估计数据的大小。当估计捐赠者上的数据大小时,请记住,只有InnoDB
数据会被克隆。如果您将数据存储在其他存储引擎中,请相应地调整数据大小估计。InnoDB
允许在数据目录之外创建某些表空间类型。如果捐赠者 MySQL 服务器实例具有位于数据目录之外的表空间,则克隆操作必须能够访问这些表空间。您可以查询 Information SchemaFILES
表来识别位于数据目录之外的表空间。位于数据目录之外的文件具有指向数据目录之外目录的完全限定路径。mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES;
在捐赠者上处于活动状态的插件(包括任何密钥环插件)也必须在接收者上处于活动状态。您可以通过发出
SHOW PLUGINS
语句或查询 Information SchemaPLUGINS
表来识别活动插件。捐赠者和接收者必须具有相同的 MySQL 服务器字符集和排序规则。有关 MySQL 服务器字符集和排序规则配置的信息,请参阅 第 12.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';
如果克隆加密或页面压缩的数据,则捐赠者和接收者必须具有相同的文件系统块大小。对于页面压缩数据,接收者文件系统必须支持稀疏文件和孔穿孔,以便在接收者上执行孔穿孔。有关这些功能以及如何识别使用这些功能的表和表空间的信息,请参阅 第 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';
以您之前创建的克隆用户身份登录接收者 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 服务器实例会自动重新启动。
有关监控克隆操作状态和进度的信息,请参阅 第 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 子句,克隆插件会尝试默认建立加密连接,如果加密连接尝试失败,则会回退到非加密连接。
注意如果您正在克隆加密数据,则默认情况下需要加密连接,无论是否指定
REQUIRE SSL
子句。如果您尝试克隆加密数据,则使用REQUIRE NO SSL
会导致错误。