MySQL篇—自带物理克隆数据工具Clone插件介绍(第一篇,总共三篇)

    各位小伙伴,今天我为大家介绍一下MySQL Clone Plugin这个插件,简单来说,就是MySQL 8.0.17版本之后的一个物理克隆数据工具,它能够帮助我们快速、高效地克隆或复制数据库,极大地简化了数据库迁移、备份和恢复的过程,让我们在处理大量数据时更加得心应手。

    为了确保大家能够充分利用这个强大的工具,我们将分为三篇内容来详细介绍MySQL Clone Plugin。今天我们将从基础入手,首先深入探讨Clone的用途、使用的前提条件、存在的限制,以及它的备份原理。第二篇介绍Clone的本地克隆数据,第三篇介绍Clone的远程克隆数据,通过三篇的介绍我们将会深入了解这个插件是如何工作的,以及为什么它可以成为数据库管理员的得力助手。

    希望大家通过今天的分享,能够更好地理解和掌握MySQL Clone Plugin。在接下来的内容中,我们将一起探索这个工具的奥秘,为我们的数据库管理之旅增添更多便利和效率。现在,让我们开始第一篇的旅程吧!

点赞和关注,是我写文案的动力源泉!

官方文档对Clone Plugin的详细介绍:

MySQL :: MySQL 8.0 Reference Manual :: 5.6.7 The Clone Plugin


clone插件介绍:

    MySQL8.0.17中引入的克隆插件允许在本地或从远程MySQL服务器实例中克隆数据(传输数据)。存储的数据的物理快照。InnoDB它包括架构、表、表空间和数据字典元数据。所述克隆数据包括一个功能齐全的数据目录,该目录允许使用用于MySQL服务器配置的克隆插件。

    Clone Plugin是MySQL 8.0.17引入的一个重大特性,主要还是为Group Replication服务。在Group Replication中,添加一个新的节点,差异数据的补齐是通过分布式恢复(Distributed Recovery)来实现的。

    在MySQL 8.0.17之前,只支持一种恢复方式-Binlog。但如果新节点需要的Binlog已经被Purge了,这个时候,只能先借助于备份工具(XtraBackup,mydumper,mysqldump)做个全量数据的同步,然后再通过分布式恢复同步增量数据。实现添加节点的目的。

    其竞争对手PXC,默认集成了XtraBackup进行State Snapshot Transfer(类似于全量同步),而MongoDB则更进一步,原生就实现了Initial Sync同步全量数据。从易用性来看,单就集群添加节点这一项而言,MySQL确实不如其竞争对手。客户体验上,还有很大的提升空间。

    好在MySQL官方也正视到这个差距,终于在MySQL 8.0.17实现了Clone Plugin。当然,对于官方来说,实现这个特性并不算难,毕竟有现成的物理备份工具(MySQL Enterprise Backup)可供借鉴。

clone的用途:

1、SQL命令进行备份。
2、Slave节点快速搭建。
3、MGR节点快速扩充

clone Plugin与XtraBackup的对比:

ps:xtrabackup由Percona提供,开源工具,支持对InnoDB做热备,物理备份工具余后将独论xtrabackup之妙,需者敬请关注,共赴知识之宴。

1、在实现上,两者都有FILE COPY和REDO COPY阶段,但Clone Plugin比XtraBackup多了一个PAGE COPY,由此带来的好处是,Clone Plugin的恢复速度比XtraBackup更快。

2、XtraBackup没有Redo Archiving特性,有可能出现未拷贝的Redo日志被覆盖的情况。

3、GTID下建立复制,无需额外执行set global gtid_purged操作。

使用clone(克隆数据)插件的前提条件:

1、使用clone(克隆数据)插件的donor(源库)和recipient(目标库)MySQL版本(包括小版本)必须一致并且都要在8.0.17版本以上,且都要安装Clone Plugin。不然会报错:

ERROR 3864 (HY000): Clone Donor MySQL version: 8.0.20 is different from Recipient MySQL version 8.0.19.

2、主机的操作系统和位数(32位,64位)必须一致。两者可根据version_compile_os,version_compile_machine参数获取。

