MySQL Online DDL

文章目录

    • 1. 在线DDL的优势
    • 2. 支持的DDL操作
    • 3. 在线DDL的原理
    • 4. Online DDL的操作流程
      • 1. 准备阶段(Prepare phase)
      • 2. 拷贝阶段(Copy phase)
      • 3. 应用阶段(Apply phase)
      • 4. 替换阶段(Swap phase)
    • 5. 在线DDL操作流程的细节
    • 6. 在线DDL的限制
    • 7. 如何启用在线DDL
    • 8. 实践中的应用
    • 9. 在线DDL的操作流程图

MySQL的在线DDL(Online Data Definition Language)是一种支持在不锁定表的情况下修改表结构的功能。这意味着在执行诸如添加列、删除列、修改列、添加索引等操作时,表可以继续被读取和写入。MySQL的在线DDL从MySQL 5.6版本开始得到改进,并且在InnoDB存储引擎下提供了很多优化。以下是MySQL在线DDL的详细介绍:

1. 在线DDL的优势

  • 减少锁定时间:传统DDL操作会长时间锁定表,阻止其他读写操作。在线DDL可以在DDL执行时允许表的读写操作。
  • 不影响应用程序:由于读写操作可以继续进行,应用程序的正常服务不会被DDL操作中断。
  • 快速的模式变更:MySQL在线DDL引入了更高效的操作方式,通过重用已有数据文件等手段提升了修改表结构的速度。

2. 支持的DDL操作

在线DDL支持以下常见的表结构变更操作:

  • 添加、删除、修改列:例如,添加新列,删除已有列,修改列数据类型等。
  • 添加、删除索引:支持添加索引、删除索引等操作,同时支持多列索引和唯一索引。
  • 更改表的字符集和排序规则:可以在不锁表的情况下更改字符集和排序规则。
  • 分区管理:如表分区的创建、删除、合并、拆分等操作。

MySQL的在线DDL(Online DDL)是InnoDB存储引擎实现的一个技术,允许在不阻塞表的读写操作的情况下对表结构进行修改。其背后的核心原理是通过在不直接操作原始表的情况下,执行变更操作并逐步同步变更内容,以尽量减少锁定时间。在线DDL的流程包括几个主要阶段,下面我会详细介绍每个阶段,并使用Markdown流程图进行说明。

3. 在线DDL的原理

MySQL Online DDL的核心在于分阶段执行DDL操作,通过引入临时表、日志和内存缓冲区来保证数据一致性,允许在DDL操作进行时继续处理读写请求。主要原理如下:

  • 表副本:在某些复杂DDL操作中,MySQL会创建一个新表,将数据从原表逐步复制到新表上。最终通过替换的方式应用变更。
  • 更改日志:记录DDL操作过程中产生的数据更改,在拷贝和应用阶段进行使用,确保新表包含最新的数据。
  • 最小化锁定时间:仅在关键步骤(如准备阶段和最终替换阶段)短暂锁定表,从而将锁定时间降至最低。

4. Online DDL的操作流程

Online DDL的操作流程主要分为以下四个阶段:准备阶段、拷贝阶段、应用阶段和替换阶段。以下是具体流程:

1. 准备阶段(Prepare phase)

  • 确定变更类型并创建必要的数据结构,如新表结构或新索引。
  • 设置合适的锁定策略,准备过程中会短暂锁定表的元数据,但不会影响表的读写操作。
  • 初始化DDL操作的必要信息。

2. 拷贝阶段(Copy phase)

  • 根据DDL操作类型,选择性地将数据从原表复制到新表结构或应用到现有表的索引上。
  • 在拷贝过程中,用户的写入操作不会中断,MySQL会将写操作产生的变更记录在中继日志或内存缓冲区中。

3. 应用阶段(Apply phase)

  • 将在拷贝阶段产生的日志中记录的增量数据更改重新应用到新的表结构中。
  • 确保新表包含DDL操作期间所有最新的数据,从而保持数据一致性。

4. 替换阶段(Swap phase)

  • 释放DDL操作的锁定,将新表替换为原表,完成表结构的变更。
  • 清理临时数据结构和中继日志。

5. 在线DDL操作流程的细节

在具体实现中,Online DDL每个阶段涉及的细节和策略可能因DDL类型不同而略有不同,常见的情况包括:

  • 无锁变更(ALGORITHM=INSTANT):例如增加虚拟列等操作直接应用到表元数据上,几乎没有锁定时间。
  • 轻量锁定(ALGORITHM=INPLACE):例如添加索引、删除索引等操作,不使用临时表但会锁定元数据,保证操作时表可读写。
  • 临时表(ALGORITHM=COPY):例如更改列类型等较复杂的DDL操作需要建立临时表,会消耗额外磁盘空间,并可能短暂锁定表。

