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的时候是会阻塞的,但是这个操作本身很快,所以基本可以忽略

你可能感兴趣的:(mysql,数据库)