【MySQL】在线无锁无延迟DDL神器gh-ost

工具简介

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:
在每次迭代中处理的行数量<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渔不是鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值