通过上述流程,MySQL Online DDL实现了在表结构变更时的最小化锁定,使得表在DDL操作进行时保持可用性,提升了数据库的维护效率和服务的连续性。

6. 在线DDL的限制

尽管在线DDL非常强大,但在一些特殊场景下也有一定的限制:

  • 不支持所有DDL操作:例如,某些复杂数据类型的变更可能仍需短暂锁定。
  • 空间需求增加:某些在线DDL操作会使用临时表或额外的日志文件,可能会增加磁盘空间需求。
  • 性能影响:在线DDL在高负载下可能会影响性能,因为MySQL需要处理大量的读写操作和DDL操作。
  • 版本依赖:不同版本的MySQL对在线DDL的支持存在差异,MySQL 5.6之后支持的操作逐渐增多,而MySQL 8.0增强了instant DDL的能力。

7. 如何启用在线DDL

在线DDL可以通过SQL语句中的ALGORITHMLOCK选项进行控制:

ALTER TABLE my_table ADD COLUMN new_column INT ALGORITHM=INPLACE, LOCK=NONE;
  • ALGORITHMINSTANTINPLACECOPY三种模式。INPLACE在大多数情况下是在线的,而INSTANT则完全无锁。
  • LOCKNONESHAREDEXCLUSIVENONE表示表可以继续读写,SHARED允许读操作,EXCLUSIVE表示表被完全锁定。

8. 实践中的应用

在实际操作中,进行在线DDL时通常需要考虑以下因素:

  • 预估磁盘空间:对于大表操作,需要预留足够的磁盘空间,以备临时表和日志记录的使用。
  • 选择合适的时间:在高峰期避免执行较为复杂的在线DDL操作,以免影响系统性能。
  • 使用pt-online-schema-change工具:对于MySQL 5.5及更早版本的用户,Percona Toolkit中的pt-online-schema-change工具提供了类似的在线DDL功能。

通过MySQL的在线DDL特性,可以在表结构变更时不影响服务的正常运行,从而提高数据库的维护效率和系统的可用性。

9. 在线DDL的操作流程图

以下是通过Markdown的流程图展示上述四个阶段的流程:

初始化表结构和数据结构
逐步复制数据
将日志数据应用到新表
短暂锁定表
开始
准备阶段
短暂锁定表元数据
拷贝阶段
记录写操作到日志
应用阶段
更新增量数据
替换阶段
替换新表和旧表
清理临时数据
操作完成,释放锁定

在这里插入图片描述

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

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

相关文章

SwanLab安装教程

SwanLab是一款开源、轻量级的AI实验跟踪工具,提供了一个跟踪、比较、和协作实验的平台,旨在加速AI研发团队100倍的研发效率。 其提供了友好的API和漂亮的界面,结合了超参数跟踪、指标记录、在线协作、实验链接分享、实时消息通知等功能&…

基于rk356x u-boot版本功能分析及编译相关(三)Makefile分析

🎏技术驱动源于热爱,祝各位学有所成。 文章目录 一、Makefile简要概述二、简要流程图三、Makefile文件具体分析大家好哈,这次因工作比较忙,文章更新拖的有些久了。哈哈,话不多说,咱们接着上次继续说u-boot的Makefile。 一、Makefile简要概述 一般要了解u-boot源码的编译…

vscode中执行git合并操作需要输入合并commit信息,打开的nano小型文本编辑器说明-

1.前提: VScode中的git组件执行任何合并动作的时候需要提交远程合并的commit信息,然后编辑器自动打开的是nano文本编辑器 2.nano编辑器说明: 1.保存文件:按 Ctrl O,然后按 Enter 来保存文件。 2.退出编辑器&#xf…

微信小程序 === 使用腾讯地图选点

目录 插件介绍 接入指引 相关参数说明 插件错误处理 效果图 permission 插件的作用 添加插件 引入插件代码包 使用插件 页面 js 接口 插件介绍 腾讯位置服务地图选点插件 可以让用户快速、准确地选择并确认自己的当前位置,并将相关位置信息回传给开发者。…

vue内置指令和自定义指令

常见的指令: v-bind : 单向绑定解析表达式, 可简写为 :xxx v-model : 双向数据绑定 v-for : 遍历数组/对象/字符串 v-on : 绑定事件监听, 可简…

Mac终端字体高亮、提示插件

一、安装配置“oh my zsh” 1.1 安装brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 按照步骤安装即可,安装完成查看版本 brew -v 1.2 安装zsh brew install zsh 安装完成后查看版本 zsh --version 1.3 …

CentOS8 在MySQL8.0 实现半同步复制

