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

本文将简要介绍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官网或者问答区咨询。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运算放大器学习笔记

运放简介 运放参数 读懂运放生产商提供的datasheet 是用好一款运放的先决条件 dataSheet 下载地址: 各芯片厂家官网http://www.ic37.comhttps://www.szlcsc.comhttp://www.alldatasheet.com 参数1: 供电电压Vs 某些运放可以用单电源供电某些运放需要…

计算机网络基本概念

文章目录 情景带入一些基本概念网络网络编程:7层网络模型OSI:TCP/IP Protocol Architecture Layers与OSI的对应关系SocketClient-Server Application报文段:传输协议:Mac地址IP地址端口URL 情景带入 随着时代的发展,我…

JVM之【类加载机制】

一、类加载过程 1. 加载(Loading) 工作内容: 通过类的全限定名来获取定义此类的二进制字节流: JVM首先会调用类加载器的findClass方法来找到类文件的路径,通常从文件系统、JAR包、网络、数据库等来源获取类文件。 将…

嵌入式进阶——数码管2

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 驱动封装封装的一些疑问数字走马灯实现扩展知识 驱动封装 根据前面的内容可以将代码进行封装,封装后作为一个独立的整…

Flutter仿照微信实现九宫格头像

一、效果图 2、主要代码 import dart:io; import dart:math;import package:cached_network_image/cached_network_image.dart; import package:flutter/material.dart;class ImageGrid extends StatelessWidget {final List<String> imageUrls; // 假设这是你的图片URL…

山东大学软件学院数据库实验1-9(全部)

目录 前言 实验代码 实验一 1-1 1-2 1-3 1-4 1-5 1-6 实验二 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 2-10 实验三 3-1 3-2 3-3 3-4 3-5 3-6 3-7 3-8 3-9 3-10 实验四 4-1 4-2 4-3 4-4 4-5 4-6 4-7 4-8 4-9 4-10 实验五 5-1…

代码随想录算法训练营第三十六天 | 1005.K次取反后最大化的数组和、134.加油站、135.分发糖果

目录 1005.K次取反后最大化的数组和 思路 代码 代码 134.加油站 思路 代码 135.分发糖果 思路 代码 1005.K次取反后最大化的数组和 本题简单一些&#xff0c;估计大家不用想着贪心 &#xff0c;用自己直觉也会有思路。 代码随想录 思路 直觉&#xff0c;直接写&…

<学习笔记>从零开始自学Python-之-实用库篇(一)-pyscript

由Anaconda创建的PyScript是一项实验性的但很有前途的新技术&#xff0c;它使python运转时在支撑WebAssembly的浏览器中作为一种脚本言语运用。 每个现代常用的浏览器现在都支撑WebAssembly&#xff0c;这是许多言语&#xff08;如C、C和Rust&#xff09;能够编译的高速运转时…

K8S/ hpa分享

在 Kubernetes 中&#xff0c;HorizontalPodAutoscaler 自动更新工作负载资源 &#xff08;例如 Deployment 或者 StatefulSet&#xff09;&#xff0c; 目的是自动扩缩工作负载以满足需求。 hpa的使用本身还是很简单的 示例如下&#xff1a; 官网示例 apiVersion: apps/v1 k…

基础—SQL—DDL—建表、查表、修改表以及总结

一、DDL—表—创建表与数据类型的设定 &#xff08;1&#xff09;要求 根据需求创建表(设计合理的数据类型、长度) 设计一张员工信息表&#xff0c;要求如下: 1、编号&#xff08;纯数字) 2、员工工号(字符串类型&#xff0c;长度不超过10位) 3、员工姓名&#xff08;字符串类…

设计模式10——装饰模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 装饰模式 是一种行为型模式。…

笔记88:LeetCode_134_加油站

前言&#xff1a; 前言1&#xff1a;这个题的题目条件给的不太严谨&#xff0c;题目描述中说“如果存在解&#xff0c;则保证它是唯一的”&#xff0c;通过我的实践&#xff0c;我发现这句话的意思其实是本题的所有样例只有两种情况&#xff0c;无解/有唯一解&#xff1b;而不可…

【Spring】认识 Spring AOP

认识 Spring AOP 1.什么是 AOP2.AOP 中的概念3.用 AOP 方式管理日志3.1 编写 AOP 日志注解类3.2 编写控制器用于测试 1.什么是 AOP AOP&#xff08;Aspect Oriented Program&#xff0c;面向切面编程&#xff09;把业务功能分为核心、非核心两部分。 核心业务功能&#xff1a…

tcpdump源码分析

进入tcpdump.c&#xff08;函数入口&#xff09;之前&#xff0c;先看一些头文件netdissect.h里定义了一个数据结构struct netdissect_options来描述tcdpump支持的所有参数动作&#xff0c;每一个参数有对应的flag, 在tcpdump 的main 里面&#xff0c; 会根据用户的传入的参数来…

构建高效的在线培训机构CRM应用架构实践

在当今数字化时代&#xff0c;在线培训已成为教育行业的重要趋势之一。为了提供更好的学习体验和管理服务&#xff0c;在线培训机构需要构建高效的CRM&#xff08;Customer Relationship Management&#xff09;应用架构。本文将探讨在线培训机构CRM应用架构的设计与实践。 一、…

力扣周赛398题解

特殊数组Ⅰ 如果数组的每一对相邻元素都是两个奇偶性不同的数字&#xff0c;则该数组被认为是一个 特殊数组 。 Aging 有一个整数数组 nums。如果 nums 是一个 特殊数组 &#xff0c;返回 true&#xff0c;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;nums [1] …

数据结构和算法|排序算法系列(二)|冒泡排序

首先需要你对排序算法的评价维度和一个理想排序算法应该是什么样的有一个基本的认知&#xff1a; 《Hello算法之排序算法》 主要内容来自&#xff1a;Hello算法11.3 冒泡排序 我觉得冒泡排序非常有意思&#xff0c;也非常简单&#xff0c;就是不停地交换相邻的元素即可&#…

代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点 、 面试题 02.07. 链表相交、142.环形链表II

24. 两两交换链表中的节点 题目链接&#xff1a; 24. 两两交换链表中的节点 文档讲解&#xff1a;代码随想录 状态&#xff1a;没做出来&#xff0c;没有正确更新头节点&#xff0c;因为head和cur共享引用&#xff0c;会随着cur的移动&#xff0c;丢失之前存放的节点 错误代码&…

腾讯发布ELLA:为扩散模型注入LLM能力,提升复杂场景的图像生成,准确率超90%

前言 近年来&#xff0c;基于扩散模型的文本到图像生成技术取得了显著进步&#xff0c;能够生成高质量、逼真的图像。然而&#xff0c;大多数扩散模型仍然使用CLIP作为文本编码器&#xff0c;这限制了它们理解复杂提示的能力&#xff0c;例如包含多个物体、详细属性、复杂关系…

摄像头应用测试

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…