gh-ost:基于 MySQL 的在线 schema 迁移工具项目

GitHub's Online Schema-migration Tool for MySQL

分支125Tags58
文件最后提交记录最后更新时间
13 天前
19 天前
2 天前
24 天前
9 年前
17 天前
1 年前
1 个月前
1 年前
3 个月前
1 个月前
1 个月前
10 年前
2 个月前
2 个月前
6 年前
1 个月前
1 个月前
5 年前

gh-ost

ci replica-tests downloads release

GitHub 的 MySQL 在线模式迁移工具

gh-ost 是一款无触发器的 MySQL 在线模式迁移解决方案。它支持测试,具备暂停功能、动态控制/重新配置能力、审计功能以及众多运维优势。

gh-ost 在整个迁移过程中对主库产生的负载较轻,且与被迁移表上的现有工作负载相互隔离。

它的设计基于多年使用现有解决方案的经验,改变了表迁移的范式。

工作原理?

所有现有的在线模式变更工具都以类似的方式运行:它们创建一个与原始表结构相似的“影子”表,在该表为空时进行模式迁移,然后缓慢且增量地将数据从原始表复制到“影子”表,同时将对原始表的持续变更(任何 INSERTDELETEUPDATE 操作)同步到“影子”表。最后,在适当的时候,它们用“影子”表替换原始表。

gh-ost 采用相同的模式。然而,它与所有现有工具的不同之处在于不使用触发器。我们已认识到触发器是 许多限制和风险的根源

相反,gh-ost 使用二进制日志流 来捕获表变更,并异步将这些变更应用到“影子”表。gh-ost 承担了一些其他工具留给数据库执行的任务。因此,gh-ost 对迁移过程拥有更强的控制力;可以真正暂停迁移;可以真正将迁移的写入负载与主库的工作负载解耦。

此外,它还提供了许多 运维优势,使其更安全、更可靠且使用起来更便捷。

gh-ost 总体流程

亮点

  • 通过在副本上测试 gh-ost 来建立您对它的信任。gh-ost 会在副本上执行与主库相同的流程来迁移表,但不会实际替换原始表,副本上会保留两个表,您可以对比它们,从而确认工具运行正常。这正是我们在生产环境中持续测试 gh-ost 的方式。
  • 真正的暂停:当 gh-ost 限流 时,它会真正停止在主库上的写入操作:不再复制行,也不再处理正在进行的事件。通过限流,您的主库会恢复到原始工作负载。
  • 动态控制:您可以交互式地重新配置 gh-ost,即使迁移仍在运行。您也可以强制启动限流。
  • 审计:您可以查询 gh-ost 的状态。gh-ost 监听 Unix 套接字或 TCP。
  • 对切换阶段的控制:可以指示 gh-ost 推迟可能是最关键的步骤——表的交换,直到您方便处理的时候。无需担心预计完成时间(ETA)在非工作时间。
  • 外部钩子可以将 gh-ost 与您特定的环境耦合。

请参考文档获取更多信息。真的,一定要阅读文档

使用方法

速查表包含了所有内容。您可能会对以各种模式调用 gh-ost 感兴趣:

  • 无操作(noop)迁移(仅测试迁移是否有效且可以执行)
  • 利用副本进行的实际迁移(迁移在主库上运行;gh-ost 会识别相关服务器的身份。如果您的主库使用基于语句的复制(Statement Based Replication),则必须使用此模式)
  • 直接在主库上运行的实际迁移(但 gh-ost 更推荐前者)
  • 在副本上进行的实际迁移(主库不受影响)
  • 在副本上进行的测试迁移,这是您建立对 gh-ost 操作信任的途径。

我们的建议:

  • 测试至上,先尝试使用 --test-on-replica 几次。更好的是,让它持续进行。我们有多个副本,在这些副本上,我们会遍历整个生产环境的表,逐个进行迁移,对结果进行校验和,以验证迁移是否成功。
  • 对于每次主库迁移,首先执行一次无操作(noop)迁移。
  • 然后通过 --execute 执行实际迁移。

更多建议:

  • 使用 --exact-rowcount 以获得准确的进度指示。
  • 使用 --postpone-cut-over-flag-file 来控制切换的时间。
  • 熟悉交互式命令

另请参阅:

名称由来?

最初,它被命名为 gh-osc,即 GitHub 在线模式变更(GitHub Online Schema Change),这与 Facebook 在线模式变更pt-online-schema-change 的命名风格相似。

但后来发生了一次罕见的“基因变异”,字母 c 变成了 t。这促使我们开始为新名称构思一个新的首字母缩写词。gh-ost(发音:Ghost)代表 GitHub 的在线模式转换工具(GitHub's Online Schema Transmogrifier/Translator/Transformer/Transfigurator)。

许可证

gh-ost 根据 MIT 许可证 授权。

gh-ost 使用第三方库,每个库都有其自己的许可证。这些许可证可在 此处 找到。

社区

gh-ost 已发布稳定版本,但仍有改进空间。我们 欢迎拉取请求。请先通过 Issues 讨论您的想法。

我们在 GitHub 为社区开发 gh-ost。我们的优先级可能与其他人不同。有时,我们可能会建议一些不在我们近期路线图上但可能对其他人有吸引力的贡献。

有关开始 gh-ost 开发的指南,请参阅 Coding gh-ost

下载/二进制文件/源代码

gh-ost 现已正式发布(GA)并稳定可用。

gh-ost 提供适用于 Linux 和 Mac OS/X 的二进制格式。

在此处下载最新版本

gh-ost 是一个 Go 项目,使用 Go 1.15 及更高版本构建。要自行构建,请使用以下任一方式:

  • script/build - 这是 CI 使用的相同构建脚本,因此具有权威性;生成的产物是 ./bin/gh-ost 二进制文件。
  • build.sh 用于在 /tmp/gh-ost-release 中构建发布产物(tar.gz 归档文件以及 .rpm/.deb 包和 SHA256SUMS 清单)。

一般来说,master 分支是稳定的,但生产环境中应仅使用 发布版本

作者

gh-ost 由 GitHub 数据库基础设施团队设计、编写、审核和测试:

项目介绍

GitHub提供的在线MySQL数据库模式迁移工具【此简介由AI生成】

定制我的领域
58013.55 K1.42 K访问 GitHub