MySQL 8.0 克隆(clone)插件

一、克隆(clone)插件简介

MySQL 8.0 新增了一个clone插件,能够实现本地或者远程MySQL实例快速克隆。克隆的数据是InnoDB引擎的快照数据,包括数据库(schema),表(tables),表空间(tablespaces),数据字典元数据(data dictionary metadata)。克隆的数据是一个功能齐全的数据目录,使用该目录能够快速添加从节点或者组复制节点。
从远程MySQL实例克隆数据时,远程的MySQL实例称之为donor,它是数据提供者,是克隆的数据源。本地克隆数据的接收者,称之为recipient。克隆的数据通过网络,从donor传输给recipient。recipient本地的数据默认会被清除,当然也可以为recipient指定一个不同的目录用于存储克隆数据。
克隆插件除了克隆数据之外,还支持搭建复制。克隆操作能够获取复制的坐标点,在克隆完成之后,利用复制的坐标点信息,能够很方便的搭建主从复制,或者增加组复制节点。克隆插件支持表数据加密和压缩,在使用clone插件之前,需要安装插件。

二、安装克隆(clone)插件

克隆操作之前,需要在克隆的源实例(donor)和目的实例(recipient)上安装clone插件。
在my.cnf配置文件中加载clone插件:
[mysqld]
plugin-load-add=mysql_clone.so
也可以在MySQL实例运行时动态安装,如下:
INSTALL PLUGIN clone SONAME \’mysql_clone.so\’;
查看clone插件状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = \’clone\’;
如果clone插件加载失败,查看mysql错误日志,排查问题。

三、克隆本地数据

在同一台机器上,从MySQL数据目录克隆数据到另外一个目录。
语法:
CLONE LOCAL DATA DIRECTORY [=] \’clone_dir\’;
执行上述命令需要有BACKUP_ADMIN权限,需要先授权,如下:
GRANT BACKUP_ADMIN ON *.* TO \’clone_user\’;
执行本地克隆:
CLONE LOCAL DATA DIRECTORY = \’/path/to/clone_dir\’;
/path/to/clone_dir 路径的子目录clone_dir必须不能存在,MySQL应当对其父目录有写权限,最好将其父目录的属主设置为mysql用户。
在克隆完成之后,可以在克隆的目录上,启动一个新的MySQL实例(应当设置不同端口)。
mysqld_safe –datadir=clone_dir

四、克隆远程数据

克隆插件支持远程MySQL实例克隆,通过网络将远程(donor)数据传输到本地(recipient)。

