MySQL8.0新特性--Clone Plugin克隆
Clone Plugin简介
8.0.17引入clone plugin,允许从本地或者远程的MySQL中克隆数据克隆的数据包括schema、表、表空间、元数据等等,克隆的数据是一个完整的数据目录,插件可以使用克隆的目录配置和恢复一个MySQL Server,克隆分为本地克隆和远程克隆。
本地克隆:将启动克隆操作的MySQL克隆到该主机的一个指定目录下。
远程克隆:涉及到启动克隆操作的本地MySQL称为recipient(数据接收方),远端的源数据MySQL称为donor(捐赠者)。通过网络传输的方式将donor数据克隆到recipient的指定目录。如果不指定则会将接收方数据目录中的所有数据替换为克隆的数据。
插件安装
克隆插件和其他插件一样,都位于mysql/lib/plugin下,命名为mysql_clone.so,安装方式也一样,可以通过配置文件也可以在线安装。
配置文件加载:
[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT #启动时加载插件并防止它在运行时被删除
启动时加载:
mysqld_safe --defaults-file=/etc/my.cnf --plugin-load-add=mysql_clone.so &
在线加载:
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
检查插件是否加载成功
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone | ACTIVE |
+-------------+---------------+
本地克隆
1、 先创建一个具有BACKUP_ADMIN备份权限的账号
mysql> create user clone@'%' identified by 'Abc-1234';
mysql> grant backup_admin on *.* to clone@'%';
2、 执行本地克隆,指定的目录MySQL必须拥有读写权限、指定的clone_dir必须不存在
mysql> clone local data directory='/dbdata/test';
Query OK, 0 rows affected (11.26 sec)
3、 查看克隆的文件
[mysql@node04 test]$ pwd
/dbdata/test
[mysql@node04 test]$ ls
#clone ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1 mysql mysql.ibd sys test undo_001 undo_002
说明克隆是成功的,同时socket、pid-file、tmpdir、log-error、slow_query_log_file、log-bin、relay-log等文件是不会被克隆的。
4、 查看克隆的步骤和进度
5、 利用克隆的数据目录启动一个实例
配置参数文件、准备相应的目录正常启动即可,使用show master status\G,可以查看克隆时候主库的GTID,方便搭建主从。
远程克隆
1、 源端创建具有BACKUP_ADMIN权限的账号(此处省略)、接收方创建具有CLONE_ADMIN权限的账号
mysql> create user target_clone@'%' identified by 'Abc-1234';
mysql> grant clone_admin on *.* to target_clone@'%';
2、 配置源IP信息
set global clone_valid_donor_list='192.168.73.103:3307' ;
3、 开始远程克隆数据库
mysql> clone instance from clone@'192.168.73.103':3307 identified by 'Abc-1234';
Query OK, 0 rows affected (27.73 sec)
4、 查看克隆的进度与状态
TIPS:可以看出远程克隆比本地克隆多了一个RESTART和RECOVER的步骤
TIPS:未指定目录的克隆,接收方实例上的数据会被覆盖。如果不想被覆盖,可以指定目录,如:
clone instance from clone@'192.168.73.103':3307 identified by 'Abc-1234' data directioy ‘/dbdata/test’;
利用克隆搭建主从复制
1、 获取binlog位置或GTID
mysql> SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;
+----------------+-----------------+
| BINLOG_FILE | BINLOG_POSITION |
+----------------+-----------------+
| bin-log.000029 | 1439 |
+----------------+-----------------+
mysql> SELECT @@GLOBAL.GTID_EXECUTED;
+-------------------------------------------------------------+
| @@GLOBAL.GTID_EXECUTED |
+-------------------------------------------------------------+
| aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-5532:1001480-1001579 |
+-------------------------------------------------------------+
mysql> show master status\G;
*************************** 1. row ***************************
File: bin-log.000002
Position: 151
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-5532:1001480-1001579
2、 搭建复制关系(和传统搭建方式一致,省略)
克隆监控
1、 通过P_S库下的clone_progress、clone_status查看进度和状态(前面已提供,省略)。
2、 通过P_S库下events_stages_current、events_stages_history、events_stages_history_long。
必须打开对应的监控:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/clone%';
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
停止克隆
通过performance_schema.clone_status表的PID信息,之后使用 KILL QUERY processlist_id 语句停止clone操作。
克隆相关的变量参数
clone_valid_donor_list:设置源端IP:PORT,多个用过逗号隔开。
clone_autotune_concurrency:动态调整克隆的线程,默认ON。
clone_max_concurrency:远程克隆最大并发数据,默认16,取值范围1~128。
clone_buffer_size:本地克隆时生效。默认4M,提高该值可以提供克隆性能。
clone_ddl_timeout:默认300S,发起克隆操作前需要获取备份锁,如果此时有DDL操作,会等待clone_ddl_timeout,超过则报错。一但克隆操作在执行,DDL操作会一直阻塞。
clone_enable_compression:默认OFF,远程克隆期间牺牲CPU进行数据压缩,节省网络带宽。
clone_max_data_bandwidth:默认0(不限制),远程克隆时设置传输的最大IO速率,影响性能时,可以设置。
clone_max_network_bandwidth:默认0(不限制),远程克隆时设置最大的网络传输速率,影响性能时,可设置。
clone_ssl_ca、clone_ssl_cert、clone_ssl_key:SSL相关配置
克隆限制
1、 接收方必须先启动实例、接收方和源端都必须安装克隆插件,MySQL版本必须一致且大于8.0.17、字符集和校队规则、平台、innodb_page_size、innodb_data_file_path、SSL、秘钥机制必须相同
2、 源端登陆的账号必须具备BACKUP_ADMIN权限,接收方登陆的账号必须具备CLONE_ADMIN权限(等于BACKUP_ADMIN和SHUTDOWN),在操作期间会阻塞DDL操作。
3、 接收方的磁盘空间必须足够、指定目录的权限。
4、 INFORMATION_SCHEMA.FILES中的文件才会被CLONE,一次只运行一个克隆操作。
5、 clone插件以1MB包和元数据的形式传输数据。因此,对于recipient和donor的MySQL服务器实例,最小需要的max_allowed_packet值是2MB。max_allowed_packet值小于2MB会导致错误。
6、 克隆插件仅克隆存储的数据 InnoDB。不克隆其他存储引擎数据。MyISAM并且 CSV存储在包括sys模式的任何模式中的表都被克隆为空表。
与XtraBackup比较
XtraBackup的核心备份思想是一个线程拷贝innodb文件,一个线程拷贝redo。备份非事务引擎时,会加FTWRL全局读锁保证一致性,恢复时利用MySQL recovery的原理进行恢复。
克隆通过clone_progress可以看到有如下几个步骤:DROP DATA、FILE COPY、PAGE COPY、REDO COPY、FILE SYNC、RESTART、RECOVERY。
FILE COPY对应的是XtraBackup的idb拷贝,REDO COPY对应的是XtraBackup的redo拷贝。PAGE COPY是XtraBackup没有的,它会跟踪克隆开始这个LSN之后所有InnoDB页的改动,即跟踪每次从BP中刷新到磁盘的操作,记录对应页面的space id和page id。在FILE COPY完成后会停止PAGE跟踪,启动REDO跟踪直到完成REDO COPY,所以克隆的需要记录的REDO相比XtraBackup少很多,同时克隆的REDO COPY在记录redo的时候会判断是否会覆盖还未被拷贝走的redo日志,如果是的话,会等待Redo 完成拷贝。
总结:
克隆不支持InnoDB外的引擎,如myiasm、csv引擎的表会被克隆未单表;另外克隆只支持整个实例操作,无法克隆单个库或者单表,所以在某些场景上还无法替代XtraBackup。
如果是整个实例的克隆与复制从库搭建,克隆操作相比XtraBackup实在是简单太多,同时MGR新增节点是通过CLONE实现的。