一、克隆(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 远程克隆示例
- 在donor节点创建克隆用户:
CREATE USER 'donor_clone_user'@'%' IDENTIFIED BY 'password';
GRANT BACKUP_ADMIN on . to 'donor_clone_user'@'%';
- 在donor节点安装克隆插件:
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
- 在recipient节点创建克隆用户:
CREATE USER 'recipient_clone_user'@'%' IDENTIFIED BY 'password';
GRANT CLONE_ADMIN on . to 'recipient_clone_user'@'%';
- 在recipient节点安装克隆插件:
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
- 设置clone_valid_donor_list参数:
SET GLOBAL clone_valid_donor_list = 'example.donor.host.com:3306';
- 执行克隆:
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
八、克隆功能的限制
- 在克隆操作期间,DDL包含truncate table不允许执行,DML可以执行。
- MySQL版本不同,不能做克隆操作,donor 和 recipient 节点的版本必须相同,且必须是8.0.17及以上版本。
- 克隆操作不能并发执行,同一时间只能执行一次克隆操作。
- 远程克隆不支持mysqlx_port指定的X协议的端口。
- 克隆操作不支持对MySQL配置信息进行克隆,包括my.cnf中的配置信息。
- 克隆操作不支持对binlog日志进行克隆。
- 克隆操作针对InnoDB引擎的表进行克隆,非InnoDB表,比如MyISAM,CSV等,只克隆出空表。
- 不支持通过MySQL Router连接到donor节点执行克隆操作。
- 本地克隆不支持创建在绝对路径的通用表空间,可能导致表空间命名冲突。
参考资料:
https://dev.mysql.com/doc/refman/8.0/en/clone-plugin.html