与MySQL DDL 对比分析OceanBase DDL的实现

news2024/11/19 7:49:22

本文将简要介绍OceanBase的DDL实现方式,并通过与MySQL DDL实现的对比,帮助大家更加容易理解。

MySQL DDL 的算法

MySQL 的DDL实现算法主要有 copy、inplace和instant。

copy

copy算法的实现相对简单,MySQL首先会创建一个临时表,随后将源表的所有数据复制到这个临时表中。在数据复制的过程中,源表将无法进行数据写入操作。待临时表的数据写入完成后,MySQL会用这个临时表来替换原有的源表。

copy 算法会对表进行锁定,所以该种算法下的DDL属于Offline DDL,在执行DDL的时候,不能并发写操作,并且因为是copy数据,所以速度也相对较慢。

inplace

inplace 算法属于 Online DDL,根据是否需要重建表,又分为了rebuild 和 no-rebuild。

no-rebuild 不需要重建表,只需要修改表的元数据,所以速度很快。

rebuild 是需要重建表的,虽然不会创建临时表,但是实际底层的实现还是会创建新的 ibd 文件最后切换,相当于物理文件的“copy”。这个操作是 Online的,但并不是说不会锁表,其实中间会经历两次MDL 写锁,会影响写操作,只不过因为持有时间非常短,所以业务基本无感知。

instant

对于一些inplace需要重建表的操作,可以通过instant来实现快速执行,因为它只需要修改数据数据字典中的内容而不再需要重建表,最典型的就是立刻加列。立刻加列完成后,当需要查询表中数据时,会将新增列的默认值追加到读取的数据后面并返回。

当然,在实际业务中,大部分的MySQL DDL操作都是原生+工具结合的方式来做的,支持
no-rebuild和instant的DDL使用原生,其他的DDL则使用工具,比如 pt-osc、gh-ost。

OceanBase的DDL实现

OB的DDL包括 Online DDL 和 Offline DDL,其中 Online DDL 不影响读写,Offline DDL会堵塞写操作,直至DDL完成,这期间读操作不受影响。

Offline DDL

OB 的 Offline DDL 使用的是两表双写的方案

两表双写方案的思路是新建一张临时的隐藏表格(对用户不可见)用于双写,同时在后台将原表的数据补全到新建的临时表格中,然后将原表重命名为一个另外的临时表格,将补全数据的临时表格重命名为原表原来的名字,最后将原表的删除。

  1. 用户发起对 Src Table (T1) 的DDL操作;
  2. 停读写并新建隐藏表:停读写,新建一张隐藏表 Temp Table(T2),T2 是基于 T1 做 DDL得到的Schema,假设此时的Schema Version为S1
  3. 等事务结束:等待表格 T1 的所有分区上使用过比Schema Version S1小的事务都结束,获取一个快照点
  4. 主表补全:基于步骤3上获取的快照点,扫描表 T1 的数据,按照 T2 的Schema形式排序并写入表 T2
  5. 依赖对象数据重建:重建索引表、约束等
  6. 表名切换:将T1命名为T3,T2命名为T1,假设此时Schema Version S2
  7. 写Barrier日志:每个分区独立处理写Barrier日志
  8. 恢复读写:允许新表格上的读写
  9. 删除原表:将表T3删除

从上面的流程可以看出来,Offline DDL 的实现其实跟 MySQL 的 COPY 方式实现原理非常的像,不过OB因为是分布式数据库,所以会加入很多分布式数据库的元素以及保障,并且底层做了很多性能的优化。

Online DDL

Online DDL 主要有两种,原表上操作,比如列重命名,基本上只需要修改元数据信息,这个操作会非常的快;如果是新增索引的操作,是需要重整非原表数据的,具体的耗时跟表的数据量成正比。

拿创建全局索引流程来举例:

简单来说会在创建索引开始时,拿到一个快照点,根据当前快照获取存量数据,并且排序并生成索引。全量数据获取完成后,获取增量数据,最后改成一个可读可写的状态,然后这个索引就可以用来做查询优化了。

建索引因为是ONLINE 操作,所以执行过程中是不会堵塞读写操作的。

当前版本支持的Online DDL 和 Offline DDL

下面支持的操作对应的版本是 OceanBase v4.2.2 社区版本。

Online DDL操作:

Offline DDL操作:

DDL 执行以及进度查询

