首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

MySQL 5.7 DDL 与 GH-OST 对比分析

编程知识
2024年08月08日 09:35

作者:来自 vivo 互联网存储研发团队- Xia Qianyong

本文首先介绍MySQL 5.7 DDL以及GH-OST的原理,然后从效率、空间占用、锁阻塞、binlog日志产生量、主备延时等方面,对比GH-OST和MySQL5.7 DDL的差异。

一、背景介绍

在 MySQL 数据库中,DDL(数据定义语言)操作包括对表结构、索引、触发器等进行修改、创建和删除等操作。由于 MySQL 自带的 DDL 操作可能会阻塞 DML(数据操作语言)写语句的执行,大表变更容易产生主备延时,DDL 变更的速度也不能控制,因此在进行表结构变更时需要非常谨慎。

为了解决这个问题,可以使用 GitHub 开源的工具 GH-OST。GH-OST 是一个可靠的在线表结构变更工具,可以实现零宕机、低延迟、自动化、可撤销的表结构变更。相比于 MySQL 自带的 DDL 操作,GH-OST 可以在不影响正常业务运行的情况下进行表结构变更,避免了 DDL 操作可能带来的风险和影响。

通过使用 GH-OST工具,可以对 MySQL 数据库中的表进行在线结构变更,而不会对业务造成太大的影响。同时,GH-OST 工具还提供了多种高级特性,如安全性检测、自动化流程等,可以帮助用户更加高效地进行表结构变更。

二、MySQL5.7几种DDL介绍

2.1 copy

  • server层触发创建临时表

  • server层对源表加MDL锁,阻塞DML写、不阻塞DML读

  • server层从源表中逐行读取数据,写入到临时表

  • 数据拷贝完成后,升级字典锁,禁止读写

  • 删除源表,把临时表重命名为源表

MySQL copy方式的DDL变更,数据表的重建(主键、二级索引重建),server层作为中转把从innodb读取数据表,在把数据写到innodb层临时表。简单示意图如下:

图片

2.2 inplace

(1)rebuild table

需要根据DDL语句创建新的表结构,根据源表的数据和变更期间增量日志,重建新表的主键索引和所有的二级索引。

Prepare阶段

  • 创建新的临时frm文件

  • 持有EXCLUSIVE-MDL锁,禁止读写

  • 根据alter类型,确定执行方式(copy,online-rebuild,online-norebuild)假如是Add Index,则选择online-norebuild

  • 更新数据字典的内存对象

  • 分配row_log对象记录增量

  • 生成新的临时ibd文件

ddl执行阶段 :

  • 降级EXCLUSIVE-MDL锁,允许读写

  • 扫描old_table的聚集索引每一条记录rec

  • 遍历新表的聚集索引和二级索引,逐一处理各个索引

  • 根据rec构造对应的索引项

  • 将构造索引项插入sort_buffer块排序

  • 将sort_buffer块更新到新表的索引上

  • 记录ddl执行过程中产生的增量(记录主键和索引字段)

  • 重放row_log中的操作到新表索引商

  • 重放row_log间产生dml操作append到row_log最后一个Block

commit阶段 :

  • 当前Block为row_log最后一个时,禁止读写,升级到EXCLUSIVE-MDL锁

  • 重做row_log中最后一部分增量

  • 更新innodb的数据字典表

  • rename临时idb文件,frm文件

  • 增量完成

MySQL rebuild table方式的DDL,数据不需要通过sever层中转,innodb层自己完成数据表的重建。简单示意图如下:

图片

 

(2)build-index

需要根据DDL语句创建新的表结构,根据源表的数据和变更期间增量日志,创建新的索引。

Prepare阶段 :

  • 持有EXCLUSIVE-MDL锁,禁止读写

  • 根据alter类型,确定执行方式(copy,online-rebuild,online-norebuild)

  • 假如是Add Index,则选择online-norebuild

  • 更新数据字典的内存对象

  • 分配row_log对象记录增量

