1.背景描述
首先,抛出一个问题:假设线上数据库有1T数据,现在需要进行索引变更,可能需要加3个索引、5个索引不等,请问执行DDL变更可能会带来哪些风险,以及如何应对?
和传统企业级开发不同,互联网需求变更比较频繁,基本每周甚至每天都有上线、3周一次大的上线是很常见的事,对应着表结构变更也是经常需要操作的,比如给表添加字段、给字段加索引。当数据量较大的表(简称大表)需要表更时,可能会由于锁表而阻塞读写请求(DML操作阻塞),影响系统的可用性。
虽然也有由于系统表结构重大变更对外公共系统维护的做法(听说豆瓣就这样干过,网上的消息,未证实),但系统可用性确实是互联网应用的底线、除非特殊原因,身为技术人员一般不会选择该方案。那么如果系统不能停机、数据量又非常大,如何实施在线DDL变更而不阻塞数据库DML操作呢?
2.在线DDL变更过程
大致过程:先复制结构出来,加索引,然后把数据导过来,具体过程如下:对表加锁。
复制原表物理结构到中间表。
修改中间表的物理结构,并将原表数据导入到中间表。
数据同步完成之后,锁定中间表,删除原表,rename中间表为原表。
刷新数据字典,并释放锁。
从中我们看到这个变更只能读取不能写入,如果表的数据量很大,等待的时间就很长。
3.在线DDL变更可能带来的风险
修改大表结构执行时间往往不能预估,一般时间较长,可能带来的风险有:修改表结构是表级锁,影响DML写入操作。
<