MySQL8.0.17推出了一个重量级的功能:clone plugin。允许用户可以将当前实例进行本地或者远程的clone。这在某些场景尤其想快速搭建复制备份或者在group replication里加入新成员时非常有用。本文主要试玩下该功能,并试图阐述下其实现的机制是什么。

我们以本地clone为例,因为去除网络部分,理解起来会相对简单点。 也不会过度接触代码部分,仅仅做简单的原理性阐述

示例

本地clone

本地clone无需启动额外mysqld, 只要在实例上执行一条sql语句,指定下目标目录即可:

CLONE LOCAL DATA DIRECTORY [=] 'clone_dir';root@test 03:49:43>SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
+-----------+-------------+----------------------------+
| STAGE     | STATE       | END_TIME                   |
+-----------+-------------+----------------------------+
| DROP DATA | Completed   | 2019-07-26 12:07:12.285611 |
| FILE COPY | Completed   | 2019-07-26 12:07:18.270998 |
| PAGE COPY | Completed   | 2019-07-26 12:07:18.472560 |
| REDO COPY | Completed   | 2019-07-26 12:07:18.673061 |
| FILE SYNC | Completed   | 2019-07-26 12:07:32.090219 |
| RESTART   | Not Started | NULL                       |
| RECOVERY  | Not Started | NULL                       |
+-----------+-------------+----------------------------+
7 rows in set (0.00 sec)

需要BACKUP_ADMIN权限

远程clone:

CLONE INSTANCE FROM USER@HOST:PORT
IDENTIFIED BY 'password'
[DATA DIRECTORY [=] 'clone_dir']
[REQUIRE [NO] SSL];

mysql> SET GLOBAL clone_valid_donor_list = 'example.donor.host.com:3306';
mysql> CLONE INSTANCE FROM clone_user@example.donor.host.com:3306

   IDENTIFIED BY 'password';

mysql> CLONE INSTANCE FROM user_name@example.donor.host.com:3306

   IDENTIFIED BY 'password'DATA DIRECTORY = '/path/to/clone_dir';
  • 需要指定绝对路径,并且路径目录必须不存在
  • 在接受机器上启动mysqld,执行上述语句连接到目标机器,就能从目标机器上clone数据到本地,注意如果没有指定data directory的话,就默认配置的目录,已有的文件会被清理掉,并在clone完成后重启
  • 两个实例上都需要安装clone plugin
  • 必须有相同的字符集设置

官方文档列出的一些限制:

  1. ddl包括truncate table在clone期间不允许执行 //被block住
  2. An instance cannot be cloned from a different MySQL server version. The donor and recipient must have the same MySQL server version.
  3. the X Protocol port specified by mysqlx_port is not supported for remote cloning operations
  4. The clone plugin does not support cloning of MySQL server configurations
  5. 不支持clone binlog
  6. The clone plugin only clones data stored in InnoDB. Other storage engine data is not cloned
  7. Connecting to the donor MySQL server instance through MySQL Router is not supported.
  8. Local cloning operations do not support cloning of general tablespaces that were created with an absolute path. A cloned tablespace file with the same path as the source tablespace file would cause a conflict.

主要流程

主要流程包含如下几个过程:

[INIT] ---> [FILE COPY] ---> [PAGE COPY] ---> [REDO COPY] -> [Done]

INIT阶段

需要持有backup lock, 阻止ddl进行

FILE COPY

按照文件进行拷贝,同时开启page tracking功能,记录在拷贝过程中修改的page, 此时会设置buf_pool->track_page_lsn为当前lsn,track_page_lsn在flush page阶段用到:

