Files
2026-05-14 16:56:48 +08:00

786 lines
40 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MySQL 转 PostgreSQL 迁移工具对比</title>
<style>
:root {
--color-primary: #1677FF;
--color-primary-hover: #4096FF;
--color-primary-active: #0958D9;
--color-primary-bg: #E6F4FF;
--color-success: #52C41A;
--color-success-bg: #F6FFED;
--color-success-border: #B7EB8F;
--color-warning: #FAAD14;
--color-warning-bg: #FFFBE6;
--color-warning-border: #FFE58F;
--color-error: #FF4D4F;
--color-error-bg: #FFF2F0;
--color-error-border: #FFCCC7;
--bg: #F5F5F5;
--bg-secondary: #FFFFFF;
--bg-tertiary: #FAFAFA;
--border: #D9D9D9;
--border-light: #F0F0F0;
--text-primary: #141414;
--text-secondary: #595959;
--text-tertiary: #8C8C8C;
--radius-sm: 6px;
--radius-md: 8px;
--shadow-sm: 0 1px 2px rgba(0,0,0,0.03), 0 1px 6px -1px rgba(0,0,0,0.02);
--shadow-md: 0 2px 4px rgba(0,0,0,0.04), 0 4px 12px -2px rgba(0,0,0,0.04);
--sidebar-w: 260px;
--header-h: 64px;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Segoe UI', Roboto, Oxygen, sans-serif;
background: var(--bg);
color: var(--text-primary);
font-size: 14px;
line-height: 1.57;
}
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: #D9D9D9; border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: #8C8C8C; }
.header {
position: fixed;
top: 0; left: 0; right: 0;
height: var(--header-h);
background: rgba(255,255,255,0.85);
backdrop-filter: blur(12px);
border-bottom: 1px solid var(--border-light);
display: flex;
align-items: center;
padding: 0 1.5rem;
z-index: 100;
}
.header h1 {
font-size: 1.05rem;
font-weight: 700;
background: linear-gradient(135deg, var(--color-primary), #722ED1);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.sidebar {
position: fixed;
top: var(--header-h); left: 0; bottom: 0;
width: var(--sidebar-w);
background: var(--bg-secondary);
border-right: 1px solid var(--border);
overflow-y: auto;
padding: 1.25rem 0;
z-index: 90;
}
.sidebar .toc-label {
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--text-secondary);
padding: 0 1.25rem;
margin-bottom: 0.75rem;
}
.sidebar nav ol { list-style: none; padding: 0; counter-reset: toc; }
.sidebar nav li { counter-increment: toc; padding: 0; }
.sidebar nav a {
display: block;
padding: 0.45rem 1.25rem;
color: var(--text-secondary);
text-decoration: none;
font-size: 0.85rem;
line-height: 1.4;
border-left: 2px solid transparent;
transition: all 0.15s;
}
.sidebar nav a::before {
content: counter(toc) ". ";
color: var(--color-primary);
font-weight: 600;
font-size: 0.75rem;
margin-right: 0.4rem;
}
.sidebar nav a:hover {
color: var(--color-primary);
background: var(--color-primary-bg);
}
.sidebar nav a.active {
color: var(--color-primary);
border-left-color: var(--color-primary);
background: var(--color-primary-bg);
font-weight: 600;
}
.main {
margin-left: var(--sidebar-w);
margin-top: var(--header-h);
padding: 2rem 2.5rem 4rem;
min-height: calc(100vh - var(--header-h));
}
section {
margin: 40px 0;
scroll-margin-top: calc(var(--header-h) + 1rem);
}
section h2 {
font-size: 1.5rem;
padding-bottom: 8px;
border-bottom: 1px solid var(--border);
margin-bottom: 20px;
color: var(--color-primary);
}
section h3 {
font-size: 1.15rem;
margin: 24px 0 12px;
color: #722ED1;
}
section h4 {
font-size: 1rem;
margin: 16px 0 8px;
color: var(--color-success);
}
section p { color: var(--text-secondary); margin: 8px 0; font-size: 0.92rem; }
section ul { margin-left: 20px; color: var(--text-secondary); font-size: 0.92rem; }
section ul li { margin: 4px 0; }
.table-wrap { overflow-x: auto; margin: 20px 0; }
table {
width: 100%;
border-collapse: collapse;
font-size: 0.92rem;
}
th, td {
padding: 10px 14px;
border: 1px solid var(--border);
text-align: left;
vertical-align: top;
}
th {
background: var(--bg-tertiary);
font-weight: 600;
position: sticky;
top: 0;
}
td { background: var(--bg-secondary); }
tbody tr:hover td { background: var(--color-primary-bg); }
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
gap: 20px;
margin: 20px 0;
}
.card {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 24px;
transition: all 0.2s ease;
}
.card:hover {
box-shadow: var(--shadow-md);
}
.card h3 { margin: 0 0 4px; font-size: 1.15rem; color: var(--text-primary); }
.card .vendor {
color: var(--color-success);
font-size: 0.85rem;
font-weight: 500;
}
.card .badge-row { margin: 8px 0; }
.card p { color: var(--text-secondary); font-size: 0.92rem; margin: 8px 0 0; }
.badge {
display: inline-block;
padding: 2px 10px;
border-radius: 12px;
font-size: 0.78rem;
font-weight: 600;
margin-right: 6px;
}
.badge-cloud { background: var(--color-warning-bg); color: var(--color-warning); border: 1px solid var(--color-warning-border); }
.badge-open { background: var(--color-success-bg); color: var(--color-success); border: 1px solid var(--color-success-border); }
.badge-free { background: var(--color-primary-bg); color: var(--color-primary); border: 1px solid rgba(22,119,255,0.25); }
.badge-paid { background: var(--color-error-bg); color: var(--color-error); border: 1px solid var(--color-error-border); }
.badge-cli { background: rgba(114,46,209,0.08); color: #722ED1; border: 1px solid rgba(114,46,209,0.20); }
.badge-gui { background: var(--color-success-bg); color: var(--color-success); border: 1px solid var(--color-success-border); }
.verdict {
background: var(--bg-secondary);
border: 1px solid var(--border-light);
border-radius: var(--radius-md);
padding: 24px 32px;
margin: 20px 0;
}
.verdict h4 {
background: linear-gradient(135deg, var(--color-primary), #722ED1);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 12px;
font-size: 1.05rem;
}
.verdict p { color: var(--text-secondary); margin: 6px 0; font-size: 0.92rem; }
.verdict strong { color: var(--text-primary); }
.rec-box {
background: var(--bg-secondary);
border: 1px solid var(--border-light);
border-radius: var(--radius-md);
padding: 24px 28px;
margin: 24px 0;
}
.rec-box h4 {
background: linear-gradient(135deg, var(--color-primary), #722ED1);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 12px;
font-size: 1rem;
}
.rec-box p { color: var(--text-secondary); margin: 6px 0; font-size: 0.92rem; }
.rec-box .reason {
padding-left: 16px;
border-left: 2px solid #722ED1;
margin: 8px 0 12px 0;
font-size: 0.88rem;
color: #722ED1;
font-style: italic;
}
.rec-box code {
background: var(--bg-tertiary);
padding: 2px 8px;
border-radius: var(--radius-sm);
font-family: 'SF Mono', Monaco, monospace;
font-size: 0.85rem;
color: var(--color-primary);
}
.pros-cons {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
margin: 16px 0;
}
.pros, .cons {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 20px;
}
.pros { border-left: 3px solid var(--color-success); }
.cons { border-left: 3px solid var(--color-error); border-right: none; }
.pros h4 { color: var(--color-success); margin-bottom: 8px; }
.cons h4 { color: var(--color-error); margin-bottom: 8px; }
.pros ul, .cons ul { margin-left: 18px; color: var(--text-secondary); font-size: 0.88rem; }
.pros ul li, .cons ul li { margin: 4px 0; }
.arch-pipeline {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
margin: 16px 0;
}
.arch-step {
background: var(--bg-tertiary);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
padding: 8px 16px;
font-size: 0.85rem;
font-family: 'SF Mono', Monaco, monospace;
color: var(--color-primary);
}
.arch-arrow { color: var(--text-secondary); font-size: 1.1rem; }
.check { color: var(--color-success); font-weight: 700; }
.cross { color: var(--color-error); opacity: 0.4; }
.partial { color: var(--color-warning); font-weight: 600; }
.highlight { color: var(--color-warning); font-weight: 700; }
.sources {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 24px 32px;
margin: 40px 0 20px;
}
.sources h2 { color: var(--text-secondary); font-size: 1rem; margin-bottom: 12px; }
.sources ul { margin-left: 20px; }
.sources li { margin: 6px 0; font-size: 0.88rem; }
.sources a { color: var(--color-primary); text-decoration: none; }
.sources a:hover { text-decoration: underline; }
a { color: var(--color-primary); }
.footer {
color: var(--text-tertiary);
}
@media (max-width: 992px) {
:root { --sidebar-w: 220px; }
.main { padding: 1.5rem 1.25rem 3rem; }
}
@media (max-width: 768px) {
.sidebar { display: none; }
.main { margin-left: 0; }
.card-grid { grid-template-columns: 1fr; }
.pros-cons { grid-template-columns: 1fr; }
.arch-pipeline { flex-direction: column; }
.arch-arrow { transform: rotate(90deg); }
table { font-size: 0.8rem; }
th, td { padding: 6px 8px; }
}
</style>
</head>
<body>
<header class="header">
<h1>MySQL 转 PostgreSQL 迁移工具对比</h1>
</header>
<aside class="sidebar">
<div class="toc-label">目录</div>
<nav>
<ol>
<li><a href="#overview">工具总览</a></li>
<li><a href="#cloud">云厂商商业工具</a></li>
<li><a href="#aliyun">阿里云 DTS 详解</a></li>
<li><a href="#tencent">腾讯云 DTS 详解</a></li>
<li><a href="#huawei">华为云 DRS 详解</a></li>
<li><a href="#opensource">开源工具对比</a></li>
<li><a href="#pgloader">pgloader 详解</a></li>
<li><a href="#mysql2pg">MySQL2PG 详解</a></li>
<li><a href="#compat">类型映射与兼容性</a></li>
<li><a href="#selection">选型建议</a></li>
<li><a href="#steps">迁移步骤参考</a></li>
</ol>
</nav>
</aside>
<main class="main">
<!-- 1. Overview -->
<section id="overview">
<h2>1. 工具总览</h2>
<p>本文汇总了 2025-2026 年主流的 MySQL 到 PostgreSQL 迁移工具,分为两大阵营:<strong>云厂商商业工具</strong>(阿里云/腾讯云/华为云)和<strong>开源工具</strong>pgloader / MySQL2PG 等)。</p>
<div class="card-grid">
<div class="card">
<h3>阿里云 DTS</h3>
<div class="vendor">阿里巴巴</div>
<div class="badge-row"><span class="badge badge-cloud">云服务</span><span class="badge badge-gui">可视化</span><span class="badge badge-paid">付费</span></div>
<p>企业级数据传输服务,支持结构迁移 + 全量 + 增量三阶段不停机迁移。</p>
</div>
<div class="card">
<h3>腾讯云 DTS</h3>
<div class="vendor">腾讯</div>
<div class="badge-row"><span class="badge badge-cloud">云服务</span><span class="badge badge-gui">可视化</span><span class="badge badge-paid">付费</span></div>
<p>支持无锁迁移、跨账号跨云迁移,对标 TDSQL PostgreSQL 版深度优化。</p>
</div>
<div class="card">
<h3>华为云 DRS</h3>
<div class="vendor">华为</div>
<div class="badge-row"><span class="badge badge-cloud">云服务</span><span class="badge badge-gui">可视化</span><span class="badge badge-paid">付费</span></div>
<p>分钟级搭建迁移任务,预检查机制降低风险,政企客户首选。</p>
</div>
<div class="card">
<h3>pgloader</h3>
<div class="vendor">开源社区 · dimitri</div>
<div class="badge-row"><span class="badge badge-open">开源</span><span class="badge badge-cli">CLI</span><span class="badge badge-free">免费</span></div>
<p>最流行的开源迁移工具,COPY 协议高效传输,自动类型映射,⭐ 4.3k+。</p>
</div>
<div class="card">
<h3>MySQL2PG</h3>
<div class="vendor">开源社区 · xfg0218</div>
<div class="badge-row"><span class="badge badge-open">开源</span><span class="badge badge-cli">CLI</span><span class="badge badge-free">免费</span></div>
<p>专业级 MySQL→PG 工具,v3.4.0 支持完整评估报告、兼容性校验、并发同步。</p>
</div>
<div class="card">
<h3>rds_dbsync</h3>
<div class="vendor">阿里巴巴 · 阿里云开源</div>
<div class="badge-row"><span class="badge badge-open">开源</span><span class="badge badge-cli">CLI</span><span class="badge badge-free">免费</span></div>
<p>阿里内部使用的 MySQL→Greenplum/PostgreSQL 同步工具,不落地的实时迁移。</p>
</div>
</div>
</section>
<!-- 2. Cloud tools comparison -->
<section id="cloud">
<h2>2. 云厂商商业工具对比</h2>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>维度</th>
<th>阿里云 DTS</th>
<th>腾讯云 DTS</th>
<th>华为云 DRS</th>
</tr>
</thead>
<tbody>
<tr><td><strong>迁移模式</strong></td><td>结构+全量+增量</td><td>全量+增量</td><td>结构+全量+增量</td></tr>
<tr><td><strong>不停机迁移</strong></td><td class="check">✅ 支持</td><td class="check">✅ 无锁迁移</td><td class="check">✅ 零停机</td></tr>
<tr><td><strong>源库影响</strong></td><td>低影响</td><td class="highlight">无锁,最低影响</td><td>低影响</td></tr>
<tr><td><strong>预检查</strong></td><td class="check"></td><td class="check"></td><td class="check">✅ 详细预检查表</td></tr>
<tr><td><strong>数据校验</strong></td><td class="check">✅ 一致性校验</td><td class="check"></td><td class="check"></td></tr>
<tr><td><strong>跨云迁移</strong></td><td class="check">✅ 支持</td><td class="check">✅ 支持</td><td class="partial">有限支持</td></tr>
<tr><td><strong>可视化控制台</strong></td><td class="check"></td><td class="check"></td><td class="check"></td></tr>
<tr><td><strong>异构数据库</strong></td><td class="check">✅ 20+ 种</td><td class="check">✅ 多种</td><td class="check">✅ 多种</td></tr>
<tr><td><strong>计费模式</strong></td><td>按量付费 / 包年包月</td><td>按量付费</td><td>按量付费</td></tr>
<tr><td><strong>文档地址</strong></td><td><a href="https://help.aliyun.com/zh/dts/" target="_blank">help.aliyun.com/zh/dts</a></td><td><a href="https://cloud.tencent.com/document/product/571" target="_blank">cloud.tencent.com/dts</a></td><td><a href="https://support.huaweicloud.com/product/drs.html" target="_blank">huaweicloud.com/drs</a></td></tr>
</tbody>
</table>
</div>
</section>
<!-- 3. Aliyun DTS -->
<section id="aliyun">
<h2>3. 阿里云 DTS 详解</h2>
<p>阿里云 DTSData Transmission Service)是最成熟的企业级迁移方案之一,支持 RDS MySQL → RDS PostgreSQL 一键迁移,也支持自建库之间的迁移。</p>
<h3>迁移管线</h3>
<div class="arch-pipeline">
<span class="arch-step">预检查</span><span class="arch-arrow"></span>
<span class="arch-step">结构迁移</span><span class="arch-arrow"></span>
<span class="arch-step">全量数据迁移</span><span class="arch-arrow"></span>
<span class="arch-step">增量数据迁移</span><span class="arch-arrow"></span>
<span class="arch-step">数据校验</span><span class="arch-arrow"></span>
<span class="arch-step">割接切换</span>
</div>
<h3>快速开始</h3>
<ul>
<li>登录阿里云控制台 → DTS → 创建迁移任务</li>
<li>填写源库(MySQL)和目标库(PostgreSQL)连接信息</li>
<li>选择迁移类型:结构迁移 + 全量 + 增量(推荐三者全选实现不停机)</li>
<li>通过预检查后启动任务,观察同步延迟归零后割接</li>
</ul>
<div class="pros-cons">
<div class="pros"><h4>优势</h4><ul><li>全托管服务,零运维成本</li><li>不停机迁移,业务无感知</li><li>自动处理类型映射和约束转换</li><li>支持跨云/混合云场景</li><li>可视化控制台 + 告警监控</li></ul></div>
<div class="cons"><h4>局限性</h4><ul><li>需要阿里云账号,按量付费有成本</li><li>源库/目标库需对 DTS 服务器开放网络</li><li>部分 MySQL 特性(如存储过程)可能需手动调整</li></ul></div>
</div>
</section>
<!-- 4. Tencent DTS -->
<section id="tencent">
<h2>4. 腾讯云 DTS 详解</h2>
<p>腾讯云 DTS 的核心特色是<strong>无锁迁移</strong>——不需要在源 MySQL 上获取全局锁,最大程度降低对业务的影响。</p>
<h3>核心特色</h3>
<ul>
<li><strong>无锁迁移</strong>:基于 binlog 位置点的增量同步,无需 LOCK TABLES</li>
<li><strong>跨账号迁移</strong>:支持不同腾讯云账号之间的数据库迁移</li>
<li><strong>跨云迁移</strong>:支持从其他云厂商或自建库迁移到腾讯 PostgreSQL</li>
<li><strong>数据一致性校验</strong>:迁移完成后自动比对源库和目标库的数据一致性</li>
</ul>
<div class="pros-cons">
<div class="pros"><h4>优势</h4><ul><li>无锁迁移,对源库影响最小</li><li>跨账号/跨云能力强</li><li>对标 TDSQL PG 版深度优化</li><li>全托管,可视化操作</li></ul></div>
<div class="cons"><h4>局限性</h4><ul><li>付费服务,按量计费</li><li>深度绑定腾讯云生态</li><li>自建 PostgreSQL 场景支持有限</li></ul></div>
</div>
</section>
<!-- 5. Huawei DRS -->
<section id="huawei">
<h2>5. 华为云 DRS 详解</h2>
<p>华为云 DRSData Replication Service)主打<strong>分钟级搭建</strong><strong>预检查</strong>,适合政企客户和对合规性要求较高的场景。</p>
<h3>核心特色</h3>
<ul>
<li><strong>分钟级搭建</strong>:迁移任务配置和启动只需数分钟</li>
<li><strong>详细预检查</strong>:提供预检查项一览表,逐项检查兼容性风险</li>
<li><strong>在线迁移</strong>:零停机窗口,业务持续运行</li>
<li><strong>支持 FlexusRDS for PostgreSQL</strong>:华为新一代云原生数据库</li>
</ul>
<div class="pros-cons">
<div class="pros"><h4>优势</h4><ul><li>预检查机制完善,降低迁移风险</li><li>搭建速度快,操作简单</li><li>政企客户适配,合规性强</li></ul></div>
<div class="cons"><h4>局限性</h4><ul><li>跨云支持不如阿里云/腾讯云灵活</li><li>生态相对较小</li><li>付费服务</li></ul></div>
</div>
</section>
<!-- 6. Open source comparison -->
<section id="opensource">
<h2>6. 开源工具对比</h2>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>维度</th>
<th>pgloader</th>
<th>MySQL2PG</th>
<th>rds_dbsync</th>
<th>gomysql2pg</th>
</tr>
</thead>
<tbody>
<tr><td><strong>GitHub ⭐</strong></td><td class="highlight">4.3k+</td><td class="highlight">活跃维护</td><td>阿里开源</td><td>200+</td></tr>
<tr><td><strong>语言</strong></td><td>Common Lisp</td><td>Java</td><td>Go</td><td>Go</td></tr>
<tr><td><strong>许可证</strong></td><td>PostgreSQL License</td><td>开源</td><td>Apache 2.0</td><td>MIT</td></tr>
<tr><td><strong>安装方式</strong></td><td>Docker / apt / brew / 源码</td><td>下载 JAR / 源码编译</td><td>源码编译 Go</td><td>Go 直接编译</td></tr>
<tr><td><strong>结构迁移</strong></td><td class="check">✅ 自动转换 DDL</td><td class="check">✅ 评估+转换</td><td class="partial">主要数据迁移</td><td class="partial">主要数据迁移</td></tr>
<tr><td><strong>全量迁移</strong></td><td class="check">✅ COPY 协议</td><td class="check">✅ 并发同步</td><td class="check"></td><td class="check"></td></tr>
<tr><td><strong>增量迁移</strong></td><td class="cross">❌ 仅一次性</td><td class="check">✅ 增量同步</td><td class="check">✅ 实时同步</td><td class="cross"></td></tr>
<tr><td><strong>数据校验</strong></td><td class="partial">基础</td><td class="check">✅ 双重校验</td><td class="check"></td><td class="check">✅ 对比</td></tr>
<tr><td><strong>评估报告</strong></td><td class="cross"></td><td class="check">✅ 可视化兼容性报告</td><td class="cross"></td><td class="cross"></td></tr>
<tr><td><strong>GUI / 可视化</strong></td><td class="cross">❌ CLI only</td><td class="check">✅ 自带 Web UI</td><td class="cross">❌ CLI only</td><td class="cross">❌ CLI only</td></tr>
<tr><td><strong>配置方式</strong></td><td>.load 配置文件</td><td>配置文件 + UI 引导</td><td>JSON/YAML 配置</td><td>JSON 配置</td></tr>
</tbody>
</table>
</div>
</section>
<!-- 7. pgloader -->
<section id="pgloader">
<h2>7. pgloader 详解</h2>
<p>pgloader 是最广泛推荐的开源 MySQL→PostgreSQL 迁移工具,由 Dimitri Fontaine 开发维护。核心优势是使用 PostgreSQL 的 COPY 协议高效传输数据。</p>
<h3>安装(3 种方式)</h3>
<div class="arch-pipeline">
<span class="arch-step">Docker(推荐)</span>
<span class="arch-step">apt install pgloader</span>
<span class="arch-step">brew install pgloader</span>
</div>
<h3>快速开始(Docker 方式)</h3>
<ul>
<li>创建配置文件 <code>mysql.load</code>,定义源库和目标库连接串</li>
<li>运行 <code>docker run --rm dimitri/pgloader pgloader mysql.load</code></li>
<li>pgloader 自动完成表结构转换 + 数据迁移 + 索引创建</li>
</ul>
<h3>配置文件示例</h3>
<p style="font-family:'SF Mono',Monaco,monospace; font-size:0.85rem; background:var(--bg-tertiary); padding:16px; border-radius:6px; color:var(--text-primary); white-space:pre;">
LOAD DATABASE
FROM mysql://user:pass@localhost/mydb
INTO pgsql://user:pass@localhost/mydb
WITH include drop, create tables, create indexes, reset sequences
SET PostgreSQL PARAMETERS
maintenance_work_mem to '128MB',
work_mem to '12MB'
;
</p>
<div class="rec-box">
<h4>适用场景</h4>
<div class="reason">自建数据库迁移、跨云迁移、不需要增量同步的一次性迁移场景。pgloader 是最轻量、最即开即用的开源方案,适合中小型数据库(GB 级别)。如果是 TB 级数据库或有不停机需求,建议使用云厂商 DTS/DRS 或 MySQL2PG。</div>
</div>
<div class="pros-cons">
<div class="pros"><h4>优势</h4><ul><li>安装极简,Docker 一行命令即可</li><li>COPY 协议传输效率高</li><li>自动类型映射(TINYINT→SMALLINT 等)</li><li>社区成熟,文档丰富</li><li>支持 SQLite/MSSQL/CSV → PG 等多种源</li></ul></div>
<div class="cons"><h4>局限性</h4><ul><li>仅支持一次性全量迁移,不支持增量同步</li><li>大型数据库迁移耗时较长</li><li>存储过程/触发器需手动转换</li><li>Common Lisp 编译依赖,自行编译较复杂</li></ul></div>
</div>
</section>
<!-- 8. MySQL2PG -->
<section id="mysql2pg">
<h2>8. MySQL2PG 详解</h2>
<p>MySQL2PGxfg0218/mysql2pg)是专业级的 MySQL→PostgreSQL 迁移工具,最新版本 v3.4.0 已发布,是开源方案中功能最全面的。</p>
<h3>核心能力</h3>
<ul>
<li><strong>评估模式</strong>:迁移前扫描源库,生成兼容性评估报告,标注不兼容的语法和功能</li>
<li><strong>全量 + 增量</strong>:支持一次性全量迁移和基于 binlog 的持续增量同步</li>
<li><strong>并发同步</strong>:多线程并行迁移,大幅提升迁移速度</li>
<li><strong>双重数据校验</strong>:迁移完成后自动校验源库和目标库的数据一致性</li>
<li><strong>可视化 Web UI</strong>:自带管理界面,非 DBA 也能操作</li>
<li><strong>视图/函数转换</strong>42 个视图 + 113 个函数 100% 转换(实测数据)</li>
</ul>
<h3>迁移管线</h3>
<div class="arch-pipeline">
<span class="arch-step">兼容性评估</span><span class="arch-arrow"></span>
<span class="arch-step">结构转换</span><span class="arch-arrow"></span>
<span class="arch-step">全量迁移</span><span class="arch-arrow"></span>
<span class="arch-step">增量同步</span><span class="arch-arrow"></span>
<span class="arch-step">数据校验</span><span class="arch-arrow"></span>
<span class="arch-step">生成报告</span>
</div>
<div class="rec-box">
<h4>适用场景</h4>
<div class="reason">如果你需要<strong>开源 + 增量同步 + 评估报告</strong>三合一,MySQL2PG 是最佳选择。它适合自建数据库的不停机迁移场景,自带 Web UI 降低了操作门槛。特别是生成兼容性评估报告这一功能,能帮助你在迁移前识别风险点。</div>
</div>
<div class="pros-cons">
<div class="pros"><h4>优势</h4><ul><li>唯一自带兼容性评估报告的开源工具</li><li>支持增量同步,可不停机迁移</li><li>自带 Web UI,操作门槛低</li><li>双重数据校验,迁移结果可信赖</li><li>视图和函数转换率高</li></ul></div>
<div class="cons"><h4>局限性</h4><ul><li>社区规模不如 pgloader</li><li>Java 依赖,需要 JRE 运行环境</li><li>文档以中文为主,国际化程度有限</li></ul></div>
</div>
</section>
<!-- 9. Compatibility -->
<section id="compat">
<h2>9. 类型映射与兼容性注意事项</h2>
<p>MySQL 和 PostgreSQL 在数据类型和 SQL 语法上存在差异,迁移时需要重点关注以下映射关系。</p>
<h3>数据类型映射</h3>
<div class="table-wrap">
<table>
<thead><tr><th>MySQL</th><th>PostgreSQL</th><th>说明</th></tr></thead>
<tbody>
<tr><td><code>TINYINT</code></td><td><code>SMALLINT</code></td><td>PG 无 1 字节整型</td></tr>
<tr><td><code>INT UNSIGNED</code></td><td><code>BIGINT</code></td><td>无符号需升级类型</td></tr>
<tr><td><code>DATETIME</code></td><td><code>TIMESTAMP</code></td><td>注意时区处理</td></tr>
<tr><td><code>TINYTEXT</code></td><td><code>TEXT</code></td><td>PG 统一使用 TEXT</td></tr>
<tr><td><code>VARCHAR(N)</code></td><td><code>VARCHAR(N)</code></td><td>PG 中 TEXT 更常用</td></tr>
<tr><td><code>BLOB</code></td><td><code>BYTEA</code></td><td>二进制数据</td></tr>
<tr><td><code>BOOLEAN / TINYINT(1)</code></td><td><code>BOOLEAN</code></td><td>PG 原生布尔类型</td></tr>
<tr><td><code>DOUBLE</code></td><td><code>DOUBLE PRECISION</code></td><td>关键字差异</td></tr>
<tr><td><code>AUTO_INCREMENT</code></td><td><code>SERIAL / GENERATED ALWAYS AS IDENTITY</code></td><td>自增机制不同</td></tr>
<tr><td><code>ENUM</code></td><td><code>CREATE TYPE ... AS ENUM</code></td><td>PG 需显式创建枚举类型</td></tr>
</tbody>
</table>
</div>
<h3>SQL 语法差异</h3>
<div class="table-wrap">
<table>
<thead><tr><th>特性</th><th>MySQL</th><th>PostgreSQL</th></tr></thead>
<tbody>
<tr><td><strong>标识符引号</strong></td><td>反引号 <code>`table`</code></td><td>双引号 <code>"table"</code></td></tr>
<tr><td><strong>字符串引号</strong></td><td>单/双引号均可</td><td>仅单引号</td></tr>
<tr><td><strong>分页</strong></td><td><code>LIMIT offset, count</code></td><td><code>LIMIT count OFFSET offset</code></td></tr>
<tr><td><strong>GROUP BY</strong></td><td>宽松模式</td><td>严格模式(SELECT 列必须在 GROUP BY 中)</td></tr>
<tr><td><strong>连接字符串</strong></td><td><code>CONCAT()</code> 忽略 NULL</td><td><code>||</code> 操作符,NULL 传播</td></tr>
<tr><td><strong>日期函数</strong></td><td><code>NOW(), CURDATE()</code></td><td><code>NOW(), CURRENT_DATE</code></td></tr>
<tr><td><strong>存储过程</strong></td><td>语法差异大</td><td>PL/pgSQL,需重写</td></tr>
</tbody>
</table>
</div>
</section>
<!-- 10. Selection -->
<section id="selection">
<h2>10. 选型建议</h2>
<div class="verdict">
<h4>场景一:阿里云用户</h4>
<p><strong>推荐阿里云 DTS</strong> — 全托管、不停机迁移、自动类型映射。如果源库和目标库都在阿里云上,这是最省心的选择。</p>
</div>
<div class="verdict">
<h4>场景二:腾讯云用户</h4>
<p><strong>推荐腾讯云 DTS</strong> — 无锁迁移对源库影响最小,适合业务不能中断的场景。</p>
</div>
<div class="verdict">
<h4>场景三:华为云 / 政企用户</h4>
<p><strong>推荐华为云 DRS</strong> — 预检查机制完善,分钟级搭建,合规性强。</p>
</div>
<div class="verdict">
<h4>场景四:自建数据库 / 跨云 / 一次性迁移</h4>
<p><strong>推荐 pgloader</strong> — 安装极简(Docker 一行命令),COPY 协议高效传输,社区最成熟。适合中小型数据库的一次性迁移。</p>
</div>
<div class="verdict">
<h4>场景五:自建数据库 / 需要不停机 + 评估报告</h4>
<p><strong>推荐 MySQL2PG</strong> — 唯一自带兼容性评估报告的开源工具,支持增量同步和 Web UI,适合不停机迁移场景。</p>
</div>
<div class="verdict">
<h4>场景六:阿里技术栈 + 实时同步</h4>
<p><strong>推荐 rds_dbsync</strong> — 阿里内部使用的 Go 语言同步工具,Apache 2.0 许可,适合 MySQL→Greenplum/PostgreSQL 的不落地实时迁移。</p>
</div>
</section>
<!-- 11. Steps -->
<section id="steps">
<h2>11. 迁移步骤参考</h2>
<p>无论选择哪个工具,一个完整的 MySQL→PostgreSQL 迁移流程通常包含以下步骤:</p>
<div class="arch-pipeline">
<span class="arch-step">1. 评估兼容</span><span class="arch-arrow"></span>
<span class="arch-step">2. 备份源库</span><span class="arch-arrow"></span>
<span class="arch-step">3. 结构迁移</span><span class="arch-arrow"></span>
<span class="arch-step">4. 全量数据</span><span class="arch-arrow"></span>
<span class="arch-step">5. 增量追平</span><span class="arch-arrow"></span>
<span class="arch-step">6. 数据校验</span><span class="arch-arrow"></span>
<span class="arch-step">7. 应用适配</span><span class="arch-arrow"></span>
<span class="arch-step">8. 割接上线</span>
</div>
<h3>各步骤要点</h3>
<ul>
<li><strong>评估兼容</strong>:使用 MySQL2PG 评估模式或手动检查存储过程、触发器、特殊函数</li>
<li><strong>备份源库</strong>:迁移前完整备份 MySQL,确保可回滚</li>
<li><strong>结构迁移</strong>:转换 DDL,注意类型映射、索引、约束、自增序列</li>
<li><strong>全量数据</strong>:使用工具的批量迁移能力,建议关闭 PG 的 autovacuum 提升速度</li>
<li><strong>增量追平</strong>:基于 binlog 持续同步,观察延迟归零</li>
<li><strong>数据校验</strong>:比对记录数、关键字段聚合值,确保数据一致性</li>
<li><strong>应用适配</strong>:修改 ORM 配置、SQL 语法(反引号→双引号、LIMIT 语法等)</li>
<li><strong>割接上线</strong>:停写 MySQL → 等待增量同步完成 → 切换应用连接 → 验证</li>
</ul>
</section>
<!-- Sources -->
<div class="sources">
<h2>数据来源</h2>
<ul>
<li><a href="https://cloud.tencent.com/developer/article/2649324" target="_blank">腾讯云开发者 - MySQL2PG 迁移神器</a></li>
<li><a href="https://cloud.tencent.com/developer/article/2663402" target="_blank">MySQL2PG v3.4.0 正式发布</a></li>
<li><a href="https://cloud.tencent.com/developer/article/2623900" target="_blank">MySQL2PG v2.0.0 发布</a></li>
<li><a href="https://help.aliyun.com/zh/dts/user-guide/migrate-data-from-an-apsaradb-rds-for-mysql-instance-to-an-apsaradb-rds-for-postgresql-instance" target="_blank">阿里云 DTS - RDS MySQL 迁移至 RDS PostgreSQL</a></li>
<li><a href="https://comate.baidu.com/zh/page/wywu3eyik8h" target="_blank">百度文心 - MySQL 迁移至 PostgreSQL 工具与步骤</a></li>
<li><a href="https://support.huaweicloud.com/realtimemig-drs/drs_08_0089.html" target="_blank">华为云 DRS - 迁移方案概览</a></li>
<li><a href="https://cloud.tencent.com/document/product/571" target="_blank">腾讯云 DTS 产品文档</a></li>
<li><a href="https://github.com/dimitri/pgloader" target="_blank">dimitri/pgloader - GitHub</a></li>
<li><a href="https://github.com/aliyun/rds_dbsync" target="_blank">aliyun/rds_dbsync - GitHub</a></li>
<li><a href="https://blog.csdn.net/eggwyw/article/details/158964966" target="_blank">CSDN - 从 MySQL 迁移到 PostgreSQL 完整指南</a></li>
<li><a href="https://www.kingbase.com.cn/explore/tech-blog/2026-%E5%B9%B4-mysql-%E8%BF%81%E7%A7%BB%E5%B7%A5%E5%85%B7%E5%AE%9E%E6%B5%8B%EF%BC%9A%E5%A6%82%E4%BD%95%E5%A4%A7%E5%B9%85%E9%99%8D%E4%BD%8E%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB%E6%88%90/" target="_blank">人大金仓 - 2026年 MySQL 迁移工具实测</a></li>
</ul>
</div>
</main>
<div class="footer" style="text-align:center; padding:24px 0; color:var(--text-tertiary); font-size:0.85rem; border-top:1px solid var(--border); margin-top:20px;">
<p>调查报告生成于 2026-05-04 | 数据来源:各云厂商文档及开源项目</p>
</div>
<script>
const links = document.querySelectorAll('.sidebar nav a');
const sections = document.querySelectorAll('.main section, .main .sources');
function setActive() {
let current = '';
sections.forEach(s => {
if (s.getBoundingClientRect().top < 120) current = s.id;
});
links.forEach(a => {
a.classList.toggle('active', a.getAttribute('href') === '#' + current);
});
}
links.forEach(a => {
a.addEventListener('click', e => {
e.preventDefault();
const target = document.querySelector(a.getAttribute('href'));
if (target) target.scrollIntoView();
});
});
window.addEventListener('scroll', setActive, { passive: true });
setActive();
</script>
</body>
</html>