工具简介
gh-ost
是一款在线无锁的DDL神器,支持在主库,或者从库两种模式使用,
而且还可以根据系统的负载延迟来动态暂停启动DDL工作,避免主从延迟等
问题的出现。
官方地址:gh-ost官网
工作原理
gh-ost使用二进制日志流捕获表更改,并异步应用到幽灵表上,最后交换幽灵表和原表。
执行DDL的过程可分为三个阶段:
1. `校验`:是否有主键、外键、触发器;gh-ost连接的是主库还是从库,从库是否开启log_slave_updates;是否已经存在gho和del结尾的临时表等。
2. `迁移`:监听binlog → 创建gho表并应用DDL → rowcopy+应用binlog。
3. `cut-over`:切换幽灵表和原表。
注意事项
1. 不支持:没有主键或唯一索引的表、有外键或触发器的表;
2. 执行前show engine innodb status\G检查Free buffers是否小于服务器剩余的内存;
3. gh-ost有两种执行模式:一从主库拉取binlog,二从从库拉取binlog;被拉取binlog的mysql会使用innodb以外的内存。一定要使用无业务流量的从库,或是内存空闲的从库,用于拉取binlog(即在gh-ost命令中填写的实例IP);
4. 不要使用--exact-rowcount,会产生更多无法释放的内存,且增加的内存不在innodb的限制范围内;
5. 检查磁盘空间,至少增长变更表的size,还需考虑binlog的增长;建议使用max_binlog_files控制binlog数量
6. 应用binlog是单线程,如果原表tps持续过高,则gh-ost任务完成周期将过长或者无法完成
7. 不建议在生产cut-over阶段立马删除原表,需考虑IO影响(不能添加参数ok-to-drop-table);
需在低峰期对原表做硬连接,循环清理遗留原表_[tablename]_del;
常用参数
gh-ost --help
-allow-master-master:
是否允许gh-ost运行在双主复制架构中,一般与-assume-master-host参数一起使用
-allow-nullable-unique-key:
允许gh-ost在数据迁移依赖的唯一键可以为NULL,默认为不允许为NULL的唯一键。如果数据迁移(migrate)依赖的唯一键允许NULL值,则可能造成数据不正确,请谨慎使用。
-allow-on-master:
允许gh-ost直接运行在主库上。默认gh-ost连接的从库。
-alter string:
DDL语句
-assume-master-host string:
为gh-ost指定一个主库,格式为”ip:port”或者”hostname:port”。在这主主架构里比较有用,或则在gh-ost发现不到主的时候有用。
-assume-rbr:
确认gh-ost连接的数据库实例的binlog_format=ROW的情况下,可以指定-assume-rbr,这样可以禁止从库上运行stop slave,start slave,执行gh-ost用户也不需要SUPER权限。
-chunk-size int:
在每次迭代中处理的行数量<