这是学习笔记的第 2064 篇文章
今天在睡觉前想起了MySQL 8.0里面的一个很好的特性,克隆插件。这篇文章介绍的很细致,可以参考。
技术分享 | 实战 MySQL 8.0.17 Clone Plugin
当然我算是比较懒的,喜欢追求性价比,即最少的时间做最多的事情。今天也算是用一个小时完整的挑战下自己,来测试一个特性。
从我冒出想法要测试这个特性,发现8.0的软件还没有安装,要整个部署下来,那个时间是很漫长的。我打开MySQL官网,开始下载软件。
结果一看网速才20多K,按照这个速度,500多M的文件需要几个小时,所以果断放弃了。但是爱偷懒的我有另外一个好方法,那就是合理利用资源优势,比如我可以使用云服务器,比如这里使用的是腾讯的服务器,如果配置了腾讯云的软件站点,那速度是杠杠的,所以我从下载到初始化完成,整个过程不到15分钟。
我们来简单说下克隆插件,这个插件从我的理解中和Oracle的热备,Data Guard的文件复制传输很类似,所以试了下这个特性都几乎没有花费太多的功夫就直接上手了。
首先直接安装插件。
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
Query OK, 0 rows affected (0.48 sec)
同时需要创建一个账户
CREATE USER clone_user@'%' IDENTIFIED by 'password';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user';
使用如下的方式开始克隆,这个是本地克隆的操作方法:
/usr/local/mysql-8.0.17-linux-glibc2.12-x86_64/bin/mysql -uclone_user -ppassword --port=33081 -h127.0.0.1
> CLONE LOCAL DATA DIRECTORY = '/data/mysql_clone/clone_dir';
其中目录clone_dir是不存在的,在克隆的时候会创建。
可以通过如下的方式查看克隆的进度。
mysql> SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
----------- ------------- ----------------------------
| STAGE | STATE | END_TIME |
----------- ------------- ----------------------------
| DROP DATA | Completed | 2019-08-08 23:22:05.878982 |
| FILE COPY | Completed | 2019-08-08 23:22:06.548661 |
| PAGE COPY | Completed | 2019-08-08 23:22:06.627186 |
| REDO COPY | Completed | 2019-08-08 23:22:06.627476 |
| FILE SYNC | Completed | 2019-08-08 23:22:07.531942 |
| RESTART | Not Started | NULL |
| RECOVERY | Not Started | NULL |
----------- ------------- ----------------------------
7 rows in set (0.03 sec)
我们可以直接启动这个克隆后的实例,假设端口是33083
/usr/local/mysql-8.0.17-linux-glibc2.12-x86_64/bin/mysqld_safe --defaults-file=/data/mysql_clone/clone_dir/my.cnf &
会得到如下的列表。
mysql> show databases;
--------------------
| Database |
--------------------
| information_schema |
| mysql |
| performance_schema |
| sys |
--------------------
4 rows in set (0.00 sec)
远程克隆的效果就更明显了,不过需要配置两类账户,一个是源端,一个是目标端。
源端的配置:
CREATE USER clone_user2 IDENTIFIED by 'password1';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user2'@'%';
目标端的配置:
CREATE USER clone_user2@'%' IDENTIFIED by 'password2';
GRANT CLONE_ADMIN ON *.* TO 'clone_user2'@'%';
SET GLOBAL clone_valid_donor_list = '127.0.0.1:33081';
远程克隆在目标端操作:
CLONE INSTANCE FROM clone_user2@'127.0.0.1':33081
IDENTIFIED BY 'password1';
可用通过如下的方式查看进度:
mysql> SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
----------- ----------- ----------------------------
| STAGE | STATE | END_TIME |
----------- ----------- ----------------------------
| DROP DATA | Completed | 2019-08-08 23:41:44.591132 |
| FILE COPY | Completed | 2019-08-08 23:41:45.248866 |
| PAGE COPY | Completed | 2019-08-08 23:41:45.539937 |
| REDO COPY | Completed | 2019-08-08 23:41:45.646024 |
| FILE SYNC | Completed | 2019-08-08 23:41:46.637973 |
| RESTART | Completed | 2019-08-08 23:41:51.332175 |
| RECOVERY | Completed | 2019-08-08 23:41:53.916695 |
----------- ----------- ----------------------------
7 rows in set (0.01 sec)
这个特性对于已有的xtracbackup和分布式复制是一种很好的补充,也使得热备的方式可以更加灵活便捷。