克隆插件支持以下语法以克隆远程数据;即,从远程 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 | 8.4.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
表。 请参见使用 Performance Schema 克隆表监视克隆操作。克隆插件以 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 服务器实例并检查 Performance Schema 克隆表以验证克隆操作是否已成功完成(请参见使用 Performance Schema 克隆表监视克隆操作)。
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 子句,克隆插件会默认尝试建立加密连接,如果加密连接尝试失败,则回退到非加密连接。
注意如果您要克隆加密数据,则无论是否指定
REQUIRE SSL
子句,默认情况下都需要加密连接。如果您尝试克隆加密数据,则使用REQUIRE NO SSL
会导致错误。