DDL 语法跟MySQL是完全相同的,这里就不过多赘述了。

查看DDL进度

OB 提供了实时 DDL 进度展示功能,通过查询 GV$SESSION_LONGOPS 视图,可以展示 DDL 操作的执行状态和进度。

mysql> select * from oceanbase.gv$session_longops\G;

各个字段含义:

  • sid:现在没有填值,为默认的 -1。
  • trace_id: OBServer 程序日志的ID,可以用该ID来搜索相关的日志文件。
  • opname:建索引时,会展示 create index 信息。
  • target:建索引时,展示正在创建的索引名。
  • svr_ip: 调度任务在哪个 OBServer 执行。
  • svr_port:调度任务在哪个 OBServer 执行。
  • start_time:索引构建开始时间,这里只精确到日期,跟 Oracle 是兼容的。
  • elapsed_seconds: 索引构建执行的时间,单位为秒。
  • time_remaining: 兼容 Oracle 的字段,暂时还没有实现剩余时间预测的能力。
  • last_update_time: 统计信息收集的时间,也是精确到日期,跟 Oracle 是兼容的。
  • message:里面包含了多个信息,ENANT_ID为租户 ID,TASK_ID为DDL 的任务 ID,STATUS 为 DDL 执行到的状态,REPLICA BUILD 指的是数据补全阶段,索引数据补全主要分为扫描主表数据,排序,写入到索引表阶段,三个阶段处理的行数分别对应于ROW_SCANNED, ROW_SORTED 和 ROW_INSERTED,因排序阶段可能会进行多轮归并,所以ROW_SORTED 的行数通常比 ROW_SCANNED 和 ROW_INSERTED 要多。

写在最后

OceanBase因为是分布式数据库,所以DDL其实还设计很多分布式相关的底层逻辑实现,比如多副本如何调度、主备库怎么同步等等,这里就不详细介绍了。如果大家想要了解更详细的细节,可以到OceanBase官网或者问答区咨询。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器c盘爆满了,这几种方法可以帮助C盘“瘦身”

我们在使用服务器的时候基本不会在C盘安装软件,那么用久了发现C盘满了,提示空间不足?那么这是怎么回事,为什么空间会占用这么快呢? 原因一: C盘满了,很可能是因为电脑里的垃圾文件过多。操作系…

Servlet的request对象

request对象的继承关系 1.HttpServletRequest接口继承了ServletRequest接口,对其父接口进行了扩展,可以处理满足所有http协议的请求 2.HttpServletRequest和ServletRequest都是接口,不能创建对象,因此在tomcat底层定义实现类并创…

Google Find My Device:科技守护,安心无忧

在数字化的时代,我们的生活与各种智能设备紧密相连。而 Google Find My Device 便是一款为我们提供安心保障的实用工具。 一、Find My Decice Netword的定义 谷歌的Find My Device Netword旨在通过利用Android设备的众包网络的力量,帮助用户安全的定位所…

考场作弊行为自动抓拍分析系统

考场作弊行为自动抓拍分析系统采用了AI神经网络和深度学习算法,考场作弊行为自动抓拍分析系统通过人形检测和骨架勾勒等技术,实时计算判断考生的异常动作行为。通过肢体动作识别技术,系统可以详细分析考生的头部和手部肢体动作,进…

【oracle004】oracle内置函数手册总结(已更新)

1.熟悉、梳理、总结下oracle相关知识体系。 2.日常研发过程中使用较少,随着时间的推移,很快就忘得一干二净,所以梳理总结下,以备日常使用参考 3.欢迎批评指正,跪谢一键三连! 总结源文件资源下载地址&#x…

Google发布的CAT3D,在1分钟内,能够从任意数量的真实或生成的图像创建3D场景。

给定任意数量的输入图像,使用以这些图像为条件的多视图扩散模型来生成场景的新视图。生成的视图被输入到强大的 3D 重建管道,生成可以交互渲染的 3D 表示。总处理时间(包括视图生成和 3D 重建)仅需一分钟。 相关链接 论文&#x…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十一)

课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 18 节) P18《17.ArkUI-状态管理Observed 和 ObjectLink》 第一件事:嵌套对象的类型上加上 Observed 装饰器…

晶体振荡器