3、字符集(character_set_server),校验集(collation_server),character_set_filesystem必须一致。

4、innodb_page_size(页大小)必须一致。会检查innodb_data_file_path中ibdata的数量和大小。

5、目前Clone Plugin(8.0.20)的实现,无论是Donor,还是Recipient,同一时间,只能执行一个克隆操作。后续会支持多个克隆操作并发执行。不然会报错:

ERROR 3634 (HY000): Too many concurrent clone operations. Maximum allowed - 1.

6、Recipient需要重启,所以其必须通过mysqld_safe或systemd等进行管理。如果是通过mysqld进行启动,实例关闭后,需要手动启动。不然会报错:

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

clone(克隆数据)插件的限制:

1、8.0.17到8.0.26版本在克隆期间,允许DML不会影响正在执行的事务,DDL会被克隆的backup lock阻塞。不过可以通过设置clone_ddl_timeout参数在克隆期间允许DDL不过会导致克隆失败,在8.0.27版本新增clone_block_ddl参数在克隆期间允许DDL同时不会导致克隆失败。

2、Clone Plugin不会拷贝Donor(源库)的配置参数。

3Clone Plugin不会拷贝Donor(源库)的二进制日志文件。

4、Clone Plugin只会拷贝InnoDB表的数据,对于其它存储引擎的表只会拷贝表结构(mysql8.0废除了MyISAM、MEMORY存储引擎)

5、Donor(源库)实例中如果有表通过DATA DIRECTORY指定了绝对路径,在进行本地克隆时,会提示文件已存在。在进行远程克隆时,绝对路径必须存在且有可写权限。

6、不允许通过MySQL Router连接到Donor(源库)实例。

7、执行CLONE INSTANCE操作时,指定的Donor端口不能为X Protocol端口。

clone插件克隆数据的两种方式:

(1)本地克隆数据

    本地克隆操作从MySQL服务器实例中克隆数据,其中克隆操作启动到MySQL服务器实例运行的同一服务器或节点上的目录。

语法:

CLONE LOCAL DATA DIRECTORY [=] 'clone_dir';    ---用户需要有BACKUP_ADMIN权限

(2)远程克隆数据

    远程克隆操作涉及本地MySQL服务器实例(“recipient”)启动克隆操作的服务器,以及远程MySQL服务器实例(“donor”)源数据所在的位置。当对接收方启动远程克隆操作时,克隆的数据将通过网络从donor传输到recipient。默认情况下,远程克隆操作将删除recipient数据目录中的数据,并将其替换为已克隆的数据。还可以选择将数据复制到recipient上的其他目录,以避免删除现有数据。

语法:

CLONE INSTANCE FROM 'user'@'host':port

IDENTIFIED BY 'password'

[DATA DIRECTORY [=] 'clone_dir']

[REQUIRE [NO] SSL];     ---用户需要有BACKUP_ADMIN权限

DATA DIRECTORY是一个可选子句用于在接收端指定要克隆的数据的目录如果不想删除recipient原数据目录中的现有数据,可以使用此选项修改数据copy的目录,必须有绝对路径,且目录必须不存在不指定的话,则默认克隆到Recipient的数据目录下。

[REQUIRE [NO] SSL]显式指定在通过网络传输克隆数据时是否使用加密连接。如果不能满足显式规范,则返回错误。如果未指定SSL子句,克隆将在默认情况下尝试建立加密连接,如果安全连接尝试失败,则返回到不安全连接。无论是否指定此子句,克隆加密数据时都需要安全连接。

Clone plugin备份原理:

MYSQL> select * from performance_schema.clone_progress; 

克隆操作可细分为以下5个阶段

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

第一阶段:INIT

初始化一个克隆对象。需要持有backup lock, 阻止ddl进

