背景

很神奇,5.7.17 和 8.0.17,连续两个17小版本都让人眼前一亮。前者加入了组复制(Group Replication)功能,后者加入了克隆插件(Clone Plugin)功能。今天我们实战测试一下这个新功能。

克隆插件简介

克隆插件允许在本地或从远程 MySQL 实例克隆数据。克隆数据是存储在 InnoDB 其中的数据的物理快照,其中包括库、表、表空间和数据字典元数据。克隆的数据包含一个功能齐全的数据目录,允许使用克隆插件进行 MySQL 服务器配置。

克隆插件支持两种克隆方式

本地克隆

远程克隆

本地克隆

本地克隆操作将启动克隆操作的 MySQL 服务器实例中的数据克隆到同服务器或同节点上的一个目录里

远程克隆

默认情况下,远程克隆操作会删除接受者(recipient)数据目录中的数据,并将其替换为捐赠者(donor)的克隆数据。(可选)您也可以将数据克隆到接受者的其他目录,以避免删除现有数据。

远程克隆操作和本地克隆操作克隆的数据没有区别,数据是相同的。

克隆插件支持复制。除克隆数据外,克隆操作还从捐赠者中提取并传输复制位置信息,并将其应用于接受者,从而可以使用克隆插件来配置组复制或主从复制。使用克隆插件进行配置比复制大量事务要快得多,效率更高。

实战部分

一、本地克隆
安装克隆插件

启动前

[mysqld]
    plugin-load-add=mysql_clone.so

或运行中

INSTALL PLUGIN clone SONAME 'mysql_clone.so';

| 第二种方法会注册到元数据,所以不用担心重启插件会失效。两种方法都很好用

检查插件有没有启用

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
    FROM INFORMATION_SCHEMA.PLUGINS
    WHERE PLUGIN_NAME LIKE 'clone';
    +-------------+---------------+
    | PLUGIN_NAME | PLUGIN_STATUS |
    +-------------+---------------+
    | clone | ACTIVE |
    +-------------+---------------+
    1 row in set (0.01 sec)

设置强制启动失败参数

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

| 如果克隆插件对你们很重要,可以设置clone=FORCE_PLUS_PERMANENT或clone=FORCE。作用是:如果插件未成功初始化,就会强制mysqld启动失败。
克隆需要的权限

需要有备份锁的权限。备份锁是 MySQL 8.0 的新特性之一,比5.7版本的flush table with read lock要轻量。

mysql> CREATE USER clone_user@'%' IDENTIFIED by 'password';
    mysql> GRANT BACKUP_ADMIN ON *.* TO 'clone_user'; # BACKUP_ADMIN是MySQL8.0 才有的备份锁的权限

执行本地克隆

mysql -uclone_user -ppassword -S /tmp/mysql3008.sock
    mysql> CLONE LOCAL DATA DIRECTORY = '/fander/clone_dir';

| 例子中需要 MySQL 的运行用户拥有 fander 目录的rwx权限,要求 clone_dir 目录不存在

本地克隆的步骤如下

DROP DATA

FILE COPY

PAGE COPY

REDO COPY

FILE SYNC

观察方法如下

mysql> SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
    +-----------+-------------+----------------------------+
    | STAGE | STATE | END_TIME |
    +-----------+-------------+----------------------------+
    | DROP DATA | Completed | 2019-07-25 21:00:18.858471 |
    | FILE COPY | Completed | 2019-07-25 21:00:19.071174 |
    | PAGE COPY | Completed | 2019-07-25 21:00:19.075325 |
    | REDO COPY | Completed | 2019-07-25 21:00:19.076661 |
    | FILE SYNC | Completed | 2019-07-25 21:00:19.168961 |
    | RESTART | Not Started | NULL |
    | RECOVERY | Not Started | NULL |
    +-----------+-------------+----------------------------+
    7 rows in set (0.00 sec)

当然还有另外一个观察方法

