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.xdnf.cn/news/16471.html

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

相关文章

【freertos】FreeRTOS时间管理

FreeRTOS时间管理 一、睡眠延时函数1、vTaskDelay2、vTaskDelayUntil3、相对延时与绝对延时对比 二、自定义延时函数1、微秒延时2、毫秒延时 一、睡眠延时函数 1、vTaskDelay \quad 在UCOSIII 中延时函数OSTimeDly()可以设置为三种模式:相对模式、周期模式和绝对模式。在FreeR…

栈相关算法题1|通过栈判断链表是否对称|共享栈入栈出栈|括号匹配|多种括号配对|递归求序列最大值(C)

通过栈判断链表是否对称 设单链表的表头指针为L,data域为字符型,判断该链表的全部n个字符是否中心对称 xyx,xyyx 算法思想 使用栈来判断链表中的数据是否中心对称,让链表的前一半元素依次进栈 在处理链表的后一半元素时&#x…

datawhale11月组队学习 模型压缩技术3:2:4结构稀疏化BERT模型

文章目录 一、 半结构化稀疏性简介二、 代码实践2.1 定义辅助函数2.2 加载模型、tokenizer和数据集2.3 测试baseline模型指标2.4 对BERT-base模型进行半结构稀疏化 《datawhale2411组队学习之模型压缩技术1:模型剪枝(上)》:介绍模…

Qt中实现旋转动画效果

使用QPropertyAnimation类绑定对应的属性后 就可以给这个属性设置对应的动画 //比如自定义了属性 Q_PROPERTY(int rotation READ rotation WRITE setRotation)//给这个属性加动画效果 //参数1:谁要加动画效果 //参数2:哪个属性加动画效果 //参数3&…

视频流媒体播放器EasyPlayer.js RTSP播放器视频颜色变灰色/渲染发绿的原因分析

EasyPlayer.js RTSP播放器属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,无须安装任何插件,起播快、延迟低、兼容性强,使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0…

SpringBoot+Vue3开发会议管理系统

1 项目介绍 会议管理系统,简化公司内会议方面的流程,提供便捷。实现对会议室的管理、会议的管理、会议预约的管理,三大主流程模块。 系统分为三种角色,分别是员工、管理员和超级管理员。 员工角色功能:查看会议室占…

前端 JS 实用操作总结

目录 1、重构解构 1、数组解构 2、对象解构 3、...展开 2、箭头函数 1、简写 2、this指向 3、没有arguments 4、普通函数this的指向 3、数组实用方法 1、map和filter 2、find 3、reduce 1、重构解构 1、数组解构 const arr ["唐僧", "孙悟空&quo…

Clip结合Faiss+Flask简易版文搜图服务

一、实现 使用目录结构&#xff1a; templates ---upload.html faiss_app.py 前端代码&#xff1a;upload.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&quo…

【鸿蒙开发】第十一章 Stage模型应用组件-任务Mission

目录 1 任务(Mission)管理场景 2 任务&#xff08;Mission&#xff09;与启动模式 2.1 singleton单实例模式 2.2 multiton多实例模式 2.3 specified指定实例模式 3 页面栈及任务链 3.1 页面栈 3.2 任务链 4 设置任务快照的图标和名称 4.1 设置任务快照的图标&#xf…

探索 HTML 和 CSS 实现的模拟时钟

效果演示 这段代码是一个模拟时钟的 HTML 和 CSS 代码。它创建了一个简单的数字时钟界面&#xff0c;包括时针、分针和秒针。 HTML <div class"face"><p class"v-index">II</p><p class"h-index">II</p><d…

CSS预编译器:让样式编写更高效的秘密武器(6)

在现代前端开发中&#xff0c;CSS 预编译器是一种非常有用的工具&#xff0c;它通过扩展 CSS 语言的功能&#xff0c;帮助开发者更高效地编写和维护样式代码。本文将介绍 CSS 预编译器的基本原理&#xff0c;并重点讲解 LESS 的安装和使用方法。 1. 基本原理 编写 CSS 时&…

Vue3中实现插槽使用

目录 一、前言 二、插槽类型 三、示例 四、插槽的分类实现 1. 基本插槽 2. 命名插槽 3. 默认插槽内容 4. 作用域插槽&#xff08;Scoped Slots&#xff09; 5. 多插槽与具名插槽组合 一、前言 在 Vue 3 中&#xff0c;插槽&#xff08;Slot&#xff09;用于实现组件的内…

爬虫——Requests库的使用

在爬虫开发中&#xff0c;HTTP请求是与服务器进行交互的关键操作。通过发送HTTP请求&#xff0c;爬虫可以获取目标网页或接口的数据&#xff0c;而有效地处理请求和响应是爬虫能够高效且稳定运行的基础。Requests库作为Python中最常用的HTTP请求库&#xff0c;因其简洁、易用和…

如何使用EasyExcel生成多列表组合填充的复杂Excel示例

作者&#xff1a;Funky_oaNiu 一、&#xff08;需求&#xff09;生成的表格效果&#xff1a;二、搞一个模板文件三、建立对应的表格实体类四、开始填充五、Vue3前端发起请求下载六、官方文档及AI问答 一、&#xff08;需求&#xff09;生成的表格效果&#xff1a; 其中只有顶部…

三、计算机视觉_02计算机视觉领域的四大基本任务

0、前言 计算机视觉是人工智能领域的一个重要分支&#xff0c;它是一个跨学科的领域&#xff0c;涉及计算机科学、人工智能、机器学习、图像处理、神经科学等多个学科的知识 计算机视觉使用计算机技术来模拟人类视觉系统的功能&#xff0c;使计算机能够从图像或多维数据中提取…

Docker: ubuntu系统下Docker的安装

安装依赖 操作系统版本 Ubuntu Kinetic 22.10Ubuntu Jammy 24.04 (LTS)Ubuntu Jammy 22.04 (LTS)Ubuntu Focal 20.04 (LTS)Ubuntu Bionic 18.04 (LTS) CPU架构支持 ARMx86_64 查看我们的系统版本信息 uname -a通过该命令查得cpu架构是x86_64的&#xff1b; cat /etc/*re…

【已解决】 Tomcat10.1.x使用JSTL标签库

IDEA创建Java EE项目&#xff0c;使用Spring Spring MVC MyBatis框架&#xff0c;使用maven管理依赖。项目当前的环境是&#xff1a; Tomat 10.1.28Maven 3.6.3JDK 17 项目的功能&#xff1a;读取数据库的report表中的数据&#xff0c;返回一个List集合对象reportList在JSP…

LeetCode74. 搜索二维矩阵(2024冬季每日一题 6)

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

数据分析24.11.13

Excel 函数 求和 函数 sum() sumif() SUMIF(range, criteria, [sum_range]) sumifs() average() count() max() min() 逻辑 函数 if() iferror() 查询函数 VLOOKUP()

DveOps-Git-版本控制

1. 概述 分布式版本控制系统 版本控制 2. Git极速上手指南 官方传送门:Git - Branching and Merging 2.1 安装 ## windows https: git-scm.com/download/## Linux(CentOS/Fedora/Rocky Linux/RHEL) yum install -y git ## MacOS brew install git## Ubuntu/Debian apt in…