第二阶段:FILE COPY(DROP DATA、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(PAGE COPY)

这里有两个动作:

    (1)开启redo archiving功能,从当前点开始存储新增的redo log,这样从当前点开始所有增量修改都不会丢失.

    (2)同时上一步在page track的page被发送到目标端。确保当前点之前所做的变更一定发送到目标端

关于redo archiving,实际上这是官方早就存在的功能,主要用于官方的企业级备份工具,但这里clone利用了该特性来维持增量修改产生的redo。在开始前会做一次check point,开启一个后台线程log_archiver_thread()来做日志归档。当有新的写入时(notify_about_advanced_write_lsn)也会通知他去archive当arch_log_sys处于活跃状态时,他会控制日志写入以避免未归档的日志被覆盖(log_writer_wait_on_archiver), 注意如果log_writer等待时间过长的话,archive任务会被中断掉。

第四阶段:REDO COPY(REDO COPY)

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

第五阶段:Done(FILE SYNC、RESTART、RECOVERY)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/341910.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Open CASCADE学习|创建旋转体

旋转体是一个几何概念,指的是通过旋转一个平面图形得到的立体图形。具体来说,一个平面图形绕着它所在的平面内的一条定直线旋转一周所形成的曲面,这个曲面会围成一个几何体,这个几何体就叫做旋转体。这条定直线被称为旋转体的轴。…

一、Sharding-JDBC系列01:整合SpringBoot实现分库分表,读写分离

目录 一、概述 二、案例演示-水平分表 (1)、创建springboot工程 (2)、创建数据库和数据表 (3)、application.yaml配置分片规则 (4)、测试数据插入、查询操作 4.1、插入-控制台SQL日志 4.2、查询-控制台SQL日志 三、案例演示-水平分库 (1)、创建数据库和数据表 (2…

JS逆向实战案例1——某房地产url动态生成

说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除 作者:zhu6201976 一、 反爬分析 url:aHR0cHM6Ly9uZXdob3VzZS4wNTU3ZmRjLmNvbQ 该站点项目url通过点击JS生成,project_id与生成后…

【uniapp】新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握

一、uniapp和HBuilderX介绍 uni-app官方网站:https://uniapp.dcloud.net.cn/ 为什么要学习uniapp? 1、一套代码可以打包到不同的应用平台;一套代码编到十几个平台,这不是梦想。眼见为实,扫描以下二维码,…

【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式

🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 懒汉式(Lazy Initialization): 双重检查锁定(Double-Checked Locking)…

antd时间选择器,设置显示中文

需求 在实现react,里面引入antd时间选择器,默认显示为英文 思路 入口处使用ConfigProvider全局化配置,设置 locale 属性为中文来实现。官方文档介绍全局化配置 ConfigProvider - Ant Design 代码 import React from react; import { Prov…

SpringBoot原理(@Conditional)—三种自动配置方法、步骤详解

简介:我们一直在说基于SpringBoot开发简单、快捷,但是总是不太清楚为什么会有这样的便利,对于开发人员来说我们不仅要知其然,还要知其所以然,这篇文章就是说明SpringBoot的底层原理,让读者对SpringBoot底层…

Emoji表情大全

等等... 推荐一下几个网站,去复制就可以啦! Emoji 表情大全All Emoji Symbols Are Collected Here, And Now Emoji Can Display On IOS, Android, OSX, And Windows Systems. Just The Symbol ✂ And 📋 To App, SMS, Facebook, Twitter An…

一卡通水控电控开发踩过的坑

最近在做一个项目,是对接一卡通设备的。我一开始只拿到设备和3个文档开局。不知道从哪下手。一步一步踩坑过来。踩了很多没有必要的坑,写出来给有用的人吧。 读卡器怎么用? 有个读卡器,一开始什么软件也不提供。我都不知道是干嘛…

基于JavaWeb+BS架构+SpringBoot+Vue+Hadoop的物品租赁系统的设计与实现

基于JavaWebBS架构SpringBootVueHadoop的物品租赁系统的设计与实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 目  录 I 1绪 论 1 1.1开发背景 1 1.2开发目的与意义 1 1.2.1开发目…

Rabbit R1是一款AI驱动的小工具,可以代替你使用应用程序

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

CES 2024丨引领变革,美格智能为智能终端带来生成式AI能力

作为电子行业的“风向标”,CES 2024(国际消费电子展)于1月9日至12日在美国拉斯维加斯举办。本届展会可谓是AI的盛宴,芯片、AI PC、智能家居、汽车科技、消费电子等领域与AI相关的前沿成果接连发布,引领人工智能领域的科…