ddl执行阶段 :

  • 降级EXCLUSIVE-MDL锁,允许读写

  • 扫描old_table的聚集索引每一条记录rec

  • 遍历新表的聚集索引,根据rec构造新的索引数据

  • 将构造索引项插入sort_buffer块排序

  • 将sort_buffer块更新到新表的索引上

  • 记录ddl执行过程中产生的增量(仅记录主键和新索引字段)

  • 重放row_log中的操作到新表索引上

  • 重放row_log间产生dml操作append到row_log最后一个Block

commit阶段 :

  • 当前Block为row_log最后一个时,禁止读写,升级到EXCLUSIVE-MDL锁

  • 重做row_log中最后一部分增量

  • 更新innodb的数据字典表

  • 增量完成

MySQL rebuild index方式的DDL,数据不需要通过sever层中转,innodb层只需要完成变更二级索引的创建。简单示意图如下:

图片

(3)only modify metadata

只修改元数据(.frm文件和数据字典),不需要拷贝表的数据。

图片

三、GH-OST

在GH-OST端,根据DDL语句创建新的表结构,根据源表的数据和增量期间增量日志,重建新表的主键索引和所有的二级索引,最终完成DDL增量。

主要流程如下:

  • 根据DDL语句和源表创建新的表结构

  • 根据唯一索引(主键索引或者其它唯一索引)

- 优先应用新增量的binlog到新的表中,需要经过GH-OST把binlog日志转换为sql,然后回放到影子表

- 其次拷贝源表中的数据到新的表中,表数据拷贝通过sql语句 insert ignore into (select .. from)直接在MySQL实例上执行,无需经过GH-OST中转

  • 数据拷贝完成并应用完binlog后,通过lock table write 锁住源表

  • 应用数据完成-获取到锁期间产生的增量binlog

  • delete源表,rename影子表为源表,完成数据增量

GH-OST 进行DDL变更,GH-OST服务通知server层,server层作为中转把从innodb读取数据表,在把数据写到innodb层影子表。并且GH-OST作为中转读取DDL变更期间增量binlog解析成SQL写语句回放到影子表。简单示意图如下:

图片

四、对比分析

DDL变更执行时长、对磁盘的额外占用(临时数据表+binlog)、锁阻塞时长、主备延时都是执行DDL变更人员比较关心的问题,本章将从从执行效率、占用表空间、锁阻塞、产生binlog日志量、主备延时等方面对MySQL原生的DDL和GH-OST进行对比分析。

4.1 执行效率

(1)only modify metadata(正常小于1S)

(2)build-index: 数据条目越多、新索引字段越大耗时越多

  • 增量日志超过innodb_online_alter_log_max_size造成DDL失败

(3)rebuild table: 数据条目越多、所有索引字段之和越大耗时越多

  • 增量日志超过innodb_online_alter_log_max_size造成DDL失败

(4)copy:数据条目越多,所有索引字段之和越大耗时越多,相对于rebuild table,数据需要从server层中转,所以比rebuild table耗时多

(5)GH-OST :数据条目越多,所有索引字段之和越大耗时越多,

  • 相对于copy,增量日志数据需要从GH-OST中转,所以比copy耗时多

  • 有各种限流,(主备延时,threads超限延时…),增加耗时

  • 增量期间应用binlog速度如果跟不上业务产生binlog日志的速度,将无法完成增量

  • critical 参数还会导致主动退出,例如thread_running

耗时:only modify metadata < build-index < build < copy < GH-OST

4.2 占用表空间

  • 【only modify metadata】:忽略

  • 【build-index】:额外需要,新增索引字段占用的空间

  • 【rebuild-table】:额外需要约两倍的表空间

  • 【copy】:额外需要约两倍的表空间

  • 【GH-OST】 :临时表占用约两倍的表空间,另外生成影子表会产生大量的binlog日志会占用表空间

占用表空间: only modify metadata < build-index < build = copy < GH-OST

4.3 锁阻塞

(1)only modify metadata

  • DDL prepare阶段短暂的MDL排他锁,阻塞读写

