mysql在线对大表进行ddl

问题:mysql如何对一张大表进行ddl?

方案1:停机维护,直接执行ddl,执行时间短则几分钟,长则几小时,一晚上也不是没可能。

方案2:使用pt_online_schema_change工具,可以在不停机维护的情况下,对大表进行ddl,且执行过程中不锁表,在ddl完成之前,原表可正常提供服务

接下来,我们就来说说在没有pt_online_schema_change工具的情况下是如何操作的,其实这也是该工具的执行原理

1. 前提条件:原表必须有主键或者唯一索引,因为操作过程中会使用到replace,如果没有主键或者唯一索引,会出现多条记录

2. 新建一张和原表一样的表,然后执行需要变更的ddl

3. 原表中新增insert/update/delete这3个触发器,保证原表的数据变更都能同步到新表中去。其中insert和update都使用replace into操作,delete就直接delete了

4. 分批copy原表数据到新表中去,copy时使用insert ignore,即新表中如果已经存在该记录则忽略,不然就新增。因为有update的触发器在,所以新表中的记录一定是最新的

5. 使用rename批量完成新表老表的名字交换,rename table old_table to backup_table, new_table to old_table,因为是在一个语句中,所以能保证原子性。rename的时候是会阻塞的,但是这个操作本身很快,所以基本可以忽略

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值