github/gh-ost
GitHub: github/gh-ost
GitHub 提供的无触发器在线 MySQL 架构迁移工具,以低干扰、可控的方式完成表结构变更。
Stars: 13295 | Forks: 1373
# gh-ost
[](https://github.com/github/gh-ost/actions/workflows/ci.yml) [](https://github.com/github/gh-ost/actions/workflows/replica-tests.yml) [](https://github.com/github/gh-ost/releases) [](https://github.com/github/gh-ost/releases)
#### GitHub 的在线 MySQL 架构迁移工具
`gh-ost` 是一个无需触发器的在线 MySQL 架构迁移解决方案。它支持可测试性,并提供暂停、动态控制/重新配置、审计以及许多操作优势。
`gh-ost` 在主库上产生的负载很轻,与迁移表上的现有工作负载解耦。
它是基于多年使用现有解决方案的经验设计的,并改变了表迁移的范式。
## 如何工作?
所有现有的在线架构变更工具都以类似的方式工作:它们创建一个与原始表相似的 _ghost_ 表,先在空表上迁移该表,然后缓慢且增量地将数据从原始表复制到 _ghost_ 表,同时持续传播正在进行的更改(对表应用的任何 `INSERT`、`DELETE`、`UPDATE`)到 _ghost_ 表。最后,在适当的时候,它们用 _ghost_ 表替换原始表。
`gh-ost` 使用相同的模式。但它与所有现有工具的不同之处在于不使用触发器。我们已经认识到触发器是 [许多限制和风险的根源](doc/why-triggerless.md)。
相反,`gh-ost` [使用二进制日志流](doc/triggerless-design.md) 来捕获表更改,并异步地将它们应用到 _ghost_ 表。`gh-ost` 承担了其他工具留给数据库执行的一些任务。因此,`gh-ost` 对迁移过程有更大的控制;可以真正暂停它;可以真正将迁移的写入负载与主库的工作负载解耦。
此外,它还提供了许多 [操作优势](doc/perks.md),使使用更安全、可信且有趣。

## 亮点
- 通过在副本上测试来建立对 `gh-ost` 的信任。`gh-ost` 将执行与在主库上相同的流程,以在副本上迁移表,而不会实际替换原始表,使副本保留两个表,您可以比较并自行验证工具是否正常运行。这是我们在生产环境中持续测试 `gh-ost` 的方式。
- 真正的暂停:当 `gh-ost` [限流](doc/throttle.md) 时,它会真正停止主库上的写入:没有行复制,也没有正在进行的事件处理。通过限流,您可以将主库恢复到其原始工作负载。
- 动态控制:你可以 [交互式地](doc/interactive-commands.md) 重新配置 `gh-ost`,即使迁移仍在运行。你也可以强制启动限流。
- 审计:你可以查询 `gh-ost` 的状态。`gh-ost` 监听 Unix 套接字或 TCP。
- 控制切over阶段:`gh-ost` 可以被指示推迟可能是最关键的一步:表交换,直到你方便可用。不必担心 ETA 在办公时间之外。
- 外部 [钩子](doc/hooks.md) 可以将 `gh-ost` 与你的特定环境集成。
请参考 [文档](doc) 获取更多信息。不,真的,请阅读 [文档](doc)。
## 用法
[速查表](doc/cheatsheet.md) 包含了所有内容。你可能对以不同模式调用 `gh-ost` 感兴趣:
- _noop_ 迁移(仅用于测试迁移是否有效且可以继续)
- 真实迁移,使用副本(迁移在主库上运行;`gh-ost` 会推断涉及的服务器身份。如果主库使用基于语句的复制,这是必需的模式)
- 直接在主库上运行的真实迁移(但 `gh-ost` 更倾向于前者)
- 在副本上的真实迁移(主库不受影响)
- 在副本上的测试迁移,让你建立对 `gh-ost` 操作的信任。
我们的建议:
- [最重要的是测试](doc/testing-on-replica.md),先尝试几次 `--test-on-replica`。更好的是,让它持续进行。我们有多个副本用于迭代整个生产表集合,逐个迁移它们,进行校验和验证,确保迁移正常。
- 对于每次主库迁移,首先执行一次 _noop_
- 然后通过 `--execute` 执行真实操作。
更多建议:
- 使用 `--exact-rowcount` 以获得准确的进度指示
- 使用 `--postpone-cut-over-flag-file` 以获得对切over时机控制
- 熟悉 [交互式命令](doc/interactive-commands.md)
另请参见:
- [要求和限制](doc/requirements-and-limitations.md)
- [常见问题](doc/questions.md)
- [万一?](doc/what-if.md)
- [详细说明](doc/the-fine-print.md)
- [社区问题](https://github.com/github/gh-ost/issues?q=label%3Aquestion)
- [在 AWS RDS 上使用 `gh-ost`](doc/rds.md)
- [在 Azure Database for MySQL 上使用 `gh-ost`](doc/azure.md)
## 名称的含义?
最初它被命名为 `gh-osc`:GitHub Online Schema Change,类似于 [Facebook 在线架构变更](https://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932/) 和 [pt-online-schema-change](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html)。
但后来发生了一次罕见的基因突变,`c` 变成了 `t`。这让我们走上了寻找新缩略词的道路。`gh-ost`(发音:_Ghost_)代表 GitHub 的 Online Schema Transmogrifier/Translator/Transformer/Transfigurator
## 许可证
`gh-ost` 根据 [MIT 许可证](https://github.com/github/gh-ost/blob/master/LICENSE) 授权。
`gh-ost` 使用第三方库,每个库都有其自己的许可证。这些库可以在 [这里](https://github.com/github/gh-ost/tree/master/vendor) 找到。
## 社区
`gh-ost` 在稳定状态下发布,但仍有改进空间。我们 [欢迎拉取请求](https://github.com/github/gh-ost/blob/master/.github/CONTRIBUTING.md)。请先在 [问题](https://github.com/github/gh-ost/issues) 中讨论你的意图。
我们在 GitHub 为社区开发 `gh-ost`。我们可能有与其他方不同的优先级。我们偶尔会提出一些贡献,这些贡献可能不在我们当前的路线图上,但可能会吸引其他人。
请参考 [Coding gh-ost](doc/coding-ghost.md) 了解如何开始参与 gh-ost 开发的指南。
## 下载/二进制文件/源代码
`gh-ost` 现在已正式发布且稳定。
`gh-ost` 提供适用于 Linux 和 Mac OS/X 的二进制格式。
[在此下载最新版本](https://github.com/github/gh-ost/releases/latest)
`gh-ost` 是一个 Go 项目;它使用 Go `1.15` 或更高版本构建。要自行构建,请使用以下任一方式:
- [script/build](https://github.com/github/gh-ost/blob/master/script/build) - 这是 CI 使用的相同构建脚本,因此生成的二进制文件是权威的;生成的文件为 `./bin/gh-ost`。
- [build.sh](https://github.com/github/gh-ost/blob/master/build.sh) 用于构建 `/tmp/gh-ost-release` 中的 `tar.gz` 归档文件。
通常来说,`master` 分支是稳定的,但只有 [发布版本](https://github.com/github/gh-ost/releases) 才应用于生产环境。
## 作者
`gh-ost` 由 GitHub 的数据库基础设施团队设计、编写、审查和测试:
- [@jonahberquist](https://github.com/jonahberquist)
- [@ggunson](https://github.com/ggunson)
- [@tomkrouper](https://github.com/tomkrouper)
- [@shlomi-noach](https://github.com/shlomi-noach)
- [@jessbreckenridge](https://github.com/jessbreckenridge)
- [@gtowey](https://github.com/gtowey)
- [@timvaillancourt](https://github.com/timvaillancourt)
`gh-ost` 是一个无需触发器的在线 MySQL 架构迁移解决方案。它支持可测试性,并提供暂停、动态控制/重新配置、审计以及许多操作优势。
`gh-ost` 在主库上产生的负载很轻,与迁移表上的现有工作负载解耦。
它是基于多年使用现有解决方案的经验设计的,并改变了表迁移的范式。
## 如何工作?
所有现有的在线架构变更工具都以类似的方式工作:它们创建一个与原始表相似的 _ghost_ 表,先在空表上迁移该表,然后缓慢且增量地将数据从原始表复制到 _ghost_ 表,同时持续传播正在进行的更改(对表应用的任何 `INSERT`、`DELETE`、`UPDATE`)到 _ghost_ 表。最后,在适当的时候,它们用 _ghost_ 表替换原始表。
`gh-ost` 使用相同的模式。但它与所有现有工具的不同之处在于不使用触发器。我们已经认识到触发器是 [许多限制和风险的根源](doc/why-triggerless.md)。
相反,`gh-ost` [使用二进制日志流](doc/triggerless-design.md) 来捕获表更改,并异步地将它们应用到 _ghost_ 表。`gh-ost` 承担了其他工具留给数据库执行的一些任务。因此,`gh-ost` 对迁移过程有更大的控制;可以真正暂停它;可以真正将迁移的写入负载与主库的工作负载解耦。
此外,它还提供了许多 [操作优势](doc/perks.md),使使用更安全、可信且有趣。

## 亮点
- 通过在副本上测试来建立对 `gh-ost` 的信任。`gh-ost` 将执行与在主库上相同的流程,以在副本上迁移表,而不会实际替换原始表,使副本保留两个表,您可以比较并自行验证工具是否正常运行。这是我们在生产环境中持续测试 `gh-ost` 的方式。
- 真正的暂停:当 `gh-ost` [限流](doc/throttle.md) 时,它会真正停止主库上的写入:没有行复制,也没有正在进行的事件处理。通过限流,您可以将主库恢复到其原始工作负载。
- 动态控制:你可以 [交互式地](doc/interactive-commands.md) 重新配置 `gh-ost`,即使迁移仍在运行。你也可以强制启动限流。
- 审计:你可以查询 `gh-ost` 的状态。`gh-ost` 监听 Unix 套接字或 TCP。
- 控制切over阶段:`gh-ost` 可以被指示推迟可能是最关键的一步:表交换,直到你方便可用。不必担心 ETA 在办公时间之外。
- 外部 [钩子](doc/hooks.md) 可以将 `gh-ost` 与你的特定环境集成。
请参考 [文档](doc) 获取更多信息。不,真的,请阅读 [文档](doc)。
## 用法
[速查表](doc/cheatsheet.md) 包含了所有内容。你可能对以不同模式调用 `gh-ost` 感兴趣:
- _noop_ 迁移(仅用于测试迁移是否有效且可以继续)
- 真实迁移,使用副本(迁移在主库上运行;`gh-ost` 会推断涉及的服务器身份。如果主库使用基于语句的复制,这是必需的模式)
- 直接在主库上运行的真实迁移(但 `gh-ost` 更倾向于前者)
- 在副本上的真实迁移(主库不受影响)
- 在副本上的测试迁移,让你建立对 `gh-ost` 操作的信任。
我们的建议:
- [最重要的是测试](doc/testing-on-replica.md),先尝试几次 `--test-on-replica`。更好的是,让它持续进行。我们有多个副本用于迭代整个生产表集合,逐个迁移它们,进行校验和验证,确保迁移正常。
- 对于每次主库迁移,首先执行一次 _noop_
- 然后通过 `--execute` 执行真实操作。
更多建议:
- 使用 `--exact-rowcount` 以获得准确的进度指示
- 使用 `--postpone-cut-over-flag-file` 以获得对切over时机控制
- 熟悉 [交互式命令](doc/interactive-commands.md)
另请参见:
- [要求和限制](doc/requirements-and-limitations.md)
- [常见问题](doc/questions.md)
- [万一?](doc/what-if.md)
- [详细说明](doc/the-fine-print.md)
- [社区问题](https://github.com/github/gh-ost/issues?q=label%3Aquestion)
- [在 AWS RDS 上使用 `gh-ost`](doc/rds.md)
- [在 Azure Database for MySQL 上使用 `gh-ost`](doc/azure.md)
## 名称的含义?
最初它被命名为 `gh-osc`:GitHub Online Schema Change,类似于 [Facebook 在线架构变更](https://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932/) 和 [pt-online-schema-change](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html)。
但后来发生了一次罕见的基因突变,`c` 变成了 `t`。这让我们走上了寻找新缩略词的道路。`gh-ost`(发音:_Ghost_)代表 GitHub 的 Online Schema Transmogrifier/Translator/Transformer/Transfigurator
## 许可证
`gh-ost` 根据 [MIT 许可证](https://github.com/github/gh-ost/blob/master/LICENSE) 授权。
`gh-ost` 使用第三方库,每个库都有其自己的许可证。这些库可以在 [这里](https://github.com/github/gh-ost/tree/master/vendor) 找到。
## 社区
`gh-ost` 在稳定状态下发布,但仍有改进空间。我们 [欢迎拉取请求](https://github.com/github/gh-ost/blob/master/.github/CONTRIBUTING.md)。请先在 [问题](https://github.com/github/gh-ost/issues) 中讨论你的意图。
我们在 GitHub 为社区开发 `gh-ost`。我们可能有与其他方不同的优先级。我们偶尔会提出一些贡献,这些贡献可能不在我们当前的路线图上,但可能会吸引其他人。
请参考 [Coding gh-ost](doc/coding-ghost.md) 了解如何开始参与 gh-ost 开发的指南。
## 下载/二进制文件/源代码
`gh-ost` 现在已正式发布且稳定。
`gh-ost` 提供适用于 Linux 和 Mac OS/X 的二进制格式。
[在此下载最新版本](https://github.com/github/gh-ost/releases/latest)
`gh-ost` 是一个 Go 项目;它使用 Go `1.15` 或更高版本构建。要自行构建,请使用以下任一方式:
- [script/build](https://github.com/github/gh-ost/blob/master/script/build) - 这是 CI 使用的相同构建脚本,因此生成的二进制文件是权威的;生成的文件为 `./bin/gh-ost`。
- [build.sh](https://github.com/github/gh-ost/blob/master/build.sh) 用于构建 `/tmp/gh-ost-release` 中的 `tar.gz` 归档文件。
通常来说,`master` 分支是稳定的,但只有 [发布版本](https://github.com/github/gh-ost/releases) 才应用于生产环境。
## 作者
`gh-ost` 由 GitHub 的数据库基础设施团队设计、编写、审查和测试:
- [@jonahberquist](https://github.com/jonahberquist)
- [@ggunson](https://github.com/ggunson)
- [@tomkrouper](https://github.com/tomkrouper)
- [@shlomi-noach](https://github.com/shlomi-noach)
- [@jessbreckenridge](https://github.com/jessbreckenridge)
- [@gtowey](https://github.com/gtowey)
- [@timvaillancourt](https://github.com/timvaillancourt)标签:binary log, database administration, EVTX分析, gh-ost, performance, schema migration, triggerless, zero-downtime migration, 二进制发布, 在线模式迁移, 开源工具, 数据库优化, 数据库工具, 数据库迁移, 数据迁移, 无触发器, 日志审计, 运维工具