mysql> set global log_error_verbosity=3;
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> CLONE LOCAL DATA DIRECTORY = '/fander/clone6_dir';
    Query OK, 0 rows affected (0.24 sec)
     
    [root@192-168-199-101 data]# tailf mysql-error.err
    2019-07-25T22:22:58.261861+08:00 8 [Note] [MY-013457] [InnoDB] Clone Begin Master Task by root@localhost
    2019-07-25T22:22:58.262422+08:00 8 [Note] [MY-013457] [InnoDB] Clone Apply Master Loop Back
    2019-07-25T22:22:58.262523+08:00 8 [Note] [MY-013457] [InnoDB] Clone Apply Begin Master Task
    ...
    2019-07-25T22:22:58.471108+08:00 8 [Note] [MY-013458] [InnoDB] Clone Apply State FLUSH DATA:
    2019-07-25T22:22:58.472178+08:00 8 [Note] [MY-013458] [InnoDB] Clone Apply State FLUSH REDO:
    2019-07-25T22:22:58.506488+08:00 8 [Note] [MY-013458] [InnoDB] Clone Apply State DONE
    2019-07-25T22:22:58.506676+08:00 8 [Note] [MY-013457] [InnoDB] Clone Apply End Master Task ID: 0 Passed, code: 0:
    2019-07-25T22:22:58.506707+08:00 8 [Note] [MY-013457] [InnoDB] Clone End Master Task ID: 0 Passed, code: 0:

测试,起一个克隆的实例

/opt/mysql8.0/bin/mysqld --datadir=/fander/clone_dir --port=3333 --socket=/tmp/mysql3333.sock --user=mysql3008user --lower-case-table-names=1 --mysqlx=OFF
     
    #解释,因为我没有使用my.cnf,所以加了比较多参数
    #--datadir 指定启动的数据目录
    #--port 指定启动的MySQL监听端口
    #--socket 指定socket路径
    #--user `捐赠者`的目录权限是mysql3008user:mysql3008user,用户也是mysql3008user,我没有修改
    #--lower-case-table-names=1 同`捐赠者`
    #--mysqlx=OFF 不关闭的话,默认mysqlx端口会合`捐赠者`的33060重复冲突
     
    #登录检查
    mysql -uroot -proot -S /tmp/mysql3333.sock
    mysql> show master status\G # 可见GTID是`捐赠者`的子集,所以说明`接受者`直接和`捐赠者`建主从复制是很简单的

二、远程克隆
远程克隆的前提条件和限制

捐赠者和接受者都需要安装克隆插件

捐赠者和接受者分别需要有至少BACKUP_ADMIN/CLONE_ADMIN权限的账号

| 暗示了接受者必须先启动一个数据库实例(空或有数据的实例均可,因为都会被删除)

克隆目标目录必须有写入权限

克隆操作期间不允许使用 DDL,允许并发DML。要求相同版本号,您无法MySQL 5.7和MySQL 8.0之间进行克隆,而且要求版本>=8.0.17

同一平台同一架构,例如linux to windows、x64 to x32 是不支持。

足够的磁盘空间

可以克隆操作一般表空间,但必须要有目录权限,不支持克隆使用绝对路径创建的一般空间。与源表空间文件具有相同路径的克隆表空间文件将导致冲突

远程克隆时不支持CLONE INSTANCE FROM中通过使用mysqlx的端口

克隆插件不支持克隆MySQL服务器配置my.cnf等

克隆插件不支持克隆二进制日志。

克隆插件仅克隆存储的数据 InnoDB。不克隆其他存储引擎数据。MyISAM并且 CSV存储在包括sys模式的任何模式中的表都被克隆为空表。

不支持通过MySQL router连接到捐赠者实例。

一些参数是必须一致的,例如innodb_page_size、innodb_data_file_path、--lower_case_table_    names

如果克隆加密或页面压缩数据,则捐赠者和接收者必须具有相同的文件系统块大小

如果要克隆加密数据,则需要安全连接

clone_valid_donor_list 在接受者的设置必须包含捐赠者 MySQL 服务器实例的主机地址。

必须没有其他克隆操作正在运行。一次只允许一次克隆操作。要确定克隆操作是否正在运行,请查询该 clone_status表。

