Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL Online DDL经典工具-gh-ost

MySQL Online DDL经典工具-gh-ost

作者头像
DBA札记
发布于 2023-11-16 11:01:20
发布于 2023-11-16 11:01:20
57700
代码可运行
举报
文章被收录于专栏:MySQL参数系列MySQL参数系列
运行总次数:0
代码可运行

Online DDL一直是MySQL数据库的一个痛点,好在官方和社区都有不错的解决方案。这些方案大致有以下几个:

本文主要给大家介绍一下由github开源的gh-ost。目前为止大表DDL最好的工具。

1 安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 本文安装1.1.5版本
wget https://github.com/github/gh-ost/releases/download/v1.1.5/gh-ost-1.1.5-1.x86_64.rpm  
yum -y localinstall gh-ost-1.1.5-1.x86_64.rpm

2 使用

gh-ost有三种模式,分别是在连接从库DDL单实例(相当于只在主库)DDL、在从库测试DDL三种模式。

本案例主库:192.168.1.30 本案例主库:192.168.1.31

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
前置条件:  
gh-ost目前需要MySQL版本为5.7及更高版本。

gh-ost需要具有以下权限的账户:
在迁移表所在的数据库(模式)上具有ALTERCREATEDELETEDROPINDEXINSERTLOCK TABLESSELECTTRIGGERUPDATE权限,或者当然也可以在*.*上具有这些权限。
要么:
在*.*上具有SUPERREPLICATION SLAVE权限,或者:
在*.*上具有REPLICATION CLIENTREPLICATION SLAVE权限。
需要SUPER权限来执行STOP SLAVESTART SLAVE操作。这些操作用于:

在binlog_format不是ROW且您明确指定了--switch-to-rbr的情况下,切换binlog_format为ROW。如果您的复制已经处于RBR状态(binlog_format=ROW),您可以指定--assume-rbr以避免STOP SLAVE/START SLAVE操作,因此不需要SUPER权限。gh-ost对所有MySQL连接使用REPEATABLE_READ事务隔离级别,而不管服务器默认设置如何。运行--test-on-replica:在切换阶段之前,gh-ost会停止复制,以便您可以比较两个表并确保迁移是正确的。

2.1 连接从库DDL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gh-ost --user="gh_user" --password="xxx" --host=192.168.1.31 --database="bbb" --table="student" --initially-drop-old-table --alter="ADD COLUMN y1 varchar(10),add column y2 int not null default 0 comment 'test' "  --execute

2.2 单实例DDL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gh-ost --user="gh_user" ---password="xxx" --host=192.168.1.30 --database="bbb" --table="student"  --alter="ADD COLUMN cc2 varchar(10),add column cc3 int not null default 0 comment 'test' " --allow-on-master  --execute

2.3 从库测试DDL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gh-ost --user="gh_user" --password="xxx" --host=192.168.1.31 --database="bbb" --table="student"  --alter="ADD COLUMN abc1 varchar(10),add column abc2 int not null default 0 comment 'test' " --test-on-replica  --switch-to-rbr --execute

3 参数说明

gh-ost --help即可查看

4 限速

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gh-ost --user="gh_user" --password="xxx" --host=192.168.1.31 --database="bbb" --table="student"  --alter="ADD COLUMN o2 varchar(10),add column o1 int not null default 0 comment 'test' " --exact-rowcount --serve-socket-file=/tmp/gh-ost.t1.sock --panic-flag-file=/tmp/gh-ost.panic.t1.flag  --postpone-cut-over-flag-file=/tmp/ghost.postpone.t1.flag --allow-on-master  --execute

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
① 标示文件终止运行:--panic-flag-file

创建文件终止运行,例子中创建/tmp/gh-ost.panic.t1.flag文件,终止正在运行的gh-ost,临时文件清理需要手动进行。

② 表示文件禁止cut-over进行,即禁止表名切换,数据复制正常进行。--postpone-cut-over-flag-file