4.1 远程克隆语法
CLONE INSTANCE FROM \'user\'@\'host\':port
IDENTIFIED BY \'password\'
[DATA DIRECTORY [=] \'clone_dir\']
[REQUIRE [NO] SSL];
  • user:远程donor实例上的用户
  • password:密码
  • host:远程donor实例的地址
  • port:远程donor实例的端口
  • DATA DIRECTORY [=] \’clone_dir\’:可选,指定recipient存储克隆数据的目录。如果不想清除recipient已有的数据目录,可以指定一个额外的数据目录。
  • [REQUIRE [NO] SSL]:显式指定是否使用加密连接传输数据
4.2 远程克隆前提条件
  • donor和recipient必须版本相同
  • clone插件要求8.0.17及以上版本
  • 在donor和recipient都需要安装clone插件
  • 在donor端,克隆用户需要BACKUP_ADMIN权限来访问和传输数据,在donor端克隆操作期间,DDL操作将被阻塞
  • 在recipient端,克隆用户需要CLONE_ADMIN权限来接收并存储数据,克隆操作期间,DDL操作被阻塞,克隆完成后,recipient实例自动重启
  • donor和recipient必须运行在相同的操作系统平台上
  • donor和recipient必须有相同的字符集和校验规则
  • donor和recipient必须有相同的 innodb_page_size 和 innodb_data_file_path 参数配置
  • recipient 上必须有足够的磁盘空间存储克隆数据
  • 克隆操作同一时间只允许运行一次,不支持并发运行。
4.3 远程克隆示例
  1. 在donor节点创建克隆用户:

CREATE USER \’donor_clone_user\’@\’%\’ IDENTIFIED BY \’password\’;
GRANT BACKUP_ADMIN on . to \’donor_clone_user\’@\’%\’;

  1. 在donor节点安装克隆插件:

INSTALL PLUGIN clone SONAME \’mysql_clone.so\’;

  1. 在recipient节点创建克隆用户:

CREATE USER \’recipient_clone_user\’@\’%\’ IDENTIFIED BY \’password\’;
GRANT CLONE_ADMIN on . to \’recipient_clone_user\’@\’%\’;

  1. 在recipient节点安装克隆插件:

INSTALL PLUGIN clone SONAME \’mysql_clone.so\’;

  1. 设置clone_valid_donor_list参数:

SET GLOBAL clone_valid_donor_list = \’example.donor.host.com:3306\’;

  1. 执行克隆:

CLONE INSTANCE FROM \’donor_clone_user\’@\’example.donor.host.com\’:3306 IDENTIFIED BY \’password\’;
在上述克隆执行完成之后,recipient 节点会自动重新启动。
注意:

  • 不管是本地克隆,还是远程克隆,对于用户创建在数据目录之外的表或者表空间,如果表空间名称相同,克隆时,所有表空间放在一个目录中,将导致表空间命名冲突。
  • 在克隆操作期间,发生网络中断问题,如果网络问题能在5分钟之内解决,那么克隆操作能够恢复,否则克隆操作返回错误。

五、通过克隆搭建主从复制

在克隆操作执行过程中,donor节点的binlog文件、位置以及 gtid_executed 都会传输到recipient节点。在克隆完成后,拥有这些信息就能够在recipient与donor节点之间建立复制关系。
在recipient节点上查询binlog位置信息:
SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;
在recipient节点上查询gtid_executed:
SELECT @@GLOBAL.GTID_EXECUTED;
创建复制关系:
CHANGE MASTER TO MASTER_HOST = \’master_host_name\’, MASTER_PORT = master_port_num, … MASTER_AUTO_POSITION = 1;
START SLAVE;
如果克隆的donor本身就是一个从节点,那么recipient在克隆完成重启之后,复制自动建立。如果克隆的donor是主节点,那么需要执行change master to,指定主库。

六、克隆功能的监控

由于数据量的大小以及网络带宽等硬件因素的影响,克隆操作可能会执行很长时间,通过查询recipient节点上performance_schema中的相关表,就能实现监控克隆操作的过程和状态。

  • clone_status,提供了克隆过程中,当前或者最近一次执行的克隆操作的状态,通常有四种状态,Not Started, In Progress, Completed, Failed。
  • clone_progress,提供了克隆过程中,当前或者最近一次执行的克隆操作的阶段,主要包括DROP DATA, FILE COPY, PAGE_COPY, REDO_COPY, FILE_SYNC, RESTART, RECOVERY。

clone_status 和 clone_progress 只能在recipient节点上监控克隆状态。如果想监控donor上的状态,需要使用 Performance Schema Stage Events。
启用 stage/innodb/clone%:
UPDATE performance_schema.setup_instruments SET ENABLED = \’YES\’ WHERE NAME LIKE \’stage/innodb/clone%\’;
启用 stage event consumer tables:
UPDATE performance_schema.setup_consumers SET ENABLED = \’YES\’ WHERE NAME LIKE \’%stages%\’;
启用之后,下面三个表可用:

  • events_stages_current
  • events_stages_history
  • events_stages_history_long

查询克隆操作进度:
SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_current WHERE EVENT_NAME LIKE \’stage/innodb/clone%\’;
SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history WHERE EVENT_NAME LIKE \’stage/innodb/clone%\’;
SELECT * FROM performance_schema.setup_instruments WHERE NAME LIKE WHERE NAME LIKE \’%clone%\’;

七、克隆功能相关参数

  • clone_autotune_concurrency
  • clone_buffer_size
  • clone_ddl_timeout
  • clone_enable_compression
  • clone_max_concurrency
  • clone_max_data_bandwidth
  • clone_max_network_bandwidth
  • clone_ssl_ca
  • clone_ssl_cert
  • clone_ssl_key
  • clone_valid_donor_list

八、克隆功能的限制

  1. 在克隆操作期间,DDL包含truncate table不允许执行,DML可以执行。
  2. MySQL版本不同,不能做克隆操作,donor 和 recipient 节点的版本必须相同,且必须是8.0.17及以上版本。
  3. 克隆操作不能并发执行,同一时间只能执行一次克隆操作。
  4. 远程克隆不支持mysqlx_port指定的X协议的端口。
  5. 克隆操作不支持对MySQL配置信息进行克隆,包括my.cnf中的配置信息。
  6. 克隆操作不支持对binlog日志进行克隆。
  7. 克隆操作针对InnoDB引擎的表进行克隆,非InnoDB表,比如MyISAM,CSV等,只克隆出空表。
  8. 不支持通过MySQL Router连接到donor节点执行克隆操作。
  9. 本地克隆不支持创建在绝对路径的通用表空间,可能导致表空间命名冲突。

发表评论

您的电子邮箱地址不会被公开。

Shopping Cart