默认情况下,克隆数据后会自动重新启动接受者 MySQL 实例。要自动重新启动,必须在接收方上提供监视进程以检测服务器是否已关闭。否则,在克隆数据后,克隆操作将停止并出现以下错误,并且关闭接受者 MySQL 服务器实例:

ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).

| 此错误不表示克隆失败。这意味着必须在克隆数据后手动重新启动接受者的 MySQL 实例。

远程克隆实战

假设前提条件都满足,步骤如下

和本地克隆一样,远程克隆需要插件安装和用户授权。捐赠者、接受者的授权略有不同。

1. 确保捐赠者和接受者都安装了克隆插件

INSTALL PLUGIN clone SONAME 'mysql_clone.so';

2. 用户账号授权

捐赠者授权

mysql> CREATE USER clone_user@'192.168.199.101' IDENTIFIED by 'password1';
    mysql> GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'192.168.199.101'; # BACKUP_ADMIN是MySQL8.0 才有的备份锁的权限

接受者授权

mysql> CREATE USER clone_user@'192.168.199.102' IDENTIFIED by 'password2';
    mysql> GRANT CLONE_ADMIN ON *.* TO 'clone_user'@'192.168.199.102';

| CLONE_ADMIN权限 = BACKUP_ADMIN权限 + SHUTDOWN权限。SHUTDOWN仅限允许用户shutdown和restart mysqld。授权不同是因为,接受者需要restart mysqld。

3. 接受者设置捐赠者列表清单

mysql -uclone_user -ppassword2 -h192.168.199.102 -P3008
    mysql> SET GLOBAL clone_valid_donor_list = '192.168.199.101:3008';

| 这看起来是一个安全相关参数。多个实例用逗号分隔,例如“HOST1:PORT1,HOST2:PORT2,HOST3:PORT3”

接受者开始拉取克隆捐赠者数据

CLONE INSTANCE FROM clone_user@'192.168.199.101':3008
    IDENTIFIED BY 'password1';

远程克隆步骤如下

mysql> SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
    +-----------+-----------+----------------------------+
    | STAGE | STATE | END_TIME |
    +-----------+-----------+----------------------------+
    | DROP DATA | Completed | 2019-07-25 21:56:01.725783 |
    | FILE COPY | Completed | 2019-07-25 21:56:02.228686 |
    | PAGE COPY | Completed | 2019-07-25 21:56:02.331409 |
    | REDO COPY | Completed | 2019-07-25 21:56:02.432468 |
    | FILE SYNC | Completed | 2019-07-25 21:56:02.576936 |
    | RESTART | Completed | 2019-07-25 21:56:06.564090 |
    | RECOVERY | Completed | 2019-07-25 21:56:06.892049 |
    +-----------+-----------+----------------------------+
    7 rows in set (0.01 sec)

接受者如果非mysqld_safe启动的,会报错误,但不影响克隆,需要您人手启动mysqld即可。

ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).

实操后小结:克隆与xtrabackup的对比

克隆和xtrabackup备份都属于物理热备,备份恢复原理也近似。

克隆在恢复实例时需要先启动一个实例并授权,而xtrabackup不需要。

xtrabackup在backup后需要apply log,克隆是类似mysqlbackup提供的backup-and-apply-log,合并在一起做。

xtrabackup备份文件的权限等于执行命令的人的权限,恢复实例时需要人手chown回实例权限,克隆备份后权限和原数据权限一致,无需再人手chown,方便恢复。

xtrabackup恢复时需要在mysql中执行reset master;然后set global gtid_purged="UUID:NUMBER",具体的UUID:NUMBER的值为备份文件中的xtrabackup_info文件的内容;克隆不需要这个操作步骤,默认克隆完就可以建立复制了。

xtrabackup备份完一般是scp拷贝到另外一台机器恢复,走的是22端口;克隆走的是MySQL的监听端口。所以在目录权限正确的情况下,甚至根本不需要登录Linux服务器的权限。如下:

