//
MySQL之Online DDL过程
//
昨天内容中说了不同类型的DDL操作所采用的的执行方法,以及Online DDL对系统空间的依赖,今天我们说说Online DDL的操作过程,让大家有一个更加直观的认识。
01
Online DDL的过程
从官方文档上看,online ddl操作的执行过程一般被分为3个阶段,如下:
阶段1:初始化阶段(准备阶段)
在初始化阶段,服务器将考虑存储引擎功能,语句中指定的操作以及用户指定的ALGORITHM
和LOCK
选项,以确定在操作期间允许多少并发 。在此阶段,将使用共享的元数据锁来保护当前表定义。
阶段2:执行
在此阶段,准备并执行该语句。元数据锁是否升级到排它锁取决于初始化阶段评估的因素。如果需要排他元数据锁,则仅在语句准备期间进行短暂锁定。
阶段3:提交阶段
在提交表定义阶段,将元数据锁升级为排它锁,以退出旧表定义并提交新表定义,在获取排它锁的过程中,如果其他事务正在占有元数据的排它锁,那么本事务的提交操作可能会出现锁等待。
每个步骤的详细过程如下:
02
Online DDL失败的情况
昨天的文章中说道,Online DDL失败的情况没有给出样例,但是官方文档上给出了可能失败的几种情况:
1、手工指定的algorithm和存储引擎中的算法出现冲突
2、在一些必须使用排它锁的场合手工指定锁的类型为share或者为none
3、需要拷贝表的时候系统磁盘空间溢出或者DDL过程中的并发DML临时日志文件过大导致超过了参数innodb_online_alter_max_size的值
4、当前系统有不活跃的事务占用了元数据锁,导致锁等待超时
5、DDL添加唯一二级索引的时候,并发DML中插入了重复键值的记录,此时会造成alter table的操作回滚
03
Online DDL的一些限制
1、使用lock=none模式的时候,不允许有外键约束,如果表中有外键的时候,使用Online DDL会出现一些问题
2、持有元数据锁的其他事务可能导致Online DDL阻塞,Online DDL可能导致其他需要获取元数据锁的事务超时
3、执行Online DDL的执行线程和并行DML不是同一个执行线程,所以并行的DML在执行过程中可能会报错,Duplicate Key的错误,类似前天文章中的错误一样:
4、optimize table操作会使用重建表的方法来释放聚集索引中未使用的空间,它类似alter table的操作,因为要重建表,它的处理效率不高。
5、再对大表进行online ddl的操作时,还需要注意以下3点:
a、没有任何操作能够停止Online DDL操作或者限制该操作过程中IO和磁盘使用率
b、一旦中间发生问题,回滚的代价非常昂贵
c、大表的Online DDL会导致复制出现巨大的延迟,这一点在主从复制架构中需要考虑到
综上所述,在对大表进行Online DDL的时候,有两种方法:
1、使用pt-osc或者gh-ost等在线变更的工具进行变更√
2、提前准备好故障报告,直接在线上进行变更,该方法纯属娱乐:)×
相关文章:
有帮助的话还希望点下再看哈