
作者简介
无为,多年 MySQL DBA 工作经验,现就职于某知名互联网公司,对 MySQL、 Redis、PostgrepSQL 等主流数据库有一定了解,拥有丰富的一线运维经验。
上一节咱们了解了元数据锁,但在 Online DDL 操作中具体是怎样加锁的呢?加几次锁呢?带着这些疑问,我们一起来学习 DDL 三阶段。
阶段1:初始化
在初始化阶段,服务器将考虑存储引擎功能,语句中指定的操作以及用户指定的 ALGORITHM 和 LOCK 选项,以确定在操作期间允许多少并发 。在此阶段,将使用共享的元数据锁来保护当前表定义。
阶段2:执行
在此阶段,准备并执行该语句。元数据锁是否升级到排它锁取决于初始化阶段评估的因素。如果需要排他元数据锁,则仅在语句准备期间进行短暂锁定。
阶段3:提交
在提交表定义阶段,将元数据锁升级为排它锁,以退出旧表定义并提交新表定义,在获取排它锁的过程中,如果其他事务正在占有元数据的排它锁,那么本事务的提交操作可能会出现锁等待。
我们先看下 ALTER TABLE 时 ALGORITHM 可以指定的几种方式:
初始化
执行
提交