[root@192-168-199-103 ~]# mysql -uroot -ppassword2 -h192.168.199.102 -P3008 -e "SET GLOBAL clone_valid_donor_list = '192.168.199.101:3008';"
     
    mysql: [Warning] Using a password on the command line interface can be insecure.
    [root@192-168-199-103 ~]# mysql -uroot -ppassword2 -h192.168.199.102 -P3008 -e "CLONE INSTANCE FROM root@'192.168.199.101':3008 IDENTIFIED BY 'password1';"
    mysql: [Warning] Using a password on the command line interface can be insecure.

三、利用克隆建立主从复制

克隆出来的接受者实例,可以与捐赠者建立主从复制。当然建立组复制也是可以的,鉴于篇幅的原因,不做示例有兴趣可以阅读官方文档18.4.3.1节“克隆分布式恢复”。

| https://dev.mysql.com/doc/refman/8.0/en/group-replication-cloning.html

传统复制时,通过以下命令查看postion位置

mysql> SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;
    +------------------+-----------------+
    | BINLOG_FILE | BINLOG_POSITION |
    +------------------+-----------------+
    | mysql-bin.000014 | 2179 |
    +------------------+-----------------+
    1 row in set (0.01 sec)

GTID复制时,通过以下命令查看GTID位置

mysql> SELECT @@GLOBAL.GTID_EXECUTED;
    +-------------------------------------------+
    | @@GLOBAL.GTID_EXECUTED |
    +-------------------------------------------+
    | 990fa9a4-7aca-11e9-89fa-000c29abbade:1-11 |
    +-------------------------------------------+
    1 row in set (0.00 sec)

假设已经有如下授权,我们就可以建立复制啦

create user repl@'%' identified WITH 'mysql_native_password' by 'password';
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';

建立GTID主从复制关系

(接受者上)

CHANGE MASTER TO
    MASTER_HOST='192.168.199.101',
    MASTER_USER='repl',
    MASTER_PASSWORD='password',
    MASTER_PORT=3008,
    MASTER_AUTO_POSITION=1;

监控克隆操作

检查克隆进度

mysql> SELECT STATE FROM performance_schema.clone_status;
    +-----------+
    | STATE |
    +-----------+
    | Completed |
    +-----------+
    1 row in set (0.00 sec)

SELECT STATE, ERROR_NO, ERROR_MESSAGE FROM performance_schema.clone_status;

检查克隆是否出错

mysql> 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)

检查克隆次数

show global status like 'Com_clone'; # `捐赠者` 每次+1,`接受者` 0

随时可以kill掉克隆

使用
    SELECT * FROM performance_schema.clone_status\G
    或
    show processlist
    查看线程ID,然后kill ID

总结

克隆功能非常有趣。他操作简单,可以用于快速搭建、恢复主从复制或组复制,可以部分取代开源热备软件xtrabackup,期待未来官方会把他做得越来越好,功能越来越丰富。
————————————————
版权声明:本文为CSDN博主「actiontech」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/actiontech/article/details/98054877

