MySQL Online DDL

server/2024/11/19 7:28:36/

文章目录

    • 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.ppmy.cn/server/143115.html

相关文章

【C++动态规划】3148. 矩阵中的最大得分|1819

本文涉及知识点 C动态规划 LeetCode 3148. 矩阵中的最大得分 给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格(不必相邻)。从值为 c1 的单元格移动到值为 c2 的单元格的得…

如何配置 Flink CDC 连接 OceanBase 实现数据实时同步

在大数据处理方面,Flink CDC(Change Data Capture)是一款功能强大的工具,它能实时获取数据库中的变更数据,并将这些数据传送给其他系统进行后续处理。 Flink CDC 结合 OceanBase 分布式数据库高性能、HTAP等特性&#…

shell 接收长参数

以备份 mysql 脚本为例,如下 #!/bin/bash # 分隔符 str"-"# 定义分割线函数 FenGeLine() {## 获取屏幕宽度ScreenLen$(stty size |awk {print $2})## 标题宽度TitleLen$(echo -n $1 |wc -c)#echo $TitleLen## 左右分割线长度LineLen$(((${ScreenLen} - $…

Qt桌面应用开发 第四天(对话框 界面布局)

目录 1.对话框 1.1模拟对话框 1.2非模拟对话框 1.3消息对话框 1.3.1询问对话框 1.3.2严重错误对话框 1.3.3信息提示对话框 1.3.4警告对话框 1.4其他对话框 1.4.1颜色对话框 1.4.2文件对话框 1.4.3字体对话框 1.5界面布局 1.对话框 1.1模拟对话框 会阻塞同一应用…

安全、便捷、效率高,明达边缘计算网关助力制药装备企业远程调机

随着药厂对设备运维需求的增长,制药装备企业需要在提高运维效率的同时,降低人工及差旅成本。制药装备因其数据具有高度的保密性,要求运维工程师提供安全可靠的远程调试方式。本案例介绍了明达技术MBox20系列5口WIFI通用网关在制药装备上的应用…

【汇编语言】数据处理的两个基本问题(三) —— 汇编语言的艺术:从div,dd,dup到结构化数据的访问

文章目录 前言1. div指令1.1 使用div时的注意事项1.2 使用格式1.3 多种内存单元表示方法进行举例1.4 问题一1.5 问题一的分析与求解1.5.1 分析1.5.2 程序实现 1.6 问题二1.7 问题二的分析与求解1.7.1 分析1.7.2 程序实现 2. 伪指令 dd2.1 什么是dd?2.2 问题三2.3 问…

【头歌实训:循环调度法】

头歌实训:循环调度法 文章目录 任务描述相关知识1. 如何设计一个队列2. C STL的队列容器queue2.1 queue的定义2.2 queue容器内元素的访问输出结果:2.3 queue常用函数实例解析2.4 queue的注意事项2.5 一个完整的队列程序示例 编程要求输入:输出:限制:输入…

原生微信小程序做视频和图片上传wx.chooseMedia({})

原来的旧的方法已经被遗弃&#xff0c;现在最新上传视频和图片的方法用的是wx.chooseMedia({})&#xff0c;共同用这个方法&#xff0c;参数不一样&#xff1b; code&#xff1a; wxml&#xff1a; <!-- 上传图片 --> <view class"upload-box" bindtap&quo…