克隆插件简介
从MySQL 8.0.17开始,MySQL提供了一个克隆插件,允许在本地或从远程MySQL服务器实例克隆InnoDB其中的数据的物理快照。
- 支持两种克隆方式:本地克隆和远程克隆
- 支持克隆加密数据
- 支持克隆压缩数据
- 支持克隆复制
安装克隆插件
准备环境
Version==MySQLl8.0.18
1 | mysql> select version(); |
明确插件目录
Default Value:BASEDIR/lib/plugin
BASEDIR: MySQL的安装目录: /usr/local/mysql/
如果插件想被使用,插件库文件必须位于MySQL的插件目录下
现在我的MySQL解压安装到:/opt/soft/mysql80
MySQL初始化时必须指定 BASEDIR=/opt/soft/mysql80
否则启动时报错:
[ERROR] [MY-010901] [Server] Can’t open shared library……
[ERROR] [MY-010736] [Server] Couldn’t load plugin ……
如有必要在配置文件指定: plugin_dir=/opt/soft/mysql80/lib/plugin
启动加载插件
插件名称:mysql_clone.so
- 每次启动时 –plugin-load-add=mysql_clone.so 来加载
- 永久加载 my.cnf 配置文件声明
1 | [mysqld] |
验证插件
1.检查 INFORMATION_SCHEMA.PLUGINS
1 | mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS |
2.执行SHOW PLUGINS语句
1 | mysql> show plugins\G |
控制插件激活状态
1.插件已注册或加载,防止运行时插件被删除
–plugin_name=FORCE_PLUS_PERMANENT
1 | [mysqld] |
2.强制服务在插件运行时启动或不启动
–plugin_name=FORCE
告诉服务器插件启动,如果插件初始化失败,服务器不启动; 成功则服务器启动
本地克隆数据
描述
将本地MySQL实例的innodb数据,克隆到指定的目录,基于这个克隆数据立马拉起一个MySQL实例
涉及:一个MySQL实例,和一个额外的目录
克隆语句
CLONE LOCAL DATA DIRECTORY [=] ‘clone_dir’;
实践操作
1.基础环境
本地已运行MySQL8.0
版本:8.0.18
端口:3008
目录结构:
/work/mysql3008
├── etc
├── log
├── tmp
└── var
2.创建克隆账号 clone_user 权限:BACKUP_ADMIN
1 | mysql> create user clone_user@'%' identified by '123456'; |
3.执行克隆命令
克隆目录:/work/mysql_clone/var
克隆目录不能存在;但是目录路径必须存在;且有操作权限(mysql.mysql)
1 | mysql> CLONE LOCAL DATA DIRECTORY = '/work/mysql_clone/var'; |
4.恢复实例
补全
配置目录etc,并修改配置实例端口修改为3009
日志目录log,存放错误日志和慢日志文件
临时目录tmp,存放pid和socket文件
以及配置对应的目录权限
/work/mysql_clone
├── etc
├── log
├── tmp
└── var –克隆目录
基于克隆出来的 /work/mysql_clone/var 数据目录,我们直接启动3009实例
1 | shell>/opt/soft/mysql80/bin/mysqld_safe --defaults-file=/work/mysql_clone/etc/my3009.cnf --user=mysql & |
远程克隆数据
描述
远程克隆就是从远程MySQL服务器实例克隆数据,并将其传输到启动克隆操作的MySQL实例(也就是接受者)
远程克隆条件
前提条件:
- 在发送者和接受者实例上,克隆插件安装并且激活
- 克隆用户权限不同:【发送者:backup_admin】,【接受者:clone_admin】
- 克隆期间 阻止DDL操作和自动重启服务器
执行克隆语句时,还会检查以下条件:
- 相同的MySQL版本
- 相同的操作系统和平台
- 克隆所需足够的磁盘空间
- 访问表空间目录文件的权限
- 已激活的插件,两者必须一样
- 相同的MySQL服务器字符集和排序规则
- 相同page大小,相同大小和数量的ibdata
- 相同的文件系统块大小
- 接受者必须设置:发送者的主机地址列表
- 一次只能运行一次克隆操作
- max_allowed_packet至少2M
实践操作
克隆语句:
在接受者MySQL上执行的语句:
1 | CLONE INSTANCE FROM 'user'@'host':port |
默认:会尝试启用加密克隆
初始化两个全新的MySQL实例
发送者:MySQL3008 数据目录:/work/mysql3008/var
接受者:MySQL3009 数据目录:/work/mysql_clone/var
通过配置文件加载安装 克隆插件创建账号
2.1 登录发送者MySQL
a.创建具有backup_admin权限的用户1
2mysql> CREATE USER 'donor_clone_user'@'donorhost' IDENTIFIED BY '123456';
mysql> GRANT BACKUP_ADMIN on *.* to 'donor_clone_user'@'donorhost';2.2 登录接受者MySQL
a.创建具有clone_admin权限的用户1
2mysql> CREATE USER 'recipient_clone_user'@'recipienthost' IDENTIFIED BY '123456';
mysql> GRANT CLONE_ADMIN on *.* to 'recipient_clone_user'@'recipienthost';b.将发送者MySQL的地址添加到donor_list中
1
mysql> SET GLOBAL clone_valid_donor_list = 'donorhost:3008';
开始远程克隆
记得提前在发送者MySQL写入一些测试数据用于验证
用克隆账号:recipient_clone_user@recipienthost 登录接受者MySQL实例,执行克隆操作1
shell>/opt/soft/mysql80/bin/mysql -urecipient_clone_user -hrecipienthost -p -P3009
3.1 默认克隆目录(主要)
a.删除现有收件人数据目录,替换为克隆数据
b.执行克隆语句1
2mysql> CLONE INSTANCE FROM 'donor_clone_user'@'donorhost':3008
IDENTIFIED BY '123456';c.克隆完成,接受者MySQL会自动重启
1
2
3
4
5
6
7
8
9
10
11
12mysql> SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
+-----------+-----------+----------------------------+
| STAGE | STATE | END_TIME |
+-----------+-----------+----------------------------+
| DROP DATA | Completed | 2020-03-14 12:22:21.311334 |
| FILE COPY | Completed | 2020-03-14 12:22:22.729780 |
| PAGE COPY | Completed | 2020-03-14 12:22:22.831079 |
| REDO COPY | Completed | 2020-03-14 12:22:22.931449 |
| FILE SYNC | Completed | 2020-03-14 12:22:23.118212 |
| RESTART | Completed | 2020-03-14 12:22:26.420135 |
| RECOVERY | Completed | 2020-03-14 12:22:26.732953 |
+-----------+-----------+----------------------------+d.验证
此时数据已经变成和donor数据一致
再用recipient_clone_user登录3009,已经连不上了
用原donor账号登录验证测试数据已存在3.2 指定额外目录克隆
a.数据被克隆到接受者MySQL所在服务器的指定目录
b.基于克隆目录恢复一个新的MySQL实例,此处和本地克隆的恢复一样3.3 配置加密克隆
a.发送者(donor)的客户端证书和秘钥文件对接受者可用
有3个相关文件位于donor数据目录下:
ca.pem: 自签名证书颁发机构(CA)文件。
client-cert.pem: 客户端公钥证书文件
client-key.pem: 客户端私钥文件
b.在收件者MySQL实例上配置SSL
拷贝donor的3个文件到recipient的 etc 目录下,并赋mysql权限
管理员用户登录动态配置以下参数:1
2
3
4
5
6
7
8mysql> show variables like 'clone_ssl%';
+----------------+---------------------------------------+
| Variable_name | Value |
+----------------+---------------------------------------+
| clone_ssl_ca | /work/mysql_clone/etc/ca.pem |
| clone_ssl_cert | /work/mysql_clone/etc/client-cert.pem |
| clone_ssl_key | /work/mysql_clone/etc/client-key.pem |
+----------------+---------------------------------------+c.加密链接并克隆
recipient_clone_user登录,并执行:1
2
3mysql> CLONE INSTANCE FROM 'donor_clone_user'@'donorhost':3008
IDENTIFIED BY '123456'
REQUIRE SSL;d.验证
1
2
3
4
5
6
7
8
9
10
11
12mysql> SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
+-----------+-----------+----------------------------+
| STAGE | STATE | END_TIME |
+-----------+-----------+----------------------------+
| DROP DATA | Completed | 2020-03-14 13:22:39.039091 |
| FILE COPY | Completed | 2020-03-14 13:22:40.407540 |
| PAGE COPY | Completed | 2020-03-14 13:22:40.508822 |
| REDO COPY | Completed | 2020-03-14 13:22:40.609171 |
| FILE SYNC | Completed | 2020-03-14 13:22:40.812935 |
| RESTART | Completed | 2020-03-14 13:22:44.489856 |
| RECOVERY | Completed | 2020-03-14 13:22:44.813989 |
+-----------+-----------+----------------------------+
克隆复制
未完待续。。。。。。