一、gh-ost介绍
作为MySQL DBA都会面临这样一个问题,就是当对大表(10G以上)进行DDL变更时会有长时间锁表问题,影响业务可持续性。目前解决这个问题的方案一个较为通用的使用Percona公司开源的pt-osc工具,还有一个就是github基于go语言开发的gh-ost。gh-ost和pt-osc类似都能对大表进行在线DDL,在表格存在高并发写的情况下由于gh-ost是模拟从库应用binlog,所以性能不如pt-osc并发操作,但是gh-ost更灵活,不依赖触发器,并能根据实际情况动态调整。
安装gh-ost很简单,只需要访问https://github.com/github/gh-ost下载RPM包直接安装即可
二、gh-ost原理
gh-ost作为一个伪从库,从主库上拉取 binlog,经过过滤之后重新应用到主库,相当于在主库上的增量操作通过 binlog又应用回主库,不过是应用在一张虚拟表上。其大致的工作过程:
1、gh-ost首先连接到主库上,根据alter语句创建出虚拟表。
2、gh-ost作为从库根据参数设定连接到主库或其它从库上,在拷贝主库上的数据到虚拟表的同时,拉取增量数据产生的binlog,然后不断的把binlog应用回主库。
3、等待全部数据同步完成后将虚拟表和原表切换。
4、gh-ost在执行中会在原本的binlog event里面增加hint和心跳包用来控制整个流程的进度,检测状态等。gh-ost也会做很多前置的校验检查,比如binlog_format、表主键和唯一键、是否有外键等等。
5、gh-ost过程可停止,如果变更过程发现主库性能受影响,可以立刻停止拉取和应用 binlog,稳定之后根据binlog位置点继续应用。
三、gh-ost工作模式
a、连接到从库,但在主库做操作(默认方式,gh-ost将会检查从库状态,然后找到主库进行连接进行迁移)
1、行数据在主库上读写
2、读取从库的二进制日志,将变更应用到主库
3、在从库收集表格式、字段、索引、行数等信息
4、在从库上读取内部的变更事件(如心跳事件)
5、在主库切换表
b、连接到主库直接操作
直连主库进行copy数据和应用binlog,主库binlog格式须是row
c、在从库迁移(测试模式)
该模式会在从库执行迁移操作。gh-ost会连接到主库,所有的操作都在从库执行,不会对主库进行任何的改动。即使在复制运行阶段也可以进行表的切换操作,gh-ost将控制速度保证从库可以及时的进行数据同步
四、gh-ost重要参数说明
· 数据库连接配置
· 负载相关配置
· 主从相关配置
· SQL相关配置
五、gh-ost示例
· 示例1:对b表进行重建,即alter table b engine=innodb
gh-ost --user="root" --password="123456" --host=127.0.0.1 --port=3306 --database="test" --table="b" --allow-on-master --max-load=Threads_running=20 --critical-load=Threads_running=50 --critical-load-interval-millis=5000 --chunk-size=1000 --alter="engine=innodb" --execute --timestamp-old-table --assume-rbr --panic-flag-file=/tmp/ghost.panic.flag
· 示例2:在主库上进行DDL
gh-ost --user="root" --password="123456" --host=127.0.0.1 --port=3306 --database="test" --table="t" --alter="ADD COLUMN y1 varchar(10),add column y2 int not null default 0 comment 'test' " --allow-on-master --execute
终止gh-ost值只需要创建--panic-flag-file所指定的文件即可。停止gh-ost后会有遗留表xxx_ghc、xxx_gho及socket 文件,如果需要再次执行需要清理掉这些文件和表