MySQL · 社区动态 · Online DDL 工具 gh-ost 支持阿里云 RDS

简介: 背景Online DDL 一直都是 DBA 运维时比较头疼的事,一般都会选择在业务低峰期谨慎的操作,比较常用的几个工具比如 percona pt-online-schema-change , Facebook OSC, 本质上它们都是基于触发器的,简单来讲就是通过数据库的触发器把作用在源表的操作在一个事务内同步到修改后的表中,这在业务高峰期时会极大的加重主库的负载。

背景

Online DDL 一直都是 DBA 运维时比较头疼的事,一般都会选择在业务低峰期谨慎的操作,比较常用的几个工具比如 percona pt-online-schema-change , Facebook OSC, 本质上它们都是基于触发器的,简单来讲就是通过数据库的触发器把作用在源表的操作在一个事务内同步到修改后的表中,这在业务高峰期时会极大的加重主库的负载。gh-ost 是由 Github 开发的 Online DDL 工具,使用 binlog 代替触发器来做增量数据同步,这样可以降低主库的负载,异步的执行。为了表彰 Github 在 gh-ost 上的贡献,MySQL 社区把 2017 年的社区贡献奖颁发给了 Github(值得一提的是 2018 年的 MySQl 社区贡献奖颁发给了阿里云数据库团队)。前段时间有用户反映无法在阿里云 RDS 上使用 gh-ost,经过排查和沟通解决方案,最终官方接受了我们提交的代码,增加 --aliyun-rds 参数,用户下载最新的主干代码就可以使用。

gh-ost

基于触发器的 Online DDL 工具

介绍 gh-ost 之前,先来简单了解一下在这之前基于触发器的工具原理。考虑一下 Online DDL 实际上可以粗糙的分成几步:

  1. 根据原来的表结构执行 alter 语句,新建一个更新表结构之后的表,通常称为幽灵表。对用户不可见。
  2. 把原来表的已有数据 copy 到幽灵表。
  3. 在 copy 的过程中,会有新的数据过来,这些数据要同步到幽灵表,也就是 “Online” 的精髓。
  4. copy 和同步完成后,锁住源表,交换表名,幽灵表替换源表。
  5. 删除源表(可选),完成 online DDL。

这其中比较重要的第三步,如何同步增量的数据。最开始办法就是使用触发器,在源表上增加几个触发器,例如当源表执行 INSERT,UPDATE,DELETE 语句,就把这些操作通过触发器同步到幽灵表上,这样在幽灵表上执行的语句和源表的语句就属于同一个事务,显然这样会影响主库的性能。

后面出现了异步的模式,使用触发器把对源表的操作保存到一个 Changelog 表中,不真正的去执行,专门有一个后台的线程从 Changelog 表读取数据应用到幽灵表上。这种方式一定程度上缓解了主库的压力,但是保存到 Changelog 表也同样是属于同一个事务中,对性能也有不小的影响。

gh-ost 的文档 中细数了触发器的不足之处,大致有以下几点:

  • Triggers, overhead: 触发器是用存储过程的实现的,就无法避免存储过程本身需要的开销。
  • Triggers, locks: 增大了同一个事务的执行步骤,更多的锁争抢。
  • Trigger based migration, no pause: 整个过程无法暂停,假如发现影响主库性能,停止 Online DDL,那么下次就需要从头来过。
  • Triggers, multiple migrations: 他们认为多个并行的操作是不安全的。
  • Trigger based migration, no reliable production test: 无法在生产环境做测试。
  • Trigger based migration, bound to server: 触发器和源操作还是在同一个事务空间。

Triggerless

从上面的描述可以看出,触发器的作用是源表和幽灵表之间的增量数据同步,gh-ost 放弃了触发器,使用 binlog 来同步。gh-ost 作为一个伪装的备库,可以从主库/备库上拉取 binlog,过滤之后重新应用到主库上去,相当于主库上的增量操作通过 binlog 又应用回主库本身,不过是应用在幽灵表上。引用一下官网的图:

gh-ost-general-flow.png

gh-ost 首先连接到主库上,根据 alter 语句创建幽灵表,然后作为一个”备库“连接到其中一个真正的备库上,一边在主库上拷贝已有的数据到幽灵表,一边从备库上拉取增量数据的 binlog,然后不断的把 binlog 应用回主库。图中 cut-over 是最后一步,锁住主库的源表,等待 binlog 应用完毕,然后替换 gh-ost 表为源表。gh-ost 在执行中,会在原本的 binlog event 里面增加以下 hint 和心跳包,用来控制整个流程的进度,检测状态等。这种架构带来诸多好处,例如:

  • 整个流程异步执行,对于源表的增量数据操作没有额外的开销,高峰期变更业务对性能影响小。
  • 降低写压力,触发器操作都在一个事务内,gh-ost 应用 binlog 是另外一个连接在做。
  • 可停止,binlog 有位点记录,如果变更过程发现主库性能受影响,可以立刻停止拉binlog,停止应用 binlog,稳定之后继续应用。
  • 可测试,gh-ost 提供了测试功能,可以连接到一个备库上直接做 Online DDL,在备库上观察变更结果是否正确,再对主库操作,心里更有底。
  • 并行操作,对于 gh-ost 来说就是多个对主库的连接。