创建文件延迟cut-over进行,即推迟切换操作。例子中创建/tmp/ghost.postpone.t1.flag文件,gh-ost 会完成行复制,但并不会切换表,它会持续的将原表的数据更新操作同步到临时表中。

③ 使用socket监听请求,操作者可以在命令运行后更改相应的参数。--serve-socket-file,--serve-tcp-port(默认关闭)

创建socket文件进行监听,通过接口进行参数调整,当执行操作的过程中发现负载、延迟上升了,不得不终止操作,重新配置参数,如 chunk-size,然后重新执行操作命令,可以通过scoket接口进行动态调整。如:

暂停操作:

#暂停
echo throttle | socat - /tmp/gh-ost.test.t1.sock
#恢复
echo no-throttle | socat - /tmp/gh-ost.test.t1.sock
修改限速参数:

echo chunk-size=100 | socat - /tmp/gh-ost.t1.sock

echo max-lag-millis=200 | socat - /tmp/gh-ost.t1.sock

echo max-load=Thread_running=3 | socat - /tmp/gh-ost.t1.sock

5 DDL 过程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
① 检查有没有外键和触发器。
② 检查表的主键信息。
③ 检查是否主库或从库,是否开启log_slave_updates,以及binlog信息  
④ 检查gho和del结尾的临时表是否存在
⑤ 创建ghc结尾的表,存数据迁移的信息,以及binlog信息等    
---以上校验阶段
⑥ 初始化stream的连接,添加binlog的监听
---以下迁移阶段
⑥ 创建gho结尾的临时表,执行DDL在gho结尾的临时表上
⑦ 开启事务,按照主键id把源表数据写入到gho结尾的表上,再提交,以及binlog apply。
---以下cut-over阶段
⑧ lock源表,rename 表:rename 源表 to 源_del表,gho表 to 源表。
⑨ 清理ghc表。

6 限制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
外键约束不受支持。将来可能会在某种程度上支持。

触发器不受支持。将来可能会支持。

MySQL 5.7支持JSON列,但不作为主键的一部分。

前后两个表必须共享一个主键或其他唯一键。gh-ost将使用此键在复制时迭代表行。阅读更多

迁移键不得包含具有NULL值的列。这意味着:
列是NOT NULL,或
列是可空的,但不包含任何NULL值。
默认情况下,如果唯一键包括可空列,则gh-ost不会运行。
您可以通过--allow-nullable-unique-key覆盖此行为,但请确保这些列中没有实际的NULL值。现有的NULL值无法保证迁移表的数据完整性。
不允许迁移存在具有相同名称但大小写不同的另一个表的表。

例如,如果同一模式中存在名为MYtable的另一个表,则无法迁移MyTable。
Amazon RDS可用,但具有自己的限制。

Google Cloud SQL可用,需要--gcp标志。

Aliyun RDS可用,需要--aliyun-rds标志。

Azure Database for MySQL可用,需要--azure标志,并且有详细的文档(azure.md)。

当通过副本进行迁移时,不支持多源。如果直接连接到主服务器(--allow-on-master),则应该可以工作(但从未经过测试)。

仅支持活动-被动设置的主-主设置。不支持同时在两个主服务器上写入表的活动-活动设置。将来可能会支持。

如果枚举字段作为迁移键(通常是主键)的一部分,则迁移性能将降低并且可能很差。阅读更多

不支持迁移FEDERATED表,这与gh-ost解决的问题无关。

不支持加密的二进制日志。

不支持ALTER TABLE ... RENAME TO some_other_name(您不应该使用gh-ost进行这种微不足道的操作)。

6 参考资料:

1、https://www.cnblogs.com/zhoujinyi/p/9187421.html 2、《MySQL实战》 第七章 DDL 3、官方文档 https://github.com/github/gh-ost/tree/master/doc