#原理 MySQL默认是异步的,不要求必须全部同步到从节点才返回成功结果; 同步复制: 用户发请求到代理, 代理收到请求后写/更新数据库写入到二进制日志bin_log, 然后必须等数据发到所有的从节点, 从节点全部收到数据后, 主节点才返回给客户端的成功结果。 弊端: 客…

手机ip地址异常怎么解决

在现代社会中,手机已成为我们日常生活中不可或缺的一部分,无论是工作、学习还是娱乐,都离不开网络的支持。然而,有时我们会遇到手机IP地址异常的问题,这不仅会影响我们的网络体验,还可能带来安全隐患。本文…

C++:基于红黑树封装map和set

目录 红黑树的修改 红黑树节点 红黑树结构 红黑树的迭代器 红黑树Insert函数 红黑树的默认成员函数 修改后完整的红黑树 set、map的模拟实现 set map 测试封装的set和map 红黑树的修改 想要用红黑树封装map和set,需要对之前实现的key-value红黑树进行修…

Spring Boot框架:电商系统的技术革新

4 系统设计 网上商城系统的设计方案比如功能框架的设计,比如数据库的设计的好坏也就决定了该系统在开发层面是否高效,以及在系统维护层面是否容易维护和升级,因为在系统实现阶段是需要考虑用户的所有需求,要是在设计阶段没有经过全…

【Linux】介绍和基础01

Linux介绍 linux是一个操作系统 和 windows平级 虚拟机 运行Linux在当前系统的 ‘另一个电脑’ 虚拟机可以运行多个‘电脑’ 你在哪 决定操作文件 ~ 波浪线代表当前登录的家 root 用户没有单独的家 整个操作都是root的家 Ubuntu没有盘的概念 所有的linux中都是文件 文…

(一)Ubuntu20.04服务器端部署Stable-Diffusion-webui AI绘画环境

一、说明 cup型号: Intel(R) Celeron(R) CPU G1610 2.60GHz 内存大小: 7.5Gi 356Mi 4.6Gi 1.0Mi 2.6Gi 6.8Gi Swap: 4.0Gi 0B 4.0Gi 显卡型号:NVIDIA P104-100 注意&#xff1a…

IQ Offset之工厂实例分析

有个产品 其方块图如下: FEM全名为Front End Module 详情可参照这篇 [1] WIFI前端模块的解析 这边就不赘述 而在工厂大量生产时 有一块板子 其Chain1的EVM Fail 分析Log后 发现其IQ Offset的值 比Chain2/Chain3/Chain4 还要来得差 请问 问题是出在收发器? 还是…

c++ 类和对象(中)

前言 我们看看下面的代码以及代码运行结果 代码1 我们可以看到在我们的类Data中的函数成员print中,我们并没有设置形参,在调用此函数时,也并没有多余传参,但是我们调用它时,却能准确打印出我们的_year、_month、_day…

TCP(下):三次握手四次挥手 动态控制

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! TCP(上):成熟可靠的传输层协议-CSDN博客 🥝在上篇博客中,我们针对TCP的特性,报文结构,连接过程以及相对于其他协议的区别进行了探讨,提供了初步的理解和概览。本…

后端——接口文档(API)

一、概念 后端的接口文档(API文档)——全称为应用程序编程接口(Application Programming Interface)文档,是详细阐述特定软件应用程序或Web服务所开放接口的具体使用指南。这份文档为开发者提供了与这些接口进行交互的…

【Linux:epoll】

目录 epoll与select、poll的区别: epoll操作函数: int epoll_create(int size); epoll_ctl: epoll_wait: epoll与select、poll的区别: select,poll底层是一个线性表的结构,而epoll是一个红黑树结构。epoll、poll不能跨平台…

Java基础——多线程

1. 线程 是一个程序内部的一条执行流程程序中如果只有一条执行流程,那这个程序就是单线程的程序 2. 多线程 指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行) 2.1. 如何创建多条线程 Java通过java.lang.Thread类的对象…

使用Redis的一些经验总结

目录 一、Redis中的key和value的设计 1.key的命名规范 2.避免出现BigKey 3.value中选择恰当的数据类型 例1:比如存储一个User对象,我们有三种存储方式: ①方式一:json字符串 ②方式二:字段打散 ③方式三&#x…

如何在 Ubuntu 上配置 Kotlin 应用环境 ?

Kotlin 是一种运行在 Java 虚拟机 (JVM) 上的现代编程语言,它同时支持函数式和面向对象编程。它可与 Java 互操作,并以其简洁的语法而闻名。在本指南中,我们将介绍在 Ubuntu 系统上准备好 Kotlin 开发环境的要点,包括 Java、Kotli…