往一张数据量比较大的表中添加字段
参考资料
三种工具
- 原生 Online DDL(Mysql >=5.6)
- pt-osc(pt-online-schema-change)
- 1.创建一个与原表结构相同的空表,表名是 _new 后缀;
- 2.修改新表的表结构;
- 3.在原表上加三个触发器:delete/update/insert,用于 copy 数据过程中,将原表中要执行的语句在新表中执行;
- 4.将原表数据以数据块(chunk)的形式 copy 到新表;
- 5.rename 原表为 old 表,并把新表 rename 为原表名,然后删除旧表;
- 6.删除触发器。
- 步骤4的细节——数据拷贝:对正在拷贝的数据加共享锁;使用INSERT LOW_PRIORITY IGNORE INTO忽略已有数据;chunk-size和chunk-time参数限制单次拷贝的时间
- 步骤4的细节——三个触发器:
- gh-ost
- 创建幽灵表:_xxx_gho(和原表结构一致),_xxx_ghc(用于记录变更日志)
- 修改幽灵表的表结构
- 模拟成备库连接到真正的主库或备库
- 将数据从原表拷贝到幽灵表
- 应用 binlog events 到幽灵表
- 进行切换(cut-over)