<?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>DDL Archives - 原立方</title>
	<atom:link href="https://www.atomic-cube.cn/tag/ddl/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.atomic-cube.cn/tag/ddl/</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线上数据库表归档工具推荐Percona-Toolkit 之 pt-archiver</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%90percona-toolkit-%e4%b9%8b-pt-archiver/</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%90percona-toolkit-%e4%b9%8b-pt-archiver/#respond</comments>
		
		<dc:creator><![CDATA[evans]]></dc:creator>
		<pubDate>Sun, 21 Jun 2026 23:00:57 +0000</pubDate>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[技术文章]]></category>
		<category><![CDATA[DDL]]></category>
		<guid isPermaLink="false">https://www.atomic-cube.cn/?p=1645</guid>

					<description><![CDATA[<p>Percona Toolkit中的pt-archiver是一个用于归档数据的工具，它可以有效地将旧数据移动到另一个表中，而不会对生产数据库性能产生太大影响。 https://github.com/percona/percona-toolkit &#160;pt-archiver的核心思路是以空间换时间，它通过创建一个临时表来存放需要保留的“热”数据，并使用触发器（Triggers）&#160;来保证数据一致性，最后通过一次快速的表名交换来完成归档。 ⚙️ 第一步：前置检查 在开始操作前，工具会先进行一轮严格的环境检查，如不满足以下任一条件将直接退出，不予执行。 🛠️ 第二步：创建临时表 通过环境检查后，工具会创建一个与原始表结构完全相同的空临时表（默认命名为&#160;原表名_tmp），作为新数据的“容器”。 🔗 第三步：创建触发器（核心机制） 这是重构版保证数据一致性的关键。在向临时表复制数据的过程中，原表可能会继续接收业务的读写请求。为了保证这部分增量数据不丢失，工具会在原表上创建三个&#160;AFTER&#160;类型的触发器，将期间所有的数据变更实时同步到临时表。 这三种触发器协同工作的逻辑如下： 通过这套触发器机制，临时表的数据始终与原表保持同步，无论复制过程耗时多久，都不会丢失增量数据。 📦 第四步：复制数据 部署好触发器后，工具开始分批将原表中的数据复制到临时表。工具会使用&#160;WHERE&#160;条件来筛选出需要保留的数据（例如近7天的记录）。 注意：为了将对线上数据库的影响降到最低，工具在复制时会采取低优先级策略（INSERT LOW_PRIORITY IGNORE），并默认在每复制完一批数据（如1000行）后主动休眠1秒。 🔄 第五步：原子切换 当所有符合条件的“热数据”都复制完成后，归档工作进入最后一步。工具会执行一个原子的&#160;RENAME TABLE&#160;操作，将原始表与临时表的名字互换。对于上层应用而言，这个切换是瞬间完成的，几乎是无感知的。 pt-archiver核心用法实践 pt-archiver的命令格式可概括为：pt-archiver --source [源库参数] --dest [目标库参数] [可选参数]，以下针对不同业务场景给出具体示例，并解释关键参数含义。 场景1：全表归档（不删除原表数据） 适用于“需保留主库数据副本，同时归档备份”的场景（如历史订单归档但主库需临时查询）： 场景2：全表归档（删除原表数据） 适用于“主库无需保留历史数据，仅需归档”的场景（如超过1年的日志数据）： 场景3：直接删除原表数据（不归档） 适用于“历史数据无保留价值，仅需清理”的场景（如测试数据、临时日志）： 场景4：按条件归档部分数据实际业务中最常用的场景（如归档年龄小于30的用户数据、超过30天的日志）： 场景5：归档数据到文件（而非数据库） 注意事项与最佳实践</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%90percona-toolkit-%e4%b9%8b-pt-archiver/">MYSQL线上数据库表归档工具推荐Percona-Toolkit 之 pt-archiver</a> appeared first on <a href="https://www.atomic-cube.cn">原立方</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Percona Toolkit中的pt-archiver是一个用于归档数据的工具，它可以有效地将旧数据移动到另一个表中，而不会对生产数据库性能产生太大影响。</p>



<p class="wp-block-paragraph"><a href="https://github.com/percona/percona-toolkit">https://github.com/percona/percona-toolkit</a></p>



<p class="wp-block-paragraph">&nbsp;pt-archiver的核心思路是<strong>以空间换时间</strong>，它通过创建一个临时表来存放需要保留的“热”数据，并使用<strong>触发器（Triggers）</strong>&nbsp;来保证数据一致性，最后通过一次快速的表名交换来完成归档。</p>



<h3 class="wp-block-heading">⚙️ 第一步：前置检查</h3>



<p class="wp-block-paragraph">在开始操作前，工具会先进行一轮严格的环境检查，如不满足以下任一条件将直接退出，不予执行<a href="https://cloud.tencent.cn/developer/article/2332792?from=15425" target="_blank" rel="noreferrer noopener"></a>。</p>



<ul class="wp-block-list">
<li><strong>无触发器</strong>：确保原表上当前没有定义任何触发器，以防冲突。</li>



<li><strong>无外键</strong>：检查是否存在外键约束，避免因外键关联导致操作失败。</li>



<li><strong>有主键</strong>：强制要求原表必须有主键，这是保证数据唯一性的前提。</li>



<li><strong>Binlog格式为ROW</strong>：要求MySQL的&nbsp;<code>binlog_format</code>&nbsp;参数必须设置为&nbsp;<code>ROW</code>，以确保在主从复制环境下，基于触发器的数据变更能被正确同步<a href="https://dbaplus.cn/news-73-2165-1.html" target="_blank" rel="noreferrer noopener"></a><a href="https://blog.csdn.net/qq_34777982/article/details/138350500" target="_blank" rel="noreferrer noopener"></a>。</li>
</ul>



<h3 class="wp-block-heading">🛠️ 第二步：创建临时表</h3>



<p class="wp-block-paragraph">通过环境检查后，工具会创建一个与原始表结构完全相同的空临时表（默认命名为&nbsp;<code>原表名_tmp</code>），作为新数据的“容器”<a href="https://cloud.tencent.cn/developer/article/2332792?from=15425" target="_blank" rel="noreferrer noopener"></a><a href="https://dbaplus.cn/news-73-2165-1.html" target="_blank" rel="noreferrer noopener"></a>。</p>



<h3 class="wp-block-heading">🔗 第三步：创建触发器（核心机制）</h3>



<p class="wp-block-paragraph">这是重构版保证数据一致性的关键。在向临时表复制数据的过程中，原表可能会继续接收业务的读写请求。为了保证这部分<strong>增量数据</strong>不丢失，工具会在原表上创建三个&nbsp;<code>AFTER</code>&nbsp;类型的触发器，将期间所有的数据变更实时同步到临时表<a href="https://cloud.tencent.cn/developer/article/2332792?from=15425" target="_blank" rel="noreferrer noopener"></a>。</p>



<p class="wp-block-paragraph">这三种触发器协同工作的逻辑如下：</p>



<ul class="wp-block-list">
<li><strong>AFTER INSERT触发器</strong>：使用&nbsp;<code>REPLACE INTO</code>&nbsp;语句。当原表插入新数据时，该数据会被同步插入或覆盖到临时表。即使该数据尚未被复制，也能确保临时表包含所有新增记录<a href="https://cloud.tencent.cn/developer/article/2332792?from=15425" target="_blank" rel="noreferrer noopener"></a>。</li>



<li><strong>AFTER UPDATE触发器</strong>：同样使用&nbsp;<code>REPLACE INTO</code>&nbsp;语句。原表的数据更新会被转换为对临时表的插入或覆盖操作，从而保证数据一致<a href="https://dbaplus.cn/news-73-2165-1.html" target="_blank" rel="noreferrer noopener"></a>。</li>



<li><strong>AFTER DELETE触发器</strong>：执行&nbsp;<code>DELETE IGNORE</code>&nbsp;操作。当原表删除数据时，如果该数据尚未被复制到临时表，则忽略删除；如果已复制，则同步删除。这确保了数据的一致性<a href="https://dbaplus.cn/news-73-2165-1.html" target="_blank" rel="noreferrer noopener"></a>。</li>
</ul>



<p class="wp-block-paragraph">通过这套触发器机制，临时表的数据始终与原表保持同步，无论复制过程耗时多久，都不会丢失增量数据。</p>



<h3 class="wp-block-heading">📦 第四步：复制数据</h3>



<p class="wp-block-paragraph">部署好触发器后，工具开始分批将原表中的数据复制到临时表。工具会使用&nbsp;<code>WHERE</code>&nbsp;条件来筛选出需要保留的数据（例如近7天的记录）。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>注意</strong>：为了将对线上数据库的影响降到最低，工具在复制时会采取低优先级策略（<code>INSERT LOW_PRIORITY IGNORE</code>）<a href="https://blog.csdn.net/qq_34777982/article/details/138350500" target="_blank" rel="noreferrer noopener"></a><a href="https://www.tdyun.com/study/mysql/1561" target="_blank" rel="noreferrer noopener"></a>，并默认在每复制完一批数据（如1000行）后主动休眠1秒<a href="https://blog.csdn.net/qq_34777982/article/details/138350500" target="_blank" rel="noreferrer noopener"></a>。</p>
</blockquote>



<h3 class="wp-block-heading">🔄 第五步：原子切换</h3>



<p class="wp-block-paragraph">当所有符合条件的“热数据”都复制完成后，归档工作进入最后一步。工具会执行一个原子的&nbsp;<code>RENAME TABLE</code>&nbsp;操作<a href="https://cloud.tencent.cn/developer/article/2332792?from=15425" target="_blank" rel="noreferrer noopener"></a>，将原始表与临时表的名字互换。对于上层应用而言，这个切换是瞬间完成的，几乎是无感知的。</p>



<h2 class="wp-block-heading">pt-archiver核心用法实践</h2>



<p class="wp-block-paragraph">pt-archiver的命令格式可概括为：<code>pt-archiver --source [源库参数] --dest [目标库参数] [可选参数]</code>，以下针对不同业务场景给出具体示例，并解释关键参数含义。</p>



<p class="wp-block-paragraph">场景1：全表归档（不删除原表数据）</p>



<p class="wp-block-paragraph">适用于“需保留主库数据副本，同时归档备份”的场景（如历史订单归档但主库需临时查询）：</p>



<pre class="wp-block-code"><code>pt-archiver \
--source h=192.168.12.161,u=dba,p='Id81Gdac_a',D=martin,t=archiver_test \  # 源库信息（h=IP,u=用户,p=密码,D=库,t=表）
--dest h=192.168.12.163,u=dba,p='Id81Gdac_a',D=archiver_db,t=archiver_test \  # 归档库信息
--where '1=1' \  # 条件：全表（1=1表示所有数据）
--progress 10000 \  # 每处理10000行输出进度
--limit=10000 \  # 每次批量处理10000行（避免单次查询压力过大）
--txn-size=10000 \  # 每10000行提交一次事务（减少事务日志占用）
--no-safe-auto-increment \  # 禁用自增主键安全检查（避免归档表自增冲突）
--statistics \  # 输出操作统计信息（如处理行数、耗时）
--no-delete  # 核心参数：不删除源表数据</code></pre>



<p class="wp-block-paragraph">场景2：全表归档（删除原表数据）</p>



<p class="wp-block-paragraph">适用于“主库无需保留历史数据，仅需归档”的场景（如超过1年的日志数据）：</p>



<pre class="wp-block-code"><code>pt-archiver \
--source h=192.168.12.161,u=dba,p='Id81Gdac_a',D=martin,t=archiver_test \
--dest h=192.168.12.163,u=dba,p='Id81Gdac_a',D=archiver_db,t=archiver_test \
--where '1=1' \
--progress 10000 \
--limit=10000 \
--txn-size=10000 \
--no-safe-auto-increment \
--statistics \
--purge  # 核心参数：归档后删除源表数据（替代--no-delete）</code></pre>



<p class="wp-block-paragraph">场景3：直接删除原表数据（不归档）</p>



<p class="wp-block-paragraph">适用于“历史数据无保留价值，仅需清理”的场景（如测试数据、临时日志）：</p>



<pre class="wp-block-code"><code>pt-archiver \
--source h=192.168.12.161,u=dba,p='Id81Gdac_a',D=martin,t=archiver_test \
--where '1=1' \  # 可修改条件（如age&gt;50）筛选特定数据删除
--progress 10000 \
--limit=10000 \
--txn-size=10000 \
--no-safe-auto-increment \
--statistics \
--purge  # 仅删除源表数据，无需--dest参数</code></pre>



<p class="wp-block-paragraph">场景4：按条件归档部分数据<br>实际业务中最常用的场景（如归档年龄小于30的用户数据、超过30天的日志）：</p>



<pre class="wp-block-code"><code># 1. 先清空归档表（避免重复数据，可选）
mysql -h192.168.12.163 -udba -p'Id81Gdac_a' -e "TRUNCATE TABLE archiver_db.archiver_test;"
# 2. 按条件归档（仅归档age&lt;30的数据，并删除源表对应数据）
pt-archiver \
--source h=192.168.12.161,u=dba,p='Id81Gdac_a',D=martin,t=archiver_test \
--dest h=192.168.12.163,u=dba,p='Id81Gdac_a',D=archiver_db,t=archiver_test \
--where 'age&lt;30' \  # 核心条件：筛选需归档的数据
--progress 10000 \
--limit=10000 \
--txn-size=10000 \
--no-safe-auto-increment \
--statistics \
--purge</code></pre>



<p class="wp-block-paragraph">场景5：归档数据到文件（而非数据库）</p>



<pre class="wp-block-code"><code># 1. 归档为SQL文件（默认格式）
pt-archiver \
--source h=192.168.152.70,u=dba,p='Id81Gdac_a',D=martin,t=archiver_test \
--where 'age&lt;35' \
--progress 10000 \
--limit=10000 \
--txn-size=10000 \
--no-safe-auto-increment \
--statistics \
--purge \
--file=./archiver.sql  # 输出文件路径（当前目录）
# 2. 归档为CSV格式（便于Excel分析或导入其他系统）
pt-archiver \
--source h=192.168.152.70,u=dba,p='Id81Gdac_a',D=martin,t=archiver_test \
--where '1=1' \
--progress 10000 \
--limit=10000 \
--txn-size=10000 \
--no-safe-auto-increment \
--statistics \
--purge \
--file=./archiver.csv \
--output-format=csv  # 指定输出格式为CSV</code></pre>



<h3 class="wp-block-heading">注意事项与最佳实践</h3>



<ol class="wp-block-list">
<li><strong>操作前备份</strong>：归档/删除前务必备份关键数据，避免条件错误导致数据丢失；</li>



<li><strong>测试环境验证</strong>：新脚本或命令需先在测试环境验证，确认参数正确后再推广到生产；</li>



<li><strong>避免锁表</strong>：批量处理时<code>--limit</code>和<code>--txn-size</code>不宜过大（建议1000-10000行），防止长事务阻塞业务；</li>



<li><strong>权限最小化</strong>：生产环境中，dba用户权限可缩小至“仅操作源库和归档库”，避免全库权限泄露；</li>



<li><strong>监控与告警</strong>：结合crontab告警（如执行失败发送邮件），定期检查归档日志，确保脚本正常运行。</li>
</ol>
<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%90percona-toolkit-%e4%b9%8b-pt-archiver/">MYSQL线上数据库表归档工具推荐Percona-Toolkit 之 pt-archiver</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%90percona-toolkit-%e4%b9%8b-pt-archiver/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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>