一、晶振与晶体区别 晶振是有源晶振的简称,又叫振荡器,英文名称是oscillator,内部有时钟电路,只需供电便可产生振荡信号;晶体是无源晶振的简称,也叫谐振器,英文名称是crystal,是无极…

C++第三方库【JSON】— jsoncpp

目录 认识JSON jsoncpp库 安装&使用 认识jsoncpp Json::Value jsoncpp序列化 jsoncpp反序列化 认识JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,常用于在客户端和服…

深度学习:手撕 RNN(1)-RNN 的直观认识

本文首次发表于知乎,欢迎关注作者。 1. RNN是什么 RNN(Recurrent Neural Network)存在很多变体,为了方便叙述和理解,本文选取一个基本的 RNN 结构进行说明,该结构与 pytorch 中的 RNN 函数([1]…

c语言:strcmp

strcmp函数是用于比较两个字符串的库函数,其功能是根据ASCII值逐一对两个字符串进行比较。 语法:strcmp(str1, str2) 返回值: 如果str1等于str2,则返回0。 如果str1小于str2,则返回负数(具体值取决于C…

Go微服务: 日志系统ELK核心架构设计

微服务日志系统建设 1 )为什么需要日志系统 业务发展越来越庞大,服务器越来越多各种访问日志,应用日志,错误日志量越来越多,无法管理开发人员排查问题,需要到服务器上查日志 2 )Elastic Stack…

Vue从入门到实战 Day08~Day10

智慧商城项目 1. 项目演示 目标:查看项目效果,明确功能模块 -> 完整的电商购物流程 2. 项目收获 目标:明确做完本项目,能够收获哪些内容 3. 创建项目 目标:基于VueCli自定义创建项目架子 4. 调整初始化目录 目…

刷题之和为k的数组(leetcode)

和为k的数组 这个思路一直想不到&#xff0c;参考了官方答案&#xff0c;哈希表记录[0,i]的和 class Solution { public:int subarraySum(vector<int>& nums, int k) {int result0;unordered_map<int, int>map;int pre0;//前缀和&#xff08;前面的和&…

必应崩了?

目录 今天使用必应发现出现了不能搜索&#xff0c;弹出乱码的情况。 搜了一下&#xff0c;发现其他人也出现了同样的问题。 使用Edge浏览器的话&#xff0c;可以试着改一下DNS&#xff0c;有可能会恢复正常&#xff08;等官方修复了记得改回来&#xff09; 使用谷歌浏览器打开…

哪些AI写作软件好用,这三款强大的AI写作软件必知

在当今信息爆炸的时代&#xff0c;AI写作软件逐渐成为许多人提高写作效率和质量的得力助手。面对众多的选择&#xff0c;哪些AI写作软件真正好用呢&#xff1f;以下为大家介绍三款强大的AI写作软件。 第一款&#xff1a;火呱AI写作 它凭借其强大的语言理解和生成能力脱颖而出。…

C++随机数生成神器:rand(),让你的代码更加引人入胜!

更多资源请关注纽扣编程微信公众号 使用 rand 函数可以获取 机数大小是在0到RAND_MAX&#xff0c;值为2147483647&#xff0c;它是在stdlib中定义的&#xff0c;如果我们希望在某个范围内&#xff0c;可以使用 % 结合 / 来实现 但是不难发现&#xff0c;这里获得的随机数是…

k8s 1.24.x之后如果rest 访问apiserver

1.由于 在 1.24 &#xff08;还是 1.20 不清楚了&#xff09;之后&#xff0c;下面这两个apiserver的配置已经被弃用 了&#xff0c;简单的说就是想不安全的访问k8s是不可能了&#xff0c;所以只能走安全的访问方式也就是 https://xx:6443了&#xff0c;所以需要证书。 - --ins…

MySQL 主备环境搭建 docker

MySQL 主备环境搭建 docker 拉取docker镜像 sudo docker pull mysql:8.0 启动容器 docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD123456 -d mysql:8.0docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD123456 -d mysql:8.0配置 M…

通过域名接口申请免费的ssl多域名证书

来此加密已顺利接入阿里云的域名接口&#xff0c;用户只需一键调用&#xff0c;便可轻松完成域名验证&#xff0c;从而更高效地申请证书。接下来&#xff0c;让我们详细解读一下整个操作过程。 来此加密官网 免费申请SSL证书 免费SSL多域名证书&#xff0c;泛域名证书。 首先&a…