一起交流数据库技术。后台回复“交流群”可添加技术交流群。欢迎觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA札记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL在线DDL工具 gh-ost
gh-ost基于 golang 语言,是 github 开源的一个 DDL 工具,是 GitHub's Online Schema Transmogrifier/Transfigurator/Transformer/Thingy 的缩写,意思是 GitHub 的在线表定义转换器。
东山絮柳仔
2021/03/18
1.8K0
gh-ost 在线ddl变更工具​
作为MySQL DBA,相信我们大家都会对大表变更(大于10G 以上的)比较头疼,尤其是某些DDL会锁表,影响业务可持续性。目前通用的方案使用Percona 公司开源的pt-osc 工具解决导致锁表的操作,还有一款github基于go语言开发的gh-ost。本文主要介绍gh-ost使用方法,其工作原理放到下一篇文章介绍。
用户1278550
2019/09/03
1.2K0
gh-ost 在线ddl变更工具​
Online DDL 工具 gh-ost实战(一)
2020年了,开始正文前,先说几句废话,2019年公众号开始正式更文,后期由于个人问题停更了,2020年开始重新开始更文,更文目的很简单,记录自己的学习,分享给大家,就这么简单;好啦,言归正传,下面开始今天的正文了;
SEian.G
2021/03/03
2.3K0
MySQL DDL Online Schema Change—gh-ost介绍
gh-ost是针对MySQL对主库影响很小,无trigger的online schema change解决方案。采用消费binlog的方式来代替trigger方式,并将同步信息存储到临时表中。
MySQL轻松学
2019/12/05
1.5K0
技术分享 | Online DDL 工具 gh-ost
爱可生 DBA 团队成员,负责公司 DMP 产品的运维和客户 MySQL 问题的处理。擅长数据库故障处理。对数据库技术和 python 有着浓厚的兴趣。
爱可生开源社区
2020/08/05
1.2K0
技术分享 | Online DDL 工具 gh-ost
gh-ost 学习笔记
https://m.aliyun.com/yunqi/articles/62928
保持热爱奔赴山海
2019/09/17
1.3K0
gh-ost 学习笔记
MySQL 最佳实践:gh-ost 工具使用详解
MySQL 的同步机制比较单纯,主库上执行过的 DML 和 DDL 会在从库上再执行一次,那么主库上需要 10min 才能执行完的 DDL 理论上在从库至少也要花费 10min 才能执行完,这意味着从库的同步会延迟 10min 以上,等 DDL 执行完之后才会继续追同步。
王文安@DBA
2020/07/30
10.8K0
MySQL 最佳实践:gh-ost 工具使用详解
gh-ost:在线DDL修改MySQL表结构工具
在之前,我分享过一次 pt-online-schema-change 在线 DDL 的工具实践记录,在实际使用过程中,发现部门的很多老系统大量使用了触发器,从而无法使用这个工具,非常遗憾!导致很多 DDL 变更都必须压到空闲时候做,比如凌晨,非常苦逼。 咨询了做 DBA 的老同事,他将 gh-ost 推荐给我,基于 golang 语言,是 github 开源的一个 DDL 工具,gh-ost 是 gitHub,s Online Schema Transmogrifier/Transfigurator/Tra
张戈
2018/03/26
6.6K2
gh-ost:在线DDL修改MySQL表结构工具
gh-ost工具Online-ddl简单操作记录
主从架构 192.168.175.206 主 192.168.175.207 从 192.168.175.208 从 ghost配置文件(可以不加) 在207上添加 [root@localhost ~]# vi ghost.conf [client] user=mha password=123 命令如下 [root@test-206 ~]# gh-ost --assume-master-host='192.168.175.206:3306' --master-user='mha' --master-p
shynodes
2021/07/28
6920
gh-ost工具Online-ddl简单操作记录
MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk
PT工具在MYSQL中的使用其实已经好像有“半个世纪了”,其出名的原因主要是因为pt-osc,如果你不知道,那你真的用过MYSQL,其实还有另外两家 FB-OST , GH-OST.
AustinDatabases
2020/03/26
8950
MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk
MySQL Online DDL
serena
2017/06/01
8.1K0
MySQL Online DDL
Online DDL 工具 gh-ost原理(二)
接上一篇文章Online DDL 工具 gh-ost实战(一),介绍了gh-ost的实际使用案例,本文介绍一下gh-osh的相关原理;
SEian.G
2021/03/03
8320
Mysql onlineddl vs gh-ost
Innodb早期支持通过copy table跟inplace的方式来执行DDL语句,其原理如下:
mingjie
2022/05/12
8920
Mysql onlineddl vs gh-ost
MySQL 拜托加个索引能和PG一样简单吗? 只能gh-ost了 烦人
MySQL MySQL 怎么那么烦人,好用,好用个屁。用过数据库吗说好用,加个索引都那么的费劲。说到这里我很想用宋丹丹老师那句,怎么那么烦人来结束此篇文章,在给MYSQL一个大白眼,和SQL SERVER ORACLE 比不了,和 PG也比不了,人家仨都有在线索引的技术,虽然SQL SERVER 黑,必须买企业版,但人家有。MySQL 呵呵
AustinDatabases
2024/06/04
1750
MySQL DDL发展史
- 注意: 在online ddl前,inplace的方法主要在第三步大大缩短了时间,只重构了索引,没有重新copy所有数据
划水教练
2022/05/17
1.1K0
MySQL DDL发展史
gh-ost 原理剖析
上一篇文章 介绍 gh-ost 参数和具体的使用方法,以及核心特性-可动态调整 暂停,动态修改参数等等。本文分几部分从源码方面解释gh-ost的执行过程,数据迁移,切换细节设计。
用户1278550
2019/09/24
2.4K0
gh-ost 原理剖析
MySQL 表 DDL 操作全攻略
MySQL 千万级表因为上述相关的一些问题,需要进行 DDL 操作时,由于其锁表特性可能引发诸多严重问题:
蝉羽
2024/11/25
3290
技术分享 | 实测在 after_sync 中使用 gh-ost是如何丢数据的
最近,IMG 的姜老师发布了一篇关于使用 gh-ost 会丢数据的文章(gh-ost 翻车!使用后导致数据丢失!),大致结论就是:在 MySQL AFTER_SYNC的 场景下,使用 gh-ost 进行表结构变更(包括最新 GA 的1.1.2版本在内),可能会导致数据丢失,还引起大家在微信群内展开了一些讨论。得知这个消息,还是觉得有些意外的,毕竟对于大部分 DBA 来说,gh-ost 属于比较常用的 DDL 工具,会用其替代 pt-osc 或 MySQL 自带的 online ddl 。出于好奇,去 gh-ost 的 Gtihub 主页上看了下,还真有相关的 issue ,并且已经有人提交了 fix 的 PR (目前该 fix 尚未得到官方回应)
爱可生开源社区
2021/11/11
1.1K0
技术分享 | 实测在 after_sync 中使用 gh-ost是如何丢数据的
Gh-ost改表P0级BUG:可能导致数据丢失
| 导语Gh-ost改表工具是MySQL主流的2种开源改表工具之一,因为可限速,入侵小而在业界广泛使用,然而Gh-ost存在1个P0级的未修复BUG,可能导致数据丢失,本文对这个问题进行了分析,并给出了解决方案。
DBA成江东
2023/07/20
1.3K0
Gh-ost改表P0级BUG:可能导致数据丢失
MySQL在线DDL修改表结构的简单经验分享
摘 要 在线DDL修改生产环境的大表一直是运维、DBA一个很头痛的问题,本文分享一些相关经验,希望对还在头痛的同学能有所帮助,当然更希望路过的大神,如果有更靠谱的方案能够指点一二,不吝赐教。 一、故障背景 内部故障群反馈:XX 系统卡住不可用了,请帮忙看看; 排查发现是有一个 alter 修改数据库的表结构的变更,出现了大量的 MDL 锁,导致服务不可用,最后通过 kill 掉这个 alter 恢复了服务。当然, 这个 alter 需求也就暂时搁置了。 业务需求的变更肯定还是要继续执行的,因此就有了各种
张戈
2018/03/26
3.5K0
MySQL在线DDL修改表结构的简单经验分享
相关推荐
MySQL在线DDL工具 gh-ost
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验