(2)build-index table

  • DDL prepare阶段短暂的MDL排他锁,阻塞读写

  • 执行阶段(主要耗时阶段),MDL SHARED_UPGRADABLE锁,不阻塞读写

  • 执行阶段的最后会回放增量日志row_log,两个block间隙和最后block,持有源表索引的数据结构锁,会阻塞写

  • 提交阶段,MDL锁升级为排他锁

  • 回放剩余的row_log(执行完成致MDL锁升级期间新增的row_log,持有源表索引的数据结构锁,阻塞读写)

(3)rebuild-table: 和build-index table一致

(4)copy

  • DDL prepare阶段短暂的MDL排他锁,阻塞读写

  • 执行阶段(主要耗时阶段),阻塞写,不阻塞读

(5)GH-OST

  • 等待锁的时间也会阻塞业务

  • 进入rename到拿表写锁的间隙有少量的新增binlog,后续需要持锁回放这部分日志

  • rename表本身的耗时通常1s以内左右

锁阻塞时间:

only modify metadata=GH-OST < build-index table = rebuild-table  < copy(整个DDL期间都会阻塞业务的写)

锁阻塞分析:

MySQL DDL在获取MDL排它锁和GH-OST获取表的的写锁,在获取锁的等待期间都会阻塞业务的读写

  • MySQL等待锁的超时时间为MySQL参数innodb_lock_wait_timeout。等待超时则失败

  • GH-OST等待锁的时间,等待超时时间可配(默认6秒),等待超时次数可配

4.4 产生binlog日志量

【MySQL5.7 DDL】: 在DDL执行结束时仅向binlog中写入一条DDL语句,日志量较小。

【GH-OST】: 影子表在全量数据拷贝和增量数据应用过程中产生大量的binlog日志(row模式),对于大表日志量非常大。

产生binlog日志量:MySQL5.7 DDL < GH-OST

4.5 主备延时分析

(1)MySQL5.7 DDL:MySQL集群主备环境

  • Master上DDL执行完成,binlog提交后,slave才开始进行DDL。

  • slave串行复制、group复制模式,需要等前面的DDL回放完成后才会进行后续binlog回放,主备延时至少是DDL回放的时间。

图片

(2)GH-OST:主备复制延时基本可以忽略

  • GH-OST在master上创建一个影子表,在执行数据拷贝和binlog应用阶段,GHO表的binlog会实时同步到备。

  • 影子表(_GHO表)应用完成后,通过rename实现新表切换,这个rename动作也会通过binlog传到salve执行完成DDL。

图片

延时时间:GH-OST < MySQL DDL

备库执行DDL期间主库异常,主备切换。备库升级为主过程中,要回放完relaylog中的DDL和dml,才能对外服务,否则会出现数据丢失,这将造成业务较长时间的阻塞。

4.6 总结

图片

GH-OST 工具和 MySQL 原生 DDL 工具的适用场景不同,具体使用哪种工具需要根据实际需求进行选择。

  • 变更人员无法判断本次DDL是否会造成DML阻塞、锁阻塞等,建议使用GH-OST工具。

  • 如果需要进行在线表结构变更,并且需要减少锁阻塞时间、减少主备延时等问题,建议使用 GH-OST 工具。

  • 变更只涉及到元数据的修改,建议使用mysql原生DDL。

  • 如果表结构变更较小,对锁阻塞时间和主备延时要求不高,建议使用 MySQL 原生 DDL 工具。

参考资料:

