MySQL大表DDL方式对比

文章目录

  • 一、原生DDL、Online DDL
    • 1.1 Online ddl操作原理
    • 1.2 DDL操作的两个参数
    • 1.3 Online DDL 操作空间存储的要求
  • 二、pt-online-schema-change
    • 2.1 pt-osc的大致流程:
    • 2.2 pt-osc的特点
    • 2.3 使用pt-osc的约束
    • 2.4 操作示例
  • 三、gh-ost
    • 3.1 gh-ost的三种模式
    • 3.2 gh-ost的特点
    • 3.3 使用gh-ost的约束

线上环境的大表DDL操作一般都是比较让人头疼的,对于大表的DDL我们主要担心的风险点主要有:

  • 对当前数据库的资源消耗(CPU、IO、磁盘)的影响
  • DDL执行期间,是否会锁表,是否会阻塞业务正常DML请求的影响
  • 在主从复制架构中,对从库的复制延迟的影响

作为一名DBA,对于DDL执行消耗的评估,选择最佳方式执行DDL就是非常重要了,以下主要讲解一些线上环境执行DDL的方法和工具

一、原生DDL、Online DDL

从MySQL5.6开始支持Online DDL,Online DDL相对于普通的DDL操作在对数据库并发性支持以及锁、IO、空间资源消耗上都有较大的优化。但是,并不是所有类型的DDL都是执行Online的。我们在执行一个DDL变更时,为减少为生产环境的影响,必须要清楚该操作的基本属性以及其带来的资源消耗。

DDL操作带来的资源消耗:

  • 对业务并发的影响,DDL操作是否会影响到正常业务的DML请求
  • 对数据库本身性能的影响,DDL操作执行耗时以及带来的IO资源消耗
  • 对数据库服务器空间存储带来的影响,服务器剩余空间是否满足执行DDL语句
  • 对数据库架构中从库复制延迟的影响,

1.1 Online ddl操作原理

Online DDL操作可以分为以下三个阶段:

  • 初始化阶段

该阶段会判断DDL语句执行需要的算法以及锁模式,尽可能减少DDL执行期间对数据库并发和资源的消耗,该阶段需要持有变更表的MDL读锁/

  • 执行阶段

该阶段准备执行DDL语句,也是DDL操作中最耗时的一个阶段,需要将MDL读锁提升为MDL写锁,若DDL操作支持并发DML可快速将MDL写锁降级为MDL读锁,开始进行表数据重建等操作。

  • 提交表定义阶段

该阶段是表定义提交阶段,会将MDL读锁再次升级为MDL写锁,变更表结构定义,完成DDL操作,这是一个比较快的操作。

1.2 DDL操作的两个参数

1、ALGORITHM(算法)

Algorithm主要有3中参数选择:Inplace、Copy、default,Inplace > copy DDL操作执行消耗很大程度上取决于该操作是否可使用inplace策略,是否需要重建表

  • Copy:MySQL5.6之前默认使用的方式,DDL操作会在Server层创建一个临时表用于数据拷贝,当拷贝结束后最后通过rename进行替换,资源消耗比较巨大。
  • Inplace:MySQL5.6引入online DDL后默认优先使用的方式,inplace算法下又分为是否需要重建表两种,对于重建表操作,在引擎层内部创建临时表来完成DDL操作,不涉及Server层的数据拷贝;对于非重建表操作,基本上可直接在其表元数据信息进行变更即可,整体来讲inplace算法的执行效率相对于copy算法都是要好很多的。
  • Default:默认我们不显式添加algorithm或者指定algorithm=default时,MySQL默认评估DDL操作执行,选择最佳算法执行

2、Lock(锁)

lock是影响数据库并发性的关键指标,主要有以下几种情况:

  • LOCK=NONE :DDL执行期间允许并发查询以及并发DML
  • LOCK=SHARED :DDL执行期间允许并发查询,不允许并发DML
  • LOCK=DEFAULT :DDL执行期间,尽可能选择最佳的方式执行DDL,避免对数据库业务并发的影响
  • LOCK=EXCLUSIVE :DDL执行期间禁止并发查询以及并发DML

1.3 Online DDL 操作空间存储的要求

  • 临时日志文件空间消耗

在Online DDL执行期间允许并发DML操作,这些并发的DML操作会记录在临时的日志空间中,该空间按需申请,没吃申请单位由参数innodb_sort_buffer_size 控制,最大上限由参数innodb_online_alter_log_max_size 控制。若执行DDL期间临时日志文件空间消耗超过innodb_online_alter_log_max_size 参数,则DDL操作执行失败并回滚期间仍未提交的事物。

  • 临时排序文件空间消耗

Online DDL执行期间重建表的操作是需要使用到临时排序空间的,,

  • 临时中间表文件空间消耗

二、pt-online-schema-change

2.1 pt-osc的大致流程:

  • 创建_tblname_new表,其表结构与DDL原表(tblname)表结构一致
  • 对_tblname_new表进行DDL变更操作
  • 在原表tblname上分别针对Insert/Update/Delete操作创建触发器
  • 将原表中的历史数据拷贝至_tblname_new表,同时通过触发器在拷贝数据期间原表发生过的DML操作映射到_tblname_new表上
  • 如果原表有外键约束,处理外键约束
  • 将原表tblname重命名为_tblname_old,将_tblname_new重命名为tblname表
  • 删除_tblname_old表,DDL变更结束

2.2 pt-osc的特点

  • 通过数据拷贝与触发器来实现DDL变更操作
  • 可控制进行DDL操作期间最大负载与slave最大延迟
  • DDL操作需要的空间消耗包括:表数据空间一倍多的空间消耗+binlog日志空间消耗

2.3 使用pt-osc的约束

  • 表需要有主键,因为pt-osc进行事物拆分时使用了“force index(primary)”
  • 避免原表上存在触发器,以防止与pt工具产生干扰
  • 在使用pt-osc工具进行变更期间,容易因为触发器与正常的业务事物产生死锁

2.4 操作示例

# pt-online-

你可能感兴趣的:(MySQL,Online,DDL,gh-ost,pt-osc,MySQL,DDL)