简介
相对pt-online-schema-change而言,看介绍gh-ost省去了创建触发器的动作,这就带来了解决了之前我经常用pt做ddl变更时的痛点:pt更变表结构时,如果当前有关于这个表的长事务在运行,那么创建触发器必然引起medata lock锁等待导致服务不可用。
官方地址
https://github.com/github/gh-ost/releases
不过gh-ost有以下限制
1 binlog_format必须为row
2 更改的表必须有主键或唯一键
使用
参数含义略,典型使用如下
./gh-ost --max-load=Threads_connected=3000 --critical-load=Threads_connected=5000 --chunk-size=1000 -initially-drop-ghost-table --initially-drop-socket-file --ok-to-drop-table --host="xxxxxxx" --port=3306 --user="ucloudbackup" --password='xxxxxx' --database='xxxxx' --table="xx" -verbose --alter="add column rrr varchar(11)" --cut-over=default --panic-flag-file=/tmp/ghost.panic.flag --execute --allow-on-master
实测感受
实际上变更的表如果有超长事务,依然存在mdl锁问题导致失败,因为在最后的新表旧表交替阶段,会有一个短暂的加锁操作,而长事务会阻塞这个加锁操作。所以对我的业务场景来说,这个工具没啥实质提升,只是减少了mdl锁可能的次数,还得在ddl前确认无长事务