记录分享工作的点点滴滴

0%

MySQL8.0 新特性 -- 克隆插件

克隆插件简介

从MySQL 8.0.17开始,MySQL提供了一个克隆插件,允许在本地或从远程MySQL服务器实例克隆InnoDB其中的数据的物理快照。

  • 支持两种克隆方式:本地克隆和远程克隆
  • 支持克隆加密数据
  • 支持克隆压缩数据
  • 支持克隆复制

安装克隆插件

准备环境

Version==MySQLl8.0.18

1
2
3
4
5
6
7
mysql> select version();  
+-----------+
| version() |
+-----------+
| 8.0.18 |
+-----------+
1 row in set (0.00 sec)

明确插件目录

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

  1. 每次启动时 –plugin-load-add=mysql_clone.so 来加载
  2. 永久加载 my.cnf 配置文件声明
1
2
[mysqld]  
plugin-load-add=mysql_clone.so

验证插件

1.检查 INFORMATION_SCHEMA.PLUGINS

1
2
3
4
5
6
7
8
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME = 'clone';
+------------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+------------------------+---------------+
| clone | ACTIVE |
+------------------------+---------------+

2.执行SHOW PLUGINS语句

1
2
3
4
5
6
7
8
mysql> show plugins\G  
*************************** 45. row ***************************
Name: clone
Status: ACTIVE
Type: CLONE
Library: mysql_clone.so
License: GPL
45 rows in set (0.00 sec)

控制插件激活状态

1.插件已注册或加载,防止运行时插件被删除

–plugin_name=FORCE_PLUS_PERMANENT

1
2
3
[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT

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
2
mysql> create user clone_user@'%' identified by '123456';  
mysql> GRANT BACKUP_ADMIN ON *.* TO 'clone_user';

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实例(也就是接受者)

远程克隆条件

前提条件:

  1. 在发送者和接受者实例上,克隆插件安装并且激活
  2. 克隆用户权限不同:【发送者:backup_admin】,【接受者:clone_admin】
  3. 克隆期间 阻止DDL操作和自动重启服务器

执行克隆语句时,还会检查以下条件:

  1. 相同的MySQL版本
  2. 相同的操作系统和平台
  3. 克隆所需足够的磁盘空间
  4. 访问表空间目录文件的权限
  5. 已激活的插件,两者必须一样
  6. 相同的MySQL服务器字符集和排序规则
  7. 相同page大小,相同大小和数量的ibdata
  8. 相同的文件系统块大小
  9. 接受者必须设置:发送者的主机地址列表
  10. 一次只能运行一次克隆操作
  11. max_allowed_packet至少2M

实践操作

克隆语句:
在接受者MySQL上执行的语句:

1
2
3
4
CLONE INSTANCE FROM 'user'@'host':port  
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];

默认:会尝试启用加密克隆

  1. 初始化两个全新的MySQL实例
    发送者:MySQL3008 数据目录:/work/mysql3008/var
    接受者:MySQL3009 数据目录:/work/mysql_clone/var
    通过配置文件加载安装 克隆插件

  2. 创建账号

  • 2.1 登录发送者MySQL
    a.创建具有backup_admin权限的用户

    1
    2
    mysql> 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
    2
    mysql> 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';
  1. 开始远程克隆
    记得提前在发送者MySQL写入一些测试数据用于验证
    用克隆账号:recipient_clone_user@recipienthost 登录接受者MySQL实例,执行克隆操作

    1
    shell>/opt/soft/mysql80/bin/mysql -urecipient_clone_user -hrecipienthost -p -P3009

    3.1 默认克隆目录(主要)
    a.删除现有收件人数据目录,替换为克隆数据
    b.执行克隆语句

    1
    2
    mysql> CLONE INSTANCE FROM 'donor_clone_user'@'donorhost':3008
    IDENTIFIED BY '123456';

    c.克隆完成,接受者MySQL会自动重启

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    mysql> 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
    8
    mysql> 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
    3
    mysql> 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
    12
    mysql> 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 |
    +-----------+-----------+----------------------------+

克隆复制

未完待续。。。。。。