前言
生产上,有时需要对一些大表(几千万数据)的表中字段进行增、改操作.如果直接操作,很可能对线上有比较大的影响.很多时候,需要在非忙时(大多是凌晨)进行表修改.想想都折磨人.
这里记录使用工具gh-ost(go语言编写)进行表字段修改.
为什么用它
- 不影响线上性能,基于binary log的,异步的处理增量数据.而其他工具基于triggle.为什么不使用triggle?
原理
伪装成一个mysql的从节点,读取binary log.

场景
在阿里云上的一台mysql,一张2000w数据的表,需要增加一个int型字段.
使用gh-ost,耗时37分钟.
环境
- mysql 5.7.15-log (阿里云)
- gh-ost 1.0.46
使用
Requirements
- If you mysql already using RBR, all is well for you
- If not, convert one of your replicas to
binlog_format='ROW', or letgh-ostdo this for you.gh-ostwill not convert back toSTATEMENT(SBR) - Replica should support log-slave-updates.
所以,gh-ost建议连接到mysql的从节点上.原因如上:如果binary log为statement模式时,gh-ost会强制转换到row模式,且需要自己手动改回statement.(注: gh-ost参数中配置–switch-to-rbr)
limitations
- 使用具有管理员账号的权限.
- gh-ost对表名大小写不敏感,如待迁移的表名为:MyTable,且存在一张表为Mytable,则不能使用.
表需要存在主键,且主键的值不是null,否则需要在gh-ost参数中添加
--allow-nullable-unique-key.一般表的id都设置为自增主键,通用场景不用考虑这种问题.Read more如果gh-ost连接的是从节点,需要确保主从节点上两张表的表结构一直.
- 使用google云数据库,参数添加
--gcp - 使用阿里云的RDS,参数添加
--aliyun-rds - 对表重命名不能使用
Install and Use
下载完成后解压后直接使用即可.
使用的关键是相关参数的设置及理解.参数的详细信息通过./gh-ost --help查看即可.这里我也罗列了详见附录gh-ost参数详解.
这里记录下我迁移中设置的相关参数.
阿里云RDS且无从节点
阿里云的RDS,需要添加参数–aliyun-rds
无从节点,直接在主节点上执行–allow-on-master
Check binlog_format
检查mysql的binary log格式(FULL也是支持的).如果是statement,需要添加–switch-to-rbr参数,且最后需要手动将binlog_format设置回statement格式.
1 | $ show variables like 'binlog_format'; |
Run migrate
1 | ./gh-ost \ |
附录
gh-ost参数详解
1 | -aliyun-rds |