技术分享 | Online DDL 工具 gh-ost

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

​作者:翟硕
爱可生 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=ghost
password=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用户
<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值