当前位置: 首页 > news >正文

MYSQLDDL

在MySQL 5.6推出在线DDL之前,执行DDL的方式主要有两种:copy和inplace。到5.6版本以后,推出了online DDL。
1、Copy Table方式(5.5版本默认算法)
通过拷贝临时表的方式实现的,这期间原表只读不可写,实现流程如下:

MySQL 会建立一个新的临时表,把源表的所有数据写入到临时表(将原表数据拷贝到临时表(无排序,一行一行操作),在此期间无法对源表进行数据写入,MySQL 在完成临时表的写入之后,用临时表替换掉源表,新建临时表存储空间会增加一倍

2、Inplace方式(5.6版本默认)
Inplace是指在原表上之间进行操作,不会拷贝到临时表,相对于copy table方式,效率会更高,但是同样会锁表,原表只读不可写。inplace 算法还包含两种类型:rebuild-table 和 not-rebuild-table。MySQL 使用 inplace 算法时,会自动判断,能使用 not-rebuild-table 的情况下会尽量使用,不能的时候才会使用 rebuild-table。当 DDL 涉及到主键和全文索引相关的操作时,无法使用 not-rebuild-table,必须使用 rebuild-table。其他情况下都会使用 not-rebuild-table。

inplace 算法的操作阶段主要分为三个:

Prepare阶段:- 创建新的临时 frm 文件,-持有 EXCLUSIVE-MDL 锁,禁止读写。- 根据 alter 类型,确定执行方式(copy,online-rebuild,online-not-rebuild)。更新数据字典的内存对象。- 分配 row_log 对象记录数据变更的增量(仅 rebuild 类型需要)。- 生成新的临时ibd文件new_table (仅rebuild类型需要)。

Execute 阶段:降级EXCLUSIVE-MDL锁,允许读写。扫描old_table聚集索引(主键)中的每一条记录 。遍历new_table的聚集索引和二级索引,逐一处理。构造对应的索引项。将构造索引项插入 sort_buffer 块排序。将 sort_buffer 块更新到 new_table 的索引上。记录 online-ddl 执行过程中产生的增量(仅 rebuild 类型需要)。重放 row_log 中的操作到 new_table 的索引上(not-rebuild 数据是在原表上更新)。重放 row_log 中的DML操作到 new_table 的数据行上。

Commit阶段:当前 Block 为 row_log 最后一个时,禁止读写,升级到 EXCLUSIVE-MDL 锁。重做 row_log 中最后一部分增量。更新 innodb 的数据字典表。提交事务(刷事务的 redo 日志)。修改统计信息。rename 临时 ibd 文件,frm文件。变更完成,释放 EXCLUSIVE-MDL 锁。

3、 MySQL 8.0.12 开始,引入了 instant 算法并且默认使用,利用 8.0 新的表结构设计,可以直接修改表的 metadata 数据,省掉了 rebuild 的过程,极大的缩短了 DDL 语句的执行时间。。目前 instant 算法只支持增加列等少量 DDL 类型的操作,其他类型仍然会默认使用 inplace。

4、第三方工具最常见的是 percona 的 pt-online-schema-change 工具(简称为 pt-osc),和 github 的 gh-ost 工具,均支持 MySQL 5.5 以上的版本。
pt-online-schema-change
借鉴了 copy 算法的思路,由外部工具来完成临时表的建立,数据同步,用临时表替换源表这三个步骤。其中数据同步是利用 MySQL 的触发器来实现的,会少量影响到线上业务的 QPS 及 SQL 响应时间。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • UI自动化测试重点思考(下)--装饰器/生成器/夹具的使用/描述符的作用/ddt驱动/多线程
  • 数据结构1
  • 如何快速开启一个项目-ApiHug - API design Copilot
  • 如何使用群晖Synology Drive结合cpolar内网穿透实现同步Obsidian笔记文件
  • Unity UI 优化技巧
  • 论文笔记:Large Language Models as Analogical Reasoners
  • 计算机网络:数据链路层 - CSMA/CD协议
  • 技术突破还是情感寄托?AI克隆人技术的伦理之辨
  • 如何使用宝塔面板搭建MySQL数据库并实现无公网IP远程访问
  • uniapp引入微信小程序版本VantUI,使用VantUI的自定义tabbar,并解决自定义tabbar出现闪烁的情况
  • 代码随想录阅读笔记-二叉树【二叉搜索树转换为累加树】
  • 用vue.js写案例——ToDoList待办事项 (步骤和全码解析)
  • React - 你使用过高阶组件吗
  • WKWebView的使用
  • 安卓远离手机app
  • ES6指北【2】—— 箭头函数
  • __proto__ 和 prototype的关系
  • 【5+】跨webview多页面 触发事件(二)
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • httpie使用详解
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java超时控制的实现
  • js学习笔记
  • Laravel核心解读--Facades
  • Map集合、散列表、红黑树介绍
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Sass 快速入门教程
  • Sequelize 中文文档 v4 - Getting started - 入门
  • sublime配置文件
  • vue自定义指令实现v-tap插件
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 机器学习学习笔记一
  • 力扣(LeetCode)357
  • 使用docker-compose进行多节点部署
  • 说说动画卡顿的解决方案
  • 原生Ajax
  • #微信小程序:微信小程序常见的配置传旨
  • $L^p$ 调和函数恒为零
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (20)docke容器
  • (a /b)*c的值
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Java数据结构)ArrayList
  • (待修改)PyG安装步骤
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (一)SvelteKit教程:hello world
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)Linux 多线程条件变量同步
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET Compact Framework 多线程环境下的UI异步刷新