buf_flush_page:if (!fsp_is_system_temporary(bpage->id.space()) &&buf_pool->track_page_lsn != LSN_MAX) {page_t *frame;lsn_t frame_lsn;frame = bpage->zip.data;if (!frame) {frame = ((buf_block_t *)bpage)->frame;}frame_lsn = mach_read_from_8(frame + FIL_PAGE_LSN); //对于在track_page_lsn之后的page, 如果frame_Lsn大于track_page_lsn, 表示已经记录下page id了,无需重复记录arch_page_sys->track_page(bpage, buf_pool->track_page_lsn, frame_lsn,false);  // 将page id记录下来,表示在track_page_lsn后修改过的page}会创建一个后套线程page_archiver_thread(),将内存记录的page id flush到disk上

PAGE COPY

这里有两个动作

  • 开启redo archiving功能,从当前点开始存储新增的redo log,这样从当前点开始所有的增量修改都不会丢失
  • 同时上一步在page track的page被发送到目标端。确保当前点之前所做的变更一定发送到目标端

关于redo archiving,实际上这是官方早就存在的功能,主要用于官方的企业级备份工具,但这里clone利用了该特性来维持增量修改产生的redo。 在开始前会做一次checkpoint, 开启一个后台线程log_archiver_thread()来做日志归档。当有新的写入时(notify_about_advanced_write_lsn)也会通知他去archive

当arch_log_sys处于活跃状态时,他会控制日志写入以避免未归档的日志被覆盖(log_writer_wait_on_archiver), 注意如果log_writer等待时间过长的话, archive任务会被中断掉

Redo Copy

停止Redo Archiving", 所有归档的日志被发送到目标端,这些日志包含了从page copy阶段开始到现在的所有日志,另外可能还需要记下当前的复制点,例如最后一个事务提交时的binlog位点或者gtid信息,在系统页中可以找到

Done

目标端重启实例,通过crash recovery将redo log应用上去。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

MySQL8.0.17 - 初探 Clone Plugin相关推荐

  1. 【MySQL主从复制】使用MySQL8.0.17的clone技术在线搭建主从复制环境

    [MySQL主从复制]使用MySQL8.0.17的clone技术在线搭建主从复制环境 参考:https://www.xmmup.com/dbbao33shiyongmysql8-0-17declone ...

  2. mysql-8.0.17解压版安装步骤及MySQL服务无法启动问题的解决办法

    mysql-8.0.17解压版安装步骤及MySQL服务无法启动问题的解决办法 参考文章: (1)mysql-8.0.17解压版安装步骤及MySQL服务无法启动问题的解决办法 (2)https://ww ...

  3. CentOS 7.6 安装 Mysql8.0.17 rpm-bundle.tar解包 rpm安装(个人未验证)

    安装环境:虚拟机 VMware 15 Pro,CentOS 7.6 (1810) 连接工具:Navicat Premium 12,Xshell Plus 提取码:vilj 注:本文所有操作均已实测,如 ...

  4. mysql8删除root用户,Window下如何恢复被删除的Mysql8.0.17 Root账户及密码

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

  5. mysql8.0.17下载教程_Mysql8.0.17安装教程【推荐】

    Mysql8.0.17安装教程[推荐] 1.因为系统重装 又双叒叕开始了装myql数据库 2.解压到你想安装的地方 3.解压完是没有图红色框中的文件的 需要你配置my.ini文件 data文件夹是等会 ...

  6. mysql8实战_实战MySQL8.0.17 Clone Plugin

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

  7. Mysql8.0.17压缩包安装——超详细简单教程

    一.Mysql下载 压缩包下载:https://dev.mysql.com/downloads/mysql/ MSI下载:https://dev.mysql.com/downloads/windows ...

  8. mysql8.0.17数据库的搭建-windows

    1.下载mysql 下载地址:https://dev.mysql.com/downloads/mysql/ 随即下载成功,解压 2.配置环境变量 变量名:MYSQL_HOME 变量值:D:\Progr ...

  9. mysql8.0.17下载教程_mysql 8.0.17 安装配置图文教程

    1.下载安装包 下载地址:安装包 2.解压安装包到目录 这里解压到了D:\mysql-8.0.17-winx64 (图中有些文件是后续安装步骤生成的) 3.配置环境变量 我的电脑→右键→属性→高级系统 ...

最新文章

  1. 开启nginx状态监控
  2. 【Matlab 控制】构建系统,绘制零极点
  3. 阿里云RPA(机器人流程自动化)干货系列之一:认识RPA(上)
  4. 枚举值是什么意思_期权的Theta值是什么意思?有什么意义?
  5. 反射: 反射在中Android运用
  6. java 使用qq邮箱发送邮件报错 port: 465, response: 550 错误
  7. 软件项目开发流程逻辑图
  8. 数字频率计c语言程序,数字频率计中C语言编程的研究
  9. 创建mysql表sql语句_mysql创建表的sql语句
  10. 第九组 通信3班 063 防火墙配置
  11. 雷电3菊链功能_雷电3接口是什么
  12. 淘宝评论数据抓取简记
  13. 2022UI自动化测试框架搭建 —— yaml文件管理定位元素
  14. 如何通过API接口获取item_get_pro - 获得淘宝商品详情高级版
  15. 学海灯塔课后题答案模块上线
  16. 7.20日 ksjsb上车说明及注意事项
  17. android stduio 安装包解析错误的一种解决方法
  18. win10 家庭版 没有「本地用户和组」
  19. 足球小游戏h5《一球成名》,优秀创意h5案例欣赏
  20. 如何更好的学习计算机知识

热门文章

  1. 一行代码蒸发64亿人民币!黑客盯上区块链漏洞!Python真的变态!
  2. mysql选取最小值_MySQL:选择x最小值
  3. 怎么制作游戏脚本_精彩的游戏视频混剪怎么做?录屏剪辑一站式制作
  4. 【LeetCode笔记】55. 跳跃游戏(Java、贪心法)
  5. effective python目录_Effective python(七):协作开发
  6. leetcode 145 --- 二叉树后序遍历
  7. android手机解除root,手机显示被root什么意思(手机root怎么解除)
  8. 编译php时的configure,PHP编译configure时常见错误
  9. web中间件_常见web中间件拿shell
  10. java计算雷达扫描范围_雷达扫描 - linyinmobayu - 博客园