mysql 大表ddl_大表在线DDL变更

1.背景描述

首先,抛出一个问题:假设线上数据库有1T数据,现在需要进行索引变更,可能需要加3个索引、5个索引不等,请问执行DDL变更可能会带来哪些风险,以及如何应对?

和传统企业级开发不同,互联网需求变更比较频繁,基本每周甚至每天都有上线、3周一次大的上线是很常见的事,对应着表结构变更也是经常需要操作的,比如给表添加字段、给字段加索引。当数据量较大的表(简称大表)需要表更时,可能会由于锁表而阻塞读写请求(DML操作阻塞),影响系统的可用性。

虽然也有由于系统表结构重大变更对外公共系统维护的做法(听说豆瓣就这样干过,网上的消息,未证实),但系统可用性确实是互联网应用的底线、除非特殊原因,身为技术人员一般不会选择该方案。那么如果系统不能停机、数据量又非常大,如何实施在线DDL变更而不阻塞数据库DML操作呢?

2.在线DDL变更过程

大致过程:先复制结构出来,加索引,然后把数据导过来,具体过程如下:对表加锁。

复制原表物理结构到中间表。

修改中间表的物理结构,并将原表数据导入到中间表。

数据同步完成之后,锁定中间表,删除原表,rename中间表为原表。

刷新数据字典,并释放锁。

从中我们看到这个变更只能读取不能写入,如果表的数据量很大,等待的时间就很长。

3.在线DDL变更可能带来的风险

修改大表结构执行时间往往不能预估,一般时间较长,可能带来的风险有:修改表结构是表级锁,影响DML写入操作。

<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值