MySQL 一个很麻烦的问题是,alter table 的时候往往要锁表,而业务在最初设计的时候,又没法为未来的所有改动预留合适的字段,结果就是,要么另外建一张表横向扩展,要么熬到半夜,忍受锁表带来的业务中断;不过在多次实践中还是有一些心得体会,可以简单列一下。
1. alter table 是否都会锁表?
不都会,有些情况可以不锁表,例如,修改默认值,或者对 enum 类型字段增加一个 value
2. 对 enum 类型字段加 value 就不会锁表吗?
不一定,如果新增的 value 是最后一个就不会锁表,但也要注意,还是有坑(不能超过当前的bit数能表示的最大值)(为什么?)
3. 有没办法即 alter table 但又不长时间锁表?
有,percona-toolkit 有个工具能做到,原理很简单,新建一个表A的副本A’,在A’上加字段,并同步数据,最后用一个 alter 语句对换两张表,但据说有BUG
4. 安利一下与 MySQL 协议基本兼容的 TiDB ,可以直接在线不锁表 alter table