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应用上去。

参考文档

官方博客:Clone: Create MySQL instance replica
The Clone Plugin
WL#9209: InnoDB: Clone local replica
WL#9210: InnoDB: Clone remote replica
WL#9682: InnoDB: Support cloning encrypted and compressed database
WL#9211: InnoDB: Clone Replication Coordinates
WL#11636: InnoDB: Clone Remote provisioning

本文作者 :zhaiwx_yinfeng

原文链接

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

MySQL8.0.17 - 初探 Clone Plugin的更多相关文章

  1. mysql8.0.17复制搭建及其gtid的1062和1032异常

    mysql8.0.17复制搭建及其gtid的1062和1032异常 参考资料: https://blog.csdn.net/wzy0623/article/details/91982743https: ...

  2. Navicat连接Mysql8.0.17出现1251错误 / 或者Navicat Premium出现2059错误

    Navicat连接Mysql8.0.17出现1251错误 重装了电脑之后,好多软件出了问题,经过一系列的插件安装,mysql终于安装好了 但是Navicat又抽筋了~~~额(⊙o⊙)... 在网上查的 ...

  3. windows10更换mysql8.0.17

    下载windows版本mysql 解压后创建my.ini文件初始化mysql和data文件夹用来存数据 my.ini内容 [mysqld] # 设置3306端口 port=3306 # 设置mysql ...

  4. Windows10搭建开发环境----MySQL8.0.17安装

    Windows10 MySQL8解压版最新最全图文安装配置 一.官网下载解压版安装包 MySQL官网 1. 进入官网点击downloads,如图: 2. 翻到网页底部,点击如图位置: 3. 点击MyS ...

  5. Mysql8.0.17安装(windows10)

    1.因为系统重装  又双叒叕开始了装mysql数据库 下载安装包 https://dev.mysql.com/downloads/mysql/ 2.解压到你想安装的地方 3.解压完是没有图红色框中的文 ...

  6. Mysql8.0.17版本不能自动创建activiti表的坑

    maven项目如下: 配置好数据库,和activiti的配置之后,开始执行流程部署 package com.yuanqiao.first_activiti.deployment; import jav ...

  7. MySQL8.0.17下载与安装

    下载环境:Windows 10 下载地址: https://dev.mysql.com/downloads/mysql/ 1.解压压缩包,修改解压目录. 2.在E:\mysql-8.0.17-winx ...

  8. MySQL8.0.17 - Multi-Valued Indexes 简述

    本文主要简单介绍下8.0.17新引入的功能multi-valued index, 顾名思义,索引上对于同一个Primary key, 可以建立多个二级索引项,实际上已经对array类型的基础功能做了支 ...

  9. 安装mysql8.0.17时候报错1251-Client does not support authentication protocol requested by server; consider upgrading MySQL client

    当mysql数据库安装时候选择的是加密密码时候,用navicat连接时候报错1521,这时候可以cmd之后登陆mysql执行下列代码就可以了 代码: mysql> alter user root ...

随机推荐

  1. dp转图论——cf1070A好题

    dp的状态转移很像一张有向图:每个状态为一个点,每中转移方案是一条有向边 本题要求是求出最小的数,那我们用状态[i,j]表示模i,数位和为j,那么从每个点出发的十条有向边代表[0,9]十个数 从每个状 ...

  2. python封装email模块

    一.代码 from email.mime.text import MIMEText from email.header import Header from email.utils import pa ...

  3. SqlSugar入门级教程+实例 (.net core下的)

    官方参考:http://www.codeisbug.com/Doc/8 前言:这应该是目前最好用的ORM框架之一了,而且支持.net core,网上除了官方文档其他参考就少了点,自己整理了一下,大致包 ...

  4. C# GZipStream 压缩 解压

    关于GZipStream压缩解压,网上找了很多资料,完整的不多,要么是针对字符串压缩解压缩的,要么只实现了针对单个文件的压缩解压缩,还有的不支持子文件夹的压缩,实用性都不是很大. 以下整理了压缩解压缩 ...

  5. mavlink 笔记1

    Packet Anatomy This is the anatomy of one packet. It is inspired by the CAN and SAE AS-4 standards. ...

  6. <Python基础>集合的基本操作

    #小知识点:返回对象的内存地址 i,j = 1,2 print(id(i),id(j)) #集合的基本操作, #相当于没有键值对的字典,里面的元素是无序且不重复的 #一般写法 s = set({1,2 ...

  7. ps axu 参数说明

    问题:1.ps axu  看到进程的time不清楚什么意思 ru: resin    31507  0.2  1.3 3569452 98340 ?       Sl   Jul28   7:11 / ...

  8. 小程序怎样控制rich-text中的<img>标签自适应

    小程序通过rich-text实现字符串转化为html,即 <rich-text node="{{html}}"></rich-text>.如果html字符串 ...

  9. thinkphp 区间查询

    ThinkPHP支持对某个字段的区间查询,例如: 富瑞华大理石平台厂家哪家好 $map['id'] = array(array('gt',1),array('lt',10)) ; 得到的查询条件是:  ...

  10. C++ Builder获取系统文件的路径

    取得路径的程序:(注意红色字体,由于博客显示问题,所以中间加了空格,大家自己把空格去掉即可) // -------------------------------------------------- ...