简析Innodb Online DDL

2022-10-20  本文已影响0人  丑人林宗己

源于最近有几次对于一些大表进行DDL操作,但可能因为对InnoDB引擎的Online DDL的原理所知甚少,以至于有一些同学一开口就是,"执行DDL时会锁表,如果数据量太大锁表时间太长,会阻塞到线上业务",为确保以后进行DDL操作时能够做到心中有数,对Online DDL做一些总结。

前身

MySQL于5.6版本推出Online DDL,那么在没有Online DDL前,它是如何做DDL?主要分为两种形式。

copy table

从整个执行过程来分析,为了保证执行期间表数据的一致性,必须通过加锁来阻止DML操作,只允许Queries。当表数据量过大时,在复制阶段所需要的时间过长导致整个语句在执行期间加锁阻塞其他事务的DML语句,故而导致应用连接数撑爆,大量事务超时等问题。

inplace

inplace又称为fast index creation,仅支持索引的创建。

inplace方式比起需要copy table自然是更优的,因为只需要从聚簇索引读取新索引的列项出来构造新索引页,其他索引不受影响。但是,无论是copy table 还是 inplace在执行操作的过程中都需要长时间锁表,阻塞DML语句,毫无疑问对于服务运行而言简直是毁灭式的行为,因此online ddl迫在眉睫。

在讨论online ddl前,有必要先了解几个点,其中包括 Innodb索引组织形式,LOCK CAUSEMETADATA LOCK

索引组织形式

关于索引的官方文档

开发同学在构建数据库表时,都会根据业务特点选择合适的索引,因为索引的目的是加速搜索。从官网文档中可以看到Innodb存储引擎将索引分为Clustered Index以及Secondary Index,称为聚集索引与二级索引(也称聚簇索引,非聚簇索引)。

二者如何区分?Innodb只会有一个聚簇索引,聚簇索引的叶子节点上存储的是Row Data,一般情况下是表定义中的PRIMARY KEY,如果没有则选择表定义中第一个非空UNIQUE KEY,如果表定义中即没有PK,也没有UK,则会通过Innodb隐藏的一个ROW ID作为索引。而处理聚簇索引之外的其他索引,皆称为二级索引。二级索引的叶子节点上存储的是聚簇索引的值。

正因为这个特征,很多企业定义的SQL规范中都会有类似:

LOCK CAUSE

关于LOCK CAUSE官方文档

默认情况下,MySQL会选择尽可能的轻量的锁来完成DDL操作,在某些特定情况下可以更加严格的锁来完成操作。比如前文提到,DDL过程中完成不允许DML,仅允许Queries,也可以不允许DML & Queries等。

METADATA LOCK

关于METADATA LOCK官方文档
关于METADATA LOCK补充文档

元数据锁,是MySQL的表锁之一,属于隐式锁(另一种是显式锁,通过lock table ... with read/write指定)。在补充文档中可以了解到元数据锁的由来,也对其进行了解释。补充文档中提及元数据锁有11种类型,常用的有MDL_SHARED_READ,MDL_SHARED_WRITEMDL_EXCLUSIVE。元数据锁是一个跟随事务结束而释放的锁,由MySQL控制,保护处于事务中的表元数据的一致性。

Online DDL

简述

MySQL在5.6.7版本推了Online DDL能力,主要是在基于原有的fast index creation上增强实现。其次,假定前提,衡量DDL是否足够Online在于是否长时间允许DML

目前Online DDL支持两种形式

MySQL如何选择该两种形式呢?

INPLACE会根据是否涉及到修改行记录格式分为三种情形

Online DDL支持选项

可以从官方文档查看Online DDL支持情况。

有几个点需要特意说明

image.png

实现原理

Online DDL主要分为3个阶段,PREPAREEXECUTECOMMIT

在整个Online DDL的过程中,并非是完全的Permits Concurrent DML,但是由于整个过程中持有MDL_EXCLUSIVE锁的时间较短,所以近似的认为整个过程是Permits Concurrent DML

Online DDL带来的优势

资料

https://www.cnblogs.com/cchust/p/4639397.html
https://www.cnblogs.com/xinysu/p/6732646.html
https://www.cnblogs.com/dbabd/p/10381942.html
http://mysql.taobao.org/monthly/2021/03/06/

上一篇下一篇

猜你喜欢

热点阅读