From:https://www.cnblogs.com/vivotech/p/18348466
本文地址: http://shuzixingkong.net/article/903
0评论
提交 加载更多评论
其他文章 .NET 与 LayUI 实现高效敏捷开发框架
前言 WaterCloud 是一个集成了 LayUI 的高效敏捷开发框架,专为 .NET 开发者设计。 它不仅支持多种 .NET 版本(.NET 4.5、.NET Core 3.1、.NET 5、.NET 6),还内置了丰富的功能,如权限管理、流程表单设计以及多数据库支持下的多租户架构。使用了 OR
.NET 与 LayUI 实现高效敏捷开发框架 .NET 与 LayUI 实现高效敏捷开发框架 .NET 与 LayUI 实现高效敏捷开发框架
告别Hugging Face模型下载难题:掌握高效下载策略,畅享无缝开发体验
告别Hugging Face模型下载难题:掌握高效下载策略,畅享无缝开发体验 Huggingface国内开源镜像:https://hf-mirror.com/ 里面总结了很多下载的方法,下面进行一一讲解 方法一:网页下载 在模型主页的Files and Version中中可以获取文件的下载链接。无需
告别Hugging Face模型下载难题:掌握高效下载策略,畅享无缝开发体验 告别Hugging Face模型下载难题:掌握高效下载策略,畅享无缝开发体验 告别Hugging Face模型下载难题:掌握高效下载策略,畅享无缝开发体验
从论文到图谱,或许只差一个html
Awesome-Graphsv1.1.0发布,通过一个HTML文件提供207个图计算系统、509条引用关系的交互式图谱,支持论文预览、引用追溯等便捷功能,便于学习与贡献,资源集中可下载。
从论文到图谱,或许只差一个html 从论文到图谱,或许只差一个html 从论文到图谱,或许只差一个html
为什么大部分的 PHP 程序员转不了 Go 语言?
树挪死,人挪活,这个需求我做不了,换个人吧。大家都有过这种经历吧,放在编程语言身上就是 PHP 不行了,赶紧转 Go 语言吧。
为什么大部分的 PHP 程序员转不了 Go 语言? 为什么大部分的 PHP 程序员转不了 Go 语言? 为什么大部分的 PHP 程序员转不了 Go 语言?
记一次 .NET某智慧出行系统 CPU爆高分析
一:背景 1. 讲故事 前些天有位朋友找到我,说他们的系统出现了CPU 100%的情况,让我帮忙看一下怎么回事?dump也拿到了,本想着这种情况让他多抓几个,既然有了就拿现有的分析吧。 二:WinDbg 分析 1. 为什么会爆高 既然说是 100%,作为调试者得拿数据说话,可以使用 !tp 来观测一
记一次 .NET某智慧出行系统 CPU爆高分析 记一次 .NET某智慧出行系统 CPU爆高分析 记一次 .NET某智慧出行系统 CPU爆高分析
零基础学习人工智能—Python—Pytorch学习(二)
前言 数学的学习跟数学的计算是要分开的,现在回头再去看大学的高数和线性代数,如果只是学习的话,其实一门课程3天,也就学完了。 学校的课程之所以上那么久,其实是为了考试,也就是为计算准备的。计算有意义的,在有计算机的情况下,计算的意义并不是很大。 所以,如果大学数学没学好,只要花一星期,就能补回来。甚
零基础学习人工智能—Python—Pytorch学习(二) 零基础学习人工智能—Python—Pytorch学习(二) 零基础学习人工智能—Python—Pytorch学习(二)
总有坏人想爬我网站的数据,看我用这 10 招干他!
大家好,我是程序员鱼皮。前两天模拟面试一位社招两年的老哥,由于他的表现不错,我就临时起意,跟他交流一下我们最近遇到的业务场景问题。问题如下: 最近我们不是做了个 程序员刷题网站 - 面试鸭 嘛,有很多坏人盯上了我们网站,想把我们 4,000 多道面试题、100 多个面试题库的数据都用爬虫抓下来。那我
总有坏人想爬我网站的数据,看我用这 10 招干他! 总有坏人想爬我网站的数据,看我用这 10 招干他! 总有坏人想爬我网站的数据,看我用这 10 招干他!
双指针优化
双指针优化 为什么我为OI泪目?因为我菜得离谱...... 引入 双指针是一种简单而又灵活的技巧和思想,单独使用可以轻松解决一些特定问题,和其他算法结合也能发挥多样的用处。 双指针顾名思义,就是同时使用两个指针,在序列、链表结构上指向的是位置,在树、图结构中指向的是节点,通过或同向移动,或相向移动来
双指针优化 双指针优化