init: 导入团队知识库内容

This commit is contained in:
yueqian-ai
2026-05-14 16:56:48 +08:00
commit acca2041f0
1681 changed files with 285734 additions and 0 deletions
@@ -0,0 +1,785 @@
<!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>