<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>gh-ost Archives - 原立方</title>
	<atom:link href="https://www.atomic-cube.cn/tag/gh-ost/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.atomic-cube.cn/tag/gh-ost/</link>
	<description>技术栈的流动-从零到∞</description>
	<lastBuildDate>Tue, 23 Jun 2026 07:23:32 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>
	<item>
		<title>MYSQL线上数据库表归档工具推荐之gh-ost</title>
		<link>https://www.atomic-cube.cn/mysql%e7%ba%bf%e4%b8%8a%e6%95%b0%e6%8d%ae%e5%ba%93%e8%a1%a8%e5%bd%92%e6%a1%a3%e5%b7%a5%e5%85%b7%e6%8e%a8%e8%8d%90%e4%b9%8bgh-ost/</link>
					<comments>https://www.atomic-cube.cn/mysql%e7%ba%bf%e4%b8%8a%e6%95%b0%e6%8d%ae%e5%ba%93%e8%a1%a8%e5%bd%92%e6%a1%a3%e5%b7%a5%e5%85%b7%e6%8e%a8%e8%8d%90%e4%b9%8bgh-ost/#respond</comments>
		
		<dc:creator><![CDATA[evans]]></dc:creator>
		<pubDate>Fri, 19 Jun 2026 23:00:57 +0000</pubDate>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[技术文章]]></category>
		<category><![CDATA[DDL]]></category>
		<category><![CDATA[gh-ost]]></category>
		<guid isPermaLink="false">https://www.atomic-cube.cn/?p=1648</guid>

					<description><![CDATA[<p>一：gh-ost 介绍 gh-ost 是一款由GitHub开发的在线DDL（Online Data Definition Language）变更工具，专门用于MySQL数据库 。它允许在不锁定表的情况下执行数据库模式变更，从而避免了传统ALTER TABLE命令可能带来的长时间锁表问题，这对于高可用性要求严格的生产环境尤为重要。它通过无触发器 （trigger-less）的方式实现表结构变更，减少了对数据库性能的影响，同时支持暂停、限速、动态配置等功能。相较于传统的 pt-online-schema-change，gh-ost 更安全、灵活，且对主库负载更低。 📖主要特点 其操作流程大致如下： 二：gh-ost 的三种模式架构 2.1 连接从库，在主库转换 这是 gh-ost 默认的工作模式，它会查看从库情况，找到集群的主库并且连接上去，对主库侵入最少。大体步骤是： 2.2 连接主库，在主库转换 需要使用&#160;&#8211;allow-on-master&#160;选项： 2.3 在从库上测试和转换 这种模式会在从库上做修改。gh-ost 仍然会连上主库，但所有操作都是在从库上做的，不会对主库产生任何影响。在操作过程中，gh-ost 也会不时地暂停，以便从库的数据可以保持最新。 &#8211;migrate-on-replica&#160;选项让 gh-ost 直接在从库上修改表。最终的切换过程也是在从库正常复制的状态下完成的。 &#8211;test-on-replica 表明操作只是为了测试目的。在进行最终的切换操作之前，复制会被停止。原始表和临时表会相互切换，再切换回来，最终相当于原始表没被动过。主从复制暂停的状态下，你可以检查和对比这两张表中的数据。 三：下载安装： https://github.com/github/gh-ost/releases/latest 1.18已经支持MySQL 8.4了👍🏻 基本使用 🔥使用示例 1.添加新列 2.修改字段类型 3.添加索引 4.切换主库在主库故障转移时，支持动态切换： 💥注意事项权限要求 需要 SUPER、REPLICATION SLAVE、REPLICATION CLIENT 权限。对原表和临时表有 CREATE、DELETE、ALTER 权限。主键必须存在目标表必须包含主键或唯一索引。 外键和触发器gh-ost 不支持有外键约束或触发器的表。 大表操作超大表迁移时需关注磁盘空间（临时表会占用额外空间）和网络负载。</p>
<p>The post <a href="https://www.atomic-cube.cn/mysql%e7%ba%bf%e4%b8%8a%e6%95%b0%e6%8d%ae%e5%ba%93%e8%a1%a8%e5%bd%92%e6%a1%a3%e5%b7%a5%e5%85%b7%e6%8e%a8%e8%8d%90%e4%b9%8bgh-ost/">MYSQL线上数据库表归档工具推荐之gh-ost</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="320" height="106" src="https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-logo-dark-320.png" alt="" class="wp-image-1660" srcset="https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-logo-dark-320.png 320w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-logo-dark-320-300x99.png 300w" sizes="(max-width: 320px) 100vw, 320px" /></figure>
</div>


<h2 class="wp-block-heading"><strong>一：gh-ost 介绍</strong></h2>



<p class="wp-block-paragraph" id="block-2c4efc0a-cc3b-40a3-985f-7658f01311db">gh-ost 是一款由GitHub开发的在线DDL（Online Data Definition Language）变更工具，专门用于MySQL数据库 。它允许在不锁定表的情况下执行数据库模式变更，从而避免了传统ALTER TABLE命令可能带来的长时间锁表问题，这对于高可用性要求严格的生产环境尤为重要。<br>它通过无触发器 （trigger-less）的方式实现表结构变更，减少了对数据库性能的影响，同时支持暂停、限速、动态配置等功能。相较于传统的 pt-online-schema-change，gh-ost 更安全、灵活，且对主库负载更低。</p>



<p class="wp-block-paragraph">📖主要特点</p>



<ul class="wp-block-list">
<li>无锁表操作：与传统的ALTER TABLE不同，gh-ost不会长时间锁表，使得在生产环境中进行DDL变更更加安全。</li>



<li>基于复制的迁移：gh-ost通过从库读取二进制日志来应用变更，这减少了对主库的压力。</li>



<li>灵活的控制方式：支持动态调整速率限制、暂停/恢复操作等。</li>



<li>模拟和预检查功能：提供dry-run选项用于测试变更效果，以及pre-flight checks确保操作的安全性。</li>



<li>易于使用：虽然功能强大，但相对简单易用，适合DBA和技术人员快速上手。</li>



<li>无触发器设计:不依赖数据库触发器，而是通过解析 MySQL 的 binlog 来同步数据变更，减少主库负载和潜在锁冲突。</li>



<li>多种运行模式:可连接到主库（master）或副本库（replica），根据需求选择不同迁移策略。</li>
</ul>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="459" src="https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-general-flow-1024x459.png" alt="" class="wp-image-1659" srcset="https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-general-flow-1024x459.png 1024w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-general-flow-300x134.png 300w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-general-flow-768x344.png 768w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-general-flow-1536x688.png 1536w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-general-flow.png 1724w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph" id="block-f3112b64-64ca-41a4-846e-6b7eaf05fbbe">其操作流程大致如下<a href="https://support.huaweicloud.com/intl/en-us/bestpractice-rds-mysql/rds_02_0024.html" target="_blank" rel="noreferrer noopener"></a><a href="https://developer.aliyun.com/article/62928" target="_blank" rel="noreferrer noopener"></a>：</p>



<ol start="1" id="block-080e6dd3-5cf5-4aa5-a9d3-3bbf5f77521e" class="wp-block-list">
<li><strong>创建两张内部管理表</strong><a href="https://cloud.tencent.cn/developer/article/1803585?from=15425" target="_blank" rel="noreferrer noopener"></a><a href="https://m.yisu.com/zixun/259034.html" target="_blank" rel="noreferrer noopener"></a>：包括 <code>_表名_gho</code> 的“影子表”（Ghost Table，即变更后的新表）和 <code>_表名_ghc</code> 的“日志表”，用于记录心跳、进度等元信息。</li>



<li><strong>复制存量与同步增量（双线程并行）</strong>：
<ul class="wp-block-list">
<li>一个线程负责将原表的<strong>存量数据</strong>分批复制到影子表<a href="https://cloud.tencent.cn/developer/article/1803585?from=15425" target="_blank" rel="noreferrer noopener"></a><a href="https://blog.51cto.com/u_15077536/5955874" target="_blank" rel="noreferrer noopener"></a>。</li>



<li>同时，另一个线程模拟从库拉取Binlog，解析出原表上的所有<code>INSERT</code>, <code>UPDATE</code>, <code>DELETE</code><strong>增量变更</strong>，并同步到影子表<a href="https://cloud.tencent.cn/developer/article/1803585?from=15425" target="_blank" rel="noreferrer noopener"></a><a href="https://m.yisu.com/zixun/259034.html" target="_blank" rel="noreferrer noopener"></a>。</li>
</ul>
</li>



<li><strong>冲突处理策略</strong>：为保证双线程并行时数据一致，gh-ost 采用了特殊的语句改写策略：将复制线程的 <code>INSERT</code> 改写为 <code>INSERT IGNORE</code>，将 Binlog 中的 <code>INSERT</code> 改写为 <code>REPLACE INTO</code><a href="https://cloud.tencent.cn/developer/article/1803585?from=15425" target="_blank" rel="noreferrer noopener"></a>。</li>



<li><strong>原子切换 (Cut-over)</strong>：当数据同步完成，gh-ost会锁定原表并执行<code>RENAME</code>操作，瞬间将影子表替换为正式表<a href="https://cloud.tencent.cn/developer/article/1803585?from=15425" target="_blank" rel="noreferrer noopener"></a><a href="https://app4.secure.forcepoint.com/vdt/gh-ost/blob/master/doc/questions.md" target="_blank" rel="noreferrer noopener"></a>。</li>
</ol>



<h2 class="wp-block-heading" id="block-8873e6df-53d5-484c-b847-d21de8d88165">二：<strong>gh-ost 的三种模式架构</strong></h2>



<figure class="wp-block-image size-large" id="block-5c7df4a8-2a1a-47ee-80ef-33a3a4b68c49"><img decoding="async" width="1024" height="428" src="https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-operation-modes-1024x428.png" alt="" class="wp-image-1658" srcset="https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-operation-modes-1024x428.png 1024w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-operation-modes-300x125.png 300w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-operation-modes-768x321.png 768w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-operation-modes-1536x642.png 1536w, https://www.atomic-cube.cn/wp-content/uploads/2026/04/gh-ost-operation-modes.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph" id="block-d6a6c072-e153-4221-b020-4a7e49448191"><strong>2.1 连接从库，在主库转换</strong></p>



<p class="wp-block-paragraph">这是 gh-ost 默认的工作模式，它会查看从库情况，找到集群的主库并且连接上去，对主库侵入最少。大体步骤是：</p>



<ul class="wp-block-list">
<li>在主库上创建 _xxx_gho（和原表表结构一致）、_xxx_ghc（记录变更日志），并修改 _xxx_gho 表结构；</li>



<li>从 slave 上读取二进制日志事件，将变更应用到主库上的 _xxx_gho 表；</li>



<li>在主库上读源表的数据写入 _xxx_gho 表中；</li>



<li>在主库上完成表切换。</li>
</ul>



<p class="wp-block-paragraph"><strong>2.2 连接主库，在主库转换</strong></p>



<p class="wp-block-paragraph">需要使用&nbsp;<strong>&#8211;allow-on-master</strong>&nbsp;选项：</p>



<ul class="wp-block-list">
<li>在主库上创建 _xxx_gho、_xxx_ghc，并修改 _xxx_gho 表结构；</li>



<li>从主库上读取二进制日志事件，将变更应用到主库上的 _xxx_gho 表；</li>



<li>在主库上读源表的数据写入 _xxx_gho 表中；</li>



<li>在主库上完成表切换。</li>
</ul>



<p class="wp-block-paragraph"><strong>2.3 在从库上测试和转换</strong></p>



<p class="wp-block-paragraph">这种模式会在从库上做修改。gh-ost 仍然会连上主库，但所有操作都是在从库上做的，不会对主库产生任何影响。在操作过程中，gh-ost 也会不时地暂停，以便从库的数据可以保持最新。</p>



<p class="wp-block-paragraph"><strong>&#8211;migrate-on-replica</strong>&nbsp;选项让 gh-ost 直接在从库上修改表。最终的切换过程也是在从库正常复制的状态下完成的。</p>



<p class="wp-block-paragraph" id="block-d6a6c072-e153-4221-b020-4a7e49448191"><strong>&#8211;test-on-replica</strong> 表明操作只是为了测试目的。在进行最终的切换操作之前，复制会被停止。原始表和临时表会相互切换，再切换回来，最终相当于原始表没被动过。主从复制暂停的状态下，你可以检查和对比这两张表中的数据。</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading" id="block-d6a6c072-e153-4221-b020-4a7e49448191">三：下载安装：</h2>



<p class="wp-block-paragraph"><a href="https://github.com/github/gh-ost/releases/latest">https://github.com/github/gh-ost/releases/latest</a></p>



<p class="wp-block-paragraph">1.18已经支持MySQL 8.4了👍🏻</p>



<pre class="wp-block-code"><code>chmod +x gh-ost</code></pre>



<p class="wp-block-paragraph">基本使用</p>



<pre class="wp-block-code"><code>gh-ost \
  --host=&lt;主库地址> \
  --port=&lt;主库端口> \
  --user=&lt;用户名> \
  --password=&lt;密码> \
  --database=&lt;数据库名> \
  --table=&lt;表名> \
  --alter="&lt;DDL语句>" \
  --execute
</code></pre>



<pre class="wp-block-code"><code>🔥关键参数说明
参数	说明
--alter	需要执行的 DDL 语句（如 ADD COLUMN，DROP INDEX 等）
--execute	实际执行迁移（默认是 dry-run 模式）
--allow-on-master	允许直接连接主库（默认连接到副本库）
--max-load=&lt;metrics>	设置负载阈值（如 Threads_running=50）
--chunk-size=&lt;rows>	每次迁移的数据块大小（默认 1000）
--critical-load=&lt;metrics>	负载超限时终止操作
--switch-to-rbr	自动将副本库的 binlog 格式改为 ROW
--postpone-cut-over-flag-file=&lt;path>	通过文件控制是否延迟切换表
--throttle-control-replicas	指定需要监控的副本库列表
--tmpdir	指定临时文件目录</code></pre>



<p class="wp-block-paragraph">🔥使用示例</p>



<p class="wp-block-paragraph">1.添加新列</p>



<pre class="wp-block-code"><code>gh-ost \
  --host=127.0.0.1 \
  --port=3306 \
  --user=admin \
  --password=secret \
  --database=mydb \
  --table=orders \
  --alter="ADD COLUMN comment VARCHAR(255)" \
  --execute
</code></pre>



<p class="wp-block-paragraph">2.修改字段类型</p>



<pre class="wp-block-code"><code>gh-ost \
  --alter="MODIFY COLUMN amount DECIMAL(10,2)" \
  --host=127.0.0.1 \
  --execute
</code></pre>



<p class="wp-block-paragraph">3.添加索引</p>



<pre class="wp-block-code"><code>gh-ost \
  --alter="ADD INDEX idx_created_at (created_at)" \
  --host=127.0.0.1 \
  --execute
</code></pre>



<p class="wp-block-paragraph">4.切换主库<br>在主库故障转移时，支持动态切换：</p>



<pre class="wp-block-code"><code>gh-ost \
  --assume-master-host=&lt;new_master_host:port> \
  --execute</code></pre>



<p class="wp-block-paragraph">💥注意事项<br>权限要求</p>



<p class="wp-block-paragraph">需要 SUPER、REPLICATION SLAVE、REPLICATION CLIENT 权限。<br>对原表和临时表有 CREATE、DELETE、ALTER 权限。<br>主键必须存在<br>目标表必须包含主键或唯一索引。</p>



<p class="wp-block-paragraph">外键和触发器<br>gh-ost 不支持有外键约束或触发器的表。</p>



<p class="wp-block-paragraph">大表操作<br>超大表迁移时需关注磁盘空间（临时表会占用额外空间）和网络负载。</p>
<p>The post <a href="https://www.atomic-cube.cn/mysql%e7%ba%bf%e4%b8%8a%e6%95%b0%e6%8d%ae%e5%ba%93%e8%a1%a8%e5%bd%92%e6%a1%a3%e5%b7%a5%e5%85%b7%e6%8e%a8%e8%8d%90%e4%b9%8bgh-ost/">MYSQL线上数据库表归档工具推荐之gh-ost</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.atomic-cube.cn/mysql%e7%ba%bf%e4%b8%8a%e6%95%b0%e6%8d%ae%e5%ba%93%e8%a1%a8%e5%bd%92%e6%a1%a3%e5%b7%a5%e5%85%b7%e6%8e%a8%e8%8d%90%e4%b9%8bgh-ost/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
