
💡 真实案例:某金融公司 5000 万条数据,30 分钟完成迁移,零数据丢失!
痛点 | 传统方案 | 结果 |
|---|---|---|
表结构转换 | 手动写 SQL | 容易遗漏字段、类型不匹配 |
数据迁移 | 用 Navicat 导数据 | 百万级数据卡死、断连 |
视图转换 | 复制粘贴改语法 | 函数不兼容、跑不通 |
用户权限 | 一个个手动重建 | 权限遗漏、安全漏洞 |
数据校验 | 肉眼对比 | 根本不知道有没有丢数据 |
如果你还在用这些"土办法",那你一定要看完这篇文章!
GitHub 开源地址:https://github.com/xfg0218/MySQL2PG
一句话介绍:用 Go 语言写的专业级 MySQL → PostgreSQL 迁移工具,全自动、高性能、零丢失!
Stars
License
单线程迁移:1000 行/秒 😴 MySQL2PG 并发:10000+ 行/秒 🚀
💬 用户反馈:"原本需要 20 小时的迁移,现在 2 小时搞定!"
字段类型映射(40+ 种):
MySQL | PostgreSQL | 说明 |
|---|---|---|
int(11) | INTEGER | 自动去括号 |
tinyint(1) | BOOLEAN | 智能识别布尔值 |
datetime(6) | TIMESTAMP | 保留微秒精度 |
json | JSON | 原生 JSON 支持 |
bigint AUTO_INCREMENT | BIGSERIAL | 自增序列完美转换 |
函数自动替换(50+ 个):
-- MySQL
SELECT IFNULL(name, 'Unknown') FROM users;
-- 自动转换为 PostgreSQL
SELECT COALESCE("name", 'Unknown') FROM "users";3️⃣ 全量迁移:一个都不漏
✅ 表结构(DDL) ✅ 表数据(Data) ✅ 视图(Views) ✅ 索引(Indexes) ✅ 函数/存储过程(Functions) ✅ 用户(Users) ✅ 表权限(Privileges)
7 步完整流程:
Step 1: 读取 MySQL 表定义
↓
Step 2: 转换表结构(智能类型映射)
↓
Step 3: 转换视图(语法适配)
↓
Step 4: 同步数据(并发 + 批量)
↓
Step 5: 重建索引(主键、唯一、普通)
↓
Step 6: 转换函数(50+ 函数映射)
↓
Step 7: 迁移用户权限(GRANT 语句)
↓
Final: 数据校验(100% 一致性保证)4️⃣ 数据零丢失:双重保险
保险一:实时校验
同步后自动对比 MySQL 和 PostgreSQL 行数,不一致的表自动列出清单保险二:灵活策略
# 全量同步(清空后导入)
truncate_before_sync: true
# 增量同步(追加数据)
truncate_before_sync: false5️⃣ 傻瓜式操作:3 步搞定
Step 1:下载编译
git clone https://github.com/xfg0218/mysql2pg.git
cd mysql2pg
make buildStep 2:改配置
mysql:
host: localhost
port: 3306
username: root
password: your_password
database: source_db
postgresql:
host: localhost
port: 5432
username: postgres
password: your_password
database: target_db
conversion:
options:
concurrency: 20 # 并发线程数,根据 CPU 调整
validate_data: true # 开启数据校验Step 3:运行
./mysql2pg -config config.yml然后看着进度条跑完就行!☕
🎯 真实用户案例 案例 1:金融核心系统迁移
数据量:5000 万条,200+ 张表
挑战:视图复杂、权限严格、不允许停机
结果:2 小时完成,零数据丢失,业务无感知案例 2:电商平台分库合并
场景:8 个 MySQL 分库合并到 1 个 PostgreSQL
挑战:数据量大、表结构不一致
结果:利用表过滤功能,分批迁移,顺利上线案例 3:开发环境每日同步
需求:每天将生产 MySQL 同步到测试 PostgreSQL
方案:配置增量同步 + 定时任务
结果:完全自动化,解放 DBA 双手🛠️ 高级玩法 玩法 1:只迁移部分表
conversion:
options:
use_table_list: true
table_list: [users, orders, products] # 只迁这 3 张表玩法 2:排除特定表
conversion:
options:
exclude_use_table_list: true
exclude_table_list: [logs, temp_data] # 跳过这 2 张表玩法 3:仅测试连接
mysql:
test_only: true # 只测连接,不执行迁移
postgresql:
test_only: true玩法 4:字段名转小写
conversion:
options:
lowercase_columns: true # MySQL 的 userName → PostgreSQL 的 username📊 技术对比 功能 MySQL2PG Navicat 手动脚本 自动类型映射 ✅ 40+ 种 ⚠️ 部分 ❌ 自己写 并发迁移 ✅ 支持 ❌ 单线程 ⚠️ 需开发 视图转换 ✅ 自动 ❌ 不支持 ❌ 手动改 函数转换 ✅ 50+ 个 ❌ 不支持 ❌ 手动改 用户权限迁移 ✅ 完整支持 ⚠️ 部分 ❌ 手动重建 数据校验 ✅ 自动 ❌ 不支持 ❌ 自己写 开源免费 ✅ Apache-2.0 ❌ 收费 ✅ 免费
🎁 福利:快速开始模板
config.yml 一键复制版:
# ==========================================
# MySQL2PG 配置文件模板
# ==========================================
mysql:
host: "127.0.0.1"
port: 3306
username: "root"
password: "your_mysql_password"
database: "source_database"
max_open_conns: 100
max_idle_conns: 50
connection_params: "charset=utf8mb4&parseTime=true"
postgresql:
host: "127.0.0.1"
port: 5432
username: "postgres"
password: "your_pg_password"
database: "target_database"
max_conns: 50
conversion:
options:
# 迁移步骤控制(true=执行,false=跳过)
tableddl: true # 表结构
data: true # 表数据
view: true # 视图
indexes: true # 索引
functions: true # 函数
users: true # 用户
table_privileges: true # 表权限
# 性能优化
concurrency: 20 # 并发线程数
batch_insert_size: 10000 # 每批插入行数
max_rows_per_batch: 100000 # 每批读取行数
# 数据安全
validate_data: true # 同步后校验
truncate_before_sync: true # 同步前清空表
# 其他选项
lowercase_columns: true # 字段名转小写
skip_existing_tables: false # 跳过已存在的表🔗 相关链接
资源 | 链接 |
|---|---|
⭐ GitHub 仓库 | https://github.com/xfg0218/MySQL2PG |
📖 详细文档 | 见 README.md |
🐛 问题反馈 | GitHub Issues |
💬 技术交流 | GitHub Discussions |
💡 最后说几句
数据库迁移从来都不是小事,一次失败的迁移可能意味着:
❌ 数据丢失,无法挽回
❌ 业务中断,损失巨大
❌ 加班熬夜,身心俱疲MySQL2PG 能帮你:
✅ 省时:从几天缩短到几小时
✅ 省心:全自动,不用盯着
✅ 省力:配置文件一写,命令一行如果你正在考虑 MySQL → PostgreSQL 的迁移,强烈建议试试这个工具!