MySQL 8.0 新特性:Clone Plugin
一、前言
MySQL 在 8.0.17 加入了克隆插件,可以从本地或者远程克隆数据,比如需要创建主从关系,我们一般都是通过物理备份来做,那如果你使用的是 MySQL 8.0.17 及以上的版本那么就可以使用它直接 Clone 数据即可,使用克隆插件进行配置主从关系要比复制大量的事务要快的多,效率更高。
克隆分为本地克隆和远程克隆,本文将着重介绍远程克隆。
关于本地备份可以考虑能否当作物理备份来用?
二、远程克隆测试
注意事项⚠️:克隆角色分为 recipient 接收者 与 donor 捐赠者 默认情况下使用远程克隆会删除 “接收者” 数据目录中的数据,替换为 “捐赠者” 的克隆数据。当然也可以选择将克隆的数据分配到接收者的其它目录,避免删除“接收者” 现有的数据。
测试服务器规划:
安装 clone 插件(接收者&捐赠者都需要安装):
确认插件是否可用:
创建专用的克隆用户:
在接收者服务器设置捐赠者列表清单:
接收者开始拉去捐赠者数据:
此时就已经完成一次克隆测试,接收者的数据已经与捐赠者相同,用下方 SQL 可以查看 clone 进度及过程:
三、远程克隆条件及限制
捐赠者与接收者都需要安装 clone 插件;
捐赠者至少有 BAKUP_ADMIN 权限,接收者至少有 CLONE_ADMIN 权限;
克隆目标的目录必须有写入权限;
克隆期间不允许使用 DDL 可以并发 DML;
数据库版本建议要一致,必须是 version >= 8.0.17;
必须是同一平台下的实例,比如 Linux to window、x64 to x32 均不支持;
使用前需要确认是否有足够的磁盘空间;
克隆插件不支持克隆 my.cnf 及二进制日志,及支持克隆 innodb 引擎的数据;
捐赠者与接收者部分参数要求一致,如:innodb_page_size、innodb_data_file_path、lower_case_table_names;
同一时间,只允许一个克隆任务在执行,所以启动克隆前可以先确认是否有克隆任务;
默认情况下,克隆结束后会自动重启 接收者 MySQL 实例。
以上是一些总结,详细请参考:MySQL 8.0 官方文档
四、使用克隆高效搭建复制
复制搭建节点分配:
172.16.104.57 | Master |
172.16.104.56 | Slave |
首先给 56 节点安装与“捐赠者”相同版本的实例,使用的是自动化脚本:
[root@172-16-104-56 test01]# python mysql_install.py -p=mysql-8.0.22-linux-glibc2.12-x86_64.tar.xz __ __ ____ ___ _ _ _ _ _ | \/ |_ _/ ___| / _ \| | (_)_ __ ___| |_ __ _| | | | |\/| | | | \___ \| | | | | | | '_ \/ __| __/ _` | | | | | | | |_| |___) | |_| | |___ | | | | \__ \ || (_| | | | |_| |_|\__, |____/ \__\_\_____| |_|_| |_|___/\__\__,_|_|_| |___/ Validating the installation package... 69640f7e9ecb7dff857b8e2873dc1539 mysql-8.0.22-linux-glibc2.12-x86_64.tar.xz loading.... Checking system permissions... 50% System Permission Detection! 100% System Permission Detection! Unpacking the installation package... Creating a data directory... Permission setting in progress... Writing my.conf ... Initializing MySQL... Successful! Starting MySQL... Successful! Please enter to exit the program.
安装完成后,我们可以看到只有 MySQL 的元数据库:
root@mysql 17:47: [(none)]>show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.01 sec) root@mysql 17:47: [(none)]>
首先给 “捐赠者” 及 “接收者” 安装 clone 插件:
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
给 “捐赠者” 创建克隆用户及授权:
CREATE USER clone_user@'%' IDENTIFIED by 'Dtstack@clone'; GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'%';
“接收者” 设置 “捐赠者” 列表:
SET GLOBAL clone_valid_donor_list = '172.16.104.57:3306';
开启克隆,过程中 “接收者” 会自动重启:
root@mysql 17:55: [(none)]>CLONE INSTANCE FROM clone_user@'172.16.104.57':3306 IDENTIFIED BY 'Dtstack@clone'; Query OK, 0 rows affected (11.28 sec) root@mysql 17:55: [(none)]>Restarting mysqld... 2021-02-09T09:55:39.552910Z mysqld_safe Number of processes running now: 0 2021-02-09T09:55:39.572682Z mysqld_safe mysqld restarted
查看 clone 过程中是否出现错误:
root@mysql 17:58: [(none)]>SELECT STATE, ERROR_NO, ERROR_MESSAGE FROM performance_schema.clone_status; +-----------+----------+---------------+ | STATE | ERROR_NO | ERROR_MESSAGE | +-----------+----------+---------------+ | Completed | 0 | | +-----------+----------+---------------+ 1 row in set (0.00 sec) root@mysql 17:59: [(none)]>
克隆已经完成,在捐赠者上创建复制用户,建立复制即可:
create user repl@'%' identified WITH 'mysql_native_password' by 'Dtstack@repl'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';
在接收者上创建 GTID 复制关系
CHANGE MASTER TO MASTER_HOST='172.16.104.57', MASTER_USER='repl', MASTER_PASSWORD='Dtstack@repl', MASTER_PORT=3306, MASTER_AUTO_POSITION=1;
启动复制线程:
start slave;
查询复制状态:
Slave_IO_Running: Yes Slave_SQL_Running: Yes