实战 MySQL 8.0.17 Clone Plugin(转)的更多相关文章

  1. macOS 下的 MySQL 8.0.17 安装与简易配置

    如果我写的这篇你看不懂,可能网上也没有你能看懂的教程了 虽然这篇针对的是8.0.x版本,但是关于MySQL配置之类的方法还是通用的 环境信息与适用范围 环境信息 环境/软件 版本 macOS macO ...

  2. RedHat 7.6 安装 Mysql 8.0.17

    # 查看是否安装mysql rpm -qa | grep -i mysql # 如果有,需要卸载旧版本Mysql及相关依赖包 rpm -e MySQL-client-*** # 查看开机启动服务列表状 ...

  3. window 下如何恢复被删除的mysql root账户及密码(mysql 8.0.17)

    不久前自学完完sql,下了mysql8.0.17,安装配置好后探索着,想着用root账户登上去能不能删除root账户呢,然后就想给自己一巴掌,,, 如何快速恢复root: 1.关闭mysql服务:wi ...

  4. window10 安装Mysql 8.0.17以及忘记密码重置密码

    一.安装Mysql8.0.17 1:首先去官网下载安装包 下载地址:https://dev.mysql.com/downloads/mysql/ 2:将解压文件解压到你安装的目录:D:\mysql\m ...

  5. mysql 8.0.17 安装配置方法图文教程

    1.URL:https://www.jb51.net/article/167782.htm 2.装好之后需要使用add user中的用户名和密码登录(之前安装数据库时出现的) 使用navicat连接时 ...

  6. mysql 8.0.17 安装与使用

    目录 写在前面 MySQL 安装 重置密码 使用图形界面软件 Navicat for SQL 写在前面 以前包括现在接到的项目,用的最多的关系型数据库就是SqlServer或者Oracle.后来因为接 ...

  7. Linux(Contos7)下使用SSH远程安装MySQL 8.0.17 完整笔记

    1. 使用putty 配置远程服务器连接,登录服务器. 由于没有指定下载包 使用 yum install mysql-server  提示 未指定包,如: 2. 因为甲骨文的收购了Mysql并且对My ...

  8. MySQL8.0.17 - 初探 Clone Plugin

    MySQL8.0.17推出了一个重量级的功能:clone plugin.允许用户可以将当前实例进行本地或者远程的clone.这在某些场景尤其想快速搭建复制备份或者在group replication里 ...

  9. MySQL 8 新特性之Clone Plugin

    Clone Plugin是MySQL 8.0.17引入的一个重大特性,为什么要实现这个特性呢?个人感觉,主要还是为Group Replication服务.在Group Replication中,添加一 ...

随机推荐

  1. nginx 配置状态监控

    Nginx有内置一个状态页,需要在编译的时候指定参数--with-http_stub_status_module参数方可打开.也就是说,该功能是由http_stub_status_module模块提供 ...

  2. 【Activiti学习之六】BPMN任务

    环境 JDK 1.8 MySQL 5.6 Tomcat 7 Eclipse-Luna activiti 6.0 一.任务任务表示流程中将要完成的工作. 1.任务继承 2.任务类型Service Tas ...

  3. zabbix 搭建 mysql 连接报错

    如图所示: 查看 MySQL的配置文件 [root@zbxtest ~]# cat /etc/my.cnf [mysqld] datadir=/data/mysql socket=/data/mysq ...

  4. kali渗透

    局域网-断网&劫持(kali)   1.查看局域网中的主机 fping –asg 192.168.1.0/24 2.断网 arpspoof -i wlan0 -t 192.168.100 19 ...

  5. Linux文件内容查看相关命令

    1.more命令 在Linux中,more命令是一个基于vi编辑器的文本过滤器,它能以全屏的方式按页显示文本文件的内容,more里面内置了一些快捷键. (1)命令语法 more(选项)(参数) (2) ...

  6. ipv4的ip字符串转化为int型

    要求: 将现有一个ipv4的ip字符串(仅包含数字,点,空格), 其中数字和点之间的空格(至多一个)是合法的,比如“12 .3. 4 .62”,其他情况均为非法地址.写一个函数将ipv4地址字符串转化 ...

  7. 『正睿OI 2019SC Day5』

    网络流 网络流的定义 一个流网络\(G=(V,E)\)为一张满足以下条件的有向图: 每一条边有一个非负容量,即对于任意\(E\)中的\((u,v)\) , 有\(c(u,v)\geq0\). 如果\( ...

  8. Java学习:List接口

    List接口 java.util.list接口 extends Collection接口 List接口的特点: 有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出123) 有索引,包含了一 ...

  9. WPF解决WindowsFormsHost背景透明

    项目案例:WPF使用WindowsFormsHost播放视频,视频上显示边框.字幕等特效: 难点问题 1.WindowsFormsHost不支持背景透明: 2.WPF Panel.ZIndex无效,W ...

  10. wangeditor视频

    wangeditor网址http://www.wangeditor.com/ 目前使用的是3.11版本 使用步骤 1.引用wangEditor.min.js 2.代码 2.1 取得函数var E = ...