在高并发下在线修改表结构时异常 [mysql]


以前我们遇到metadata lock的问题, 当时是因为业务逻辑导致了。 现在的场景是在线修改ddl语句,确切来说就是alter修改表结构 。 我们知道直接alter修改表结构,肯定会进行锁表,业务很瘦影响的。如果想避免锁表,可以采用pt-online-schema-change的方式。

关于在线修改表结构,原文链接 http://xiaorui.cc/?p=2144

介绍pt-online-schema-change:

那pt-online-schema-change又是什么原理,这里做些直接alter跟pt-online-schema-change的对比。

一.直接执行 alter table XXX ……
1.按照原始表(original_table)的表结构和DDL语句,新建一张不可见的临时表。
2.在原表上加write lock,此时对原表的所有U D I DDL 都是阻塞的。
3.执行insert into tmp_table select * from oldtable;
4.rename oldtable 和 tmp_table,再drop oldtable。
5.释放 write lock。
二.pt-online-schema-change

1.如果存在外键,根据alter-foreign-keys-method参数的值,检测外键相关的表,做相应设置的处理。

2.创建一个和你要执行 alter 操作的表一样的新的空表结构(是alter之前的结构)。

3.在新表执行alter table 语句,

4.在原表中创建触发器(3个)三个触发器分别对应insert,update,delete操作

5.从原表拷贝数据到临时表,拷贝过程中通过原表上的触发器在原表进行的写操作都会更新到新建的临时表。

6.Rename 原表到old表中,在把临时表Rename为原表,默认最后将原表删除,将原表上所创建的触发器删除。

限制:

1.该工具所适用的表必须是单一列的主键或者单一唯一键。

2.有外键参照的表要修改则不成功,需要指定参数–alter-foreign-keys-method=auto|rebuild_constraints|drop_swap|none

3.要修改的表上不能有trigger,否则修改失败。


确实被第三条给坑过 ! 第三条的意思是说在原表上不能有触发器,但是有可能你的pt-online-schema-change被干掉,工具没有来得及删除触发器。 当你再去执行的时候,会提示你的原表已经存在trigger。