需求和限制

官方文档 对于需求和限制解释的比较全面了,这里主要根据云数据库场景简单介绍下。

  • 用户没有 Super 权限,因此使用过程中要加上 –assume-rbr, gh-ost 会认为 binlog 本身就是 row 模式,不会再去修改。阿里云 RDS 上的 binlog 默认也是 row 模式,所以不存在问题。
  • 其它权限,主要是 REPLICATION SLAVE,REPLICATION CLIENT 可以拉取 binlog ,也可以获得。
  • 无法连接到备库拉取 binlog。备库通常对用户来说是透明的,所以 gh-ost 需要直接连接到主库上去,这可能会增大对主库的负载。使用的时候需要增加 –allow-on-master, –assume-master-host。官方推荐的方式也是连接到其中一个备库,因为会有一些压力较大的 SELECT 操作,放在备库是最好的。几种连接模式如下图所示:

gh-ost-operation-modes.png

aliyun-rds 参数

当有用户反馈无法在阿里云 RDS 上使用 gh-ost 的时候,我们着手进行了排查,发现在 Github 上已经有热心的用户 dikang123, exherbissue #470 中进行了讨论,原因是在校验阶段隐藏了两个参数,@@port 和 @@hostname,导致 gh-ost 获得了非法的字符。隐藏的原因是系统架构和安全的考虑,避免用户的端口和主机被恶意攻击。返回非法字符也是出于用户体验,例如 port 本应该是整型,如果返回 0,那么可能会有用户认为自己的数据库端口是 0,但是返回 ‘NULL’,用户就可以接收到明确的隐藏信号。

我们随后向官方提交了 Pull Request 从工具本身解决,经过多次交流和代码 review,决定增加一个参数 –aliyun-rds,这样就可以绕开非法字符的校验。具体的过程可以看下 Pull Request 541

目前用户使用的话,记得加上以下几个参数:

  • –allow-on-master
  • –assume-rbr
  • –assume-master-host
  • –aliyun-rds

总结

gh-ost 在 Online DDL 上确实做出了很大的创新,是一款优秀的工具,并且在很多地方的都有巧妙的设计,例如最后一步 cut-over, cut-over-example,本文并未详细描述。对于在云数据库上的使用,还有一些额外的限制,未来根据用户的需求,可以和数据库层面做更多的融合。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
11月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1697 152
|
11月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1127 156
|
存储 SQL 关系型数据库
RDS DuckDB技术解析一:当 MySQL遇见列式存储引擎
RDS MySQL DuckDB分析实例以​列式存储与向量化计算​为核心,实现​复杂分析查询性能百倍跃升​,为企业在海量数据规模场景下提供​实时分析能力​,加速企业数据驱动型决策效能。​​
|
SQL 存储 关系型数据库
菜鸟之路Day29一一MySQL之DDL
本文《菜鸟之路Day29——MySQL之DDL》由作者blue于2025年5月2日撰写,主要介绍了MySQL中的数据定义语言(DDL)。文章详细讲解了DDL在数据库和表操作中的应用,包括数据库的查询、创建、使用与删除,以及表的创建、修改与删除。同时,文章还深入探讨了字段约束(如主键、外键、非空等)、常见数据类型(数值、字符串、日期时间类型)及表结构的查询与调整方法。通过示例代码,读者可以更好地理解并实践MySQL中DDL的相关操作。
521 11
|
11月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
11月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
11月前
|
关系型数据库 MySQL 数据库
云时代MySQL:RDS与自建数据库的抉择
在云计算时代,选择合适的数据库部署方案至关重要。本文深入对比了AWS RDS与自建MySQL的优劣,帮助您在控制权、运维成本和业务敏捷性之间找到最佳平衡点。内容涵盖核心概念、功能特性、成本模型、安全性、性能优化、高可用方案及迁移策略,为您提供全面的决策参考。
|
关系型数据库 MySQL 程序员
从自建MySQL到阿里云RDS:程序员的数据库减负革命
如果你正在为自建MySQL数据库的高成本运维发愁,为凌晨三点的主从同步故障告警而崩溃,为开发团队频繁索要新测试库的要求感到窒息——是时候开启一场数据库的自我救赎了。 程序员更需构建"技术敏锐度+工程落地能力+跨域协作"的三维竞争力,通过创建技术组合形成差异化优势。企业应建立持续学习机制,提供AI沙盒环境促进技术转化。
|
SQL 关系型数据库 MySQL
MySQL 5.6/5.7 DDL 失败残留文件清理指南
通过本文的指南,您可以更安全地处理 MySQL 5.6 和 5.7 版本中 DDL 失败后的残留文件,有效避免数据丢失和数据库不一致的问题。

相关产品

  • 云数据库 RDS MySQL 版
  • 云数据库 RDS
  • 推荐镜像

    更多