作者:翟硕
爱可生 DBA 团队成员,负责公司 DMP 产品的运维和客户 MySQL 问题的处理。擅长数据库故障处理。对数据库技术和 python 有着浓厚的兴趣。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
Online DDL 工具 gh-ost
一、gh-ost 介绍
gh-ost 是 GitHub 发布的一款用于 MySQL 的无触发器在线模式迁移解决方案。它是可测试的,并提供暂停,动态控制/重新配置,审计和许多操作特权。它在整个迁移过程中,对主服务器产生的工作量很少,与已迁移表上的现有工作分离。
gh-ost 与所有现有的在线模式更改工具都以类似的方式操作:它们以与原始表相似的方式创建幽灵表,将数据从原始表缓慢且增量地复制到幽灵表,同时应用正在进行的更改(INSERT,DELETE,UPDATE)到幽灵表。最后,在适当的时候,它用幽灵表替换了原始表。gh-ost 使用相同的模式。但是,它与所有现有工具的不同之处在于不使用触发器。取而代之的是,gh-ost 使用二进制日志流捕获表的更改,然后将其异步应用到幽灵表。
gh-ost 承担一些其他工具留给数据库执行的任务。gh-ost 可以更好地控制迁移过程;可以真正暂停它;可以真正将迁移的写入负载与主服务器的工作负载分离。此外,它还提供了许多可操作的特权,使其更安全、可信赖且易于使用。
二、gh-ost 的三种模式架构

2.1、连接从库,在主库转换
这是 gh-ost 默认的工作模式,它会查看从库情况,找到集群的主库并且连接上去,对主库侵入最少
大体步骤是:
- 在主库上创建 _xxx_gho(和原表表结构一致)、_xxx_ghc(记录变更日志),并修改 _xxx_gho 表结构;
- 从 slave 上读取二进制日志事件,将变更应用到主库上的 _xxx_gho 表;
- 在主库上读源表的数据写入 _xxx_gho 表中;
- 在主库上完成表切换。
2.2、连接主库,在主库转换
需要使用 --allow-on-master 选项:
- 在主库上创建 _xxx_gho、_xxx_ghc,并修改 _xxx_gho 表结构;
- 从主库上读取二进制日志事件,将变更应用到主库上的 _xxx_gho 表;
- 在主库上读源表的数据写入 _xxx_gho 表中;
- 在主库上完成表切换。
2.3、在从库上测试和转换
这种模式会在从库上做修改。gh-ost 仍然会连上主库,但所有操作都是在从库上做的,不会对主库产生任何影响。在操作过程中,gh-ost 也会不时地暂停,以便从库的数据可以保持最新。
--migrate-on-replica 选项让 gh-ost 直接在从库上修改表。最终的切换过程也是在从库正常复制的状态下完成的。
--test-on-replica 表明操作只是为了测试目的。在进行最终的切换操作之前,复制会被停止。原始表和临时表会相互切换,再切换回来,最终相当于原始表没被动过。主从复制暂停的状态下,你可以检查和对比这两张表中的数据。
三、下载安装
3.1、下载
访问github,在此页面 https://github.com/github/gh-ost/releases 下载 gh-ost 最新的 rpm 安装包。

或者使用 wget 获取安装包
# 使用 wget 获取安装包
[root@10-186-61-20 ~]# wget https://github.com/github/gh-ost/releases/download/v1.0.49/gh-ost-1.0.49-1.x86_64.rpm
3.2、安装
使用 rpm 命令进行安装
# 使用rpm安装
[root@10-186-61-20 ~]# rpm -ivh gh-ost-1.0.49-1.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:gh-ost-1:1.0.49-1 ################################# [100%]
# 验证是否安装成功
[root@10-186-61-20 ~]# gh-ost --version
1.0.49
四、使用
4.1、常用参数介绍
| 参数 | 解释 |
|---|---|
allow-on-master |
允许迁移直接在主上运行,最好是在从上运行 |
alter |
所要更改表结构的语句 |
assume-master-host |
明确的告诉gh-ost主机的身份,这在主主复制中是有用的,或者是在tungsten-replicator中,gh-ost无法确定主 |
assume-rbr |
当确定服务器采用了ROW格式的binlog时,可以显式的指定为“true”,避免重启复制,不需要super权限,否则gh-ost无法判断当前启动的复制进程是否使用了row格式进行复制,并且会重启复制以确定使用了row格式,需要用户具有super权限。 |
chunk-size |
每次从原表copy数据的行数 |
concurrent-rowcount |
在行复制开始后,并发的对行进行计数,然后调整行估计。当为false时,先对行计数,然后进行行复制(默认true) |
conf |
配置文件,可以写入用户名和密码:[client]user=ghostpassword=123456 |
critical-load |
设置status-name=threshold,使用逗号隔开,当超过阈值时,程序会退出 |
database |
转换表所在的库名 |
dml-batch-size |
在单个事务中应用DML事件的批处理大小(范围为1-100)(默认为10) |
exact-rowcount |
实际计数表行,而不是估计它们(结果是更准确的进度估计)(select count(*) from …) |
execute |
实际执行alter并迁移表。默认是noop:执行一些测试并退出 |
master-password |
主服务器的密码,如果与从不同。使用--assume-master-host |
master-user |
主服务器的用户,如果与从不同。使用--assume-master-host |
max-lag-millis |
节流操作的复制延时,复制延迟超过此值时会触发节流(默认1500ms) |
max-load |
当负载超过status-name=threshold阈值时,出发节流,例如max-load='Threads_running=100,Threads_connected=500' |
migrate-on-replica |
让迁移在从上完整的运行,包括转换 |
nice-ratio |
每次复制行休眠的时间,0代表不休眠,1 复制行1ms,休眠1ms,0.7 代表复制10ms,休眠7ms |
ok-to-drop-table |
操作完成后删除旧表 |
panic-flag-file |
创建该文件时,程序立即终止 |
host |
连接的MySQL主机(默认127.0.0.1) |
user |
MySQL用户 |
| < |

gh-ost是一款由GitHub发布的MySQL无触发器在线模式迁移解决方案,适用于数据库架构变更场景,支持暂停、动态控制及审计功能,减少对主服务器的影响。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



