mytecdb.com

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. 本地克隆不支持创建在绝对路径的通用表空间,可能导致表空间命名冲突。

参考资料:

https://dev.mysql.com/doc/refman/8.0/en/clone-plugin.html

文章评论

0条评论