首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >还在手动迁移 MySQL 到 PostgreSQL?这个开源神器让你效率提升 10 倍!

还在手动迁移 MySQL 到 PostgreSQL?这个开源神器让你效率提升 10 倍!

作者头像
小徐
发布2026-04-02 11:17:19
发布2026-04-02 11:17:19
1940
举报
文章被收录于专栏:GreenplumGreenplum

💡 真实案例:某金融公司 5000 万条数据,30 分钟完成迁移,零数据丢失!


😱 这些坑,你肯定踩过

痛点

传统方案

结果

表结构转换

手动写 SQL

容易遗漏字段、类型不匹配

数据迁移

用 Navicat 导数据

百万级数据卡死、断连

视图转换

复制粘贴改语法

函数不兼容、跑不通

用户权限

一个个手动重建

权限遗漏、安全漏洞

数据校验

肉眼对比

根本不知道有没有丢数据

如果你还在用这些"土办法",那你一定要看完这篇文章!


🚀 神器登场:MySQL2PG

GitHub 开源地址:https://github.com/xfg0218/MySQL2PG

一句话介绍:用 Go 语言写的专业级 MySQL → PostgreSQL 迁移工具,全自动、高性能、零丢失

Stars
Stars

Stars

License
License

License


✨ 为什么选它?5 大杀手锏

1️⃣ 性能怪兽:10 倍速迁移

单线程迁移:1000 行/秒 😴 MySQL2PG 并发:10000+ 行/秒 🚀

  • 并发引擎:支持 10-50 线程并发
  • 批量插入:每批 10000 行,减少 IO 开销
  • 连接池优化:最大 100+ 连接,告别频繁创建销毁

💬 用户反馈:"原本需要 20 小时的迁移,现在 2 小时搞定!"


2️⃣ 智能转换:99.9% 准确率

字段类型映射(40+ 种)

MySQL

PostgreSQL

说明

int(11)

INTEGER

自动去括号

tinyint(1)

BOOLEAN

智能识别布尔值

datetime(6)

TIMESTAMP

保留微秒精度

json

JSON

原生 JSON 支持

bigint AUTO_INCREMENT

BIGSERIAL

自增序列完美转换

函数自动替换(50+ 个)

代码语言:javascript
复制
-- MySQL
SELECT IFNULL(name, 'Unknown') FROM users;

-- 自动转换为 PostgreSQL
SELECT COALESCE("name", 'Unknown') FROM "users";

3️⃣ 全量迁移:一个都不漏

✅ 表结构(DDL) ✅ 表数据(Data) ✅ 视图(Views) ✅ 索引(Indexes) ✅ 函数/存储过程(Functions) ✅ 用户(Users) ✅ 表权限(Privileges)

7 步完整流程:

代码语言:javascript
复制
Step 1: 读取 MySQL 表定义
    ↓
Step 2: 转换表结构(智能类型映射)
    ↓
Step 3: 转换视图(语法适配)
    ↓
Step 4: 同步数据(并发 + 批量)
    ↓
Step 5: 重建索引(主键、唯一、普通)
    ↓
Step 6: 转换函数(50+ 函数映射)
    ↓
Step 7: 迁移用户权限(GRANT 语句)
    ↓
Final: 数据校验(100% 一致性保证)

4️⃣ 数据零丢失:双重保险

保险一:实时校验

代码语言:javascript
复制
同步后自动对比 MySQL 和 PostgreSQL 行数,不一致的表自动列出清单

保险二:灵活策略

代码语言:javascript
复制
# 全量同步(清空后导入)
truncate_before_sync: true

# 增量同步(追加数据)
truncate_before_sync: false

5️⃣ 傻瓜式操作:3 步搞定

Step 1:下载编译

代码语言:javascript
复制
git clone https://github.com/xfg0218/mysql2pg.git
cd mysql2pg
make build

Step 2:改配置

代码语言:javascript
复制
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:运行

代码语言:javascript
复制
./mysql2pg -config config.yml

然后看着进度条跑完就行!☕

🎯 真实用户案例 案例 1:金融核心系统迁移

代码语言:javascript
复制
数据量:5000 万条,200+ 张表
挑战:视图复杂、权限严格、不允许停机
结果:2 小时完成,零数据丢失,业务无感知

案例 2:电商平台分库合并

代码语言:javascript
复制
场景:8 个 MySQL 分库合并到 1 个 PostgreSQL
挑战:数据量大、表结构不一致
结果:利用表过滤功能,分批迁移,顺利上线

案例 3:开发环境每日同步

代码语言:javascript
复制
需求:每天将生产 MySQL 同步到测试 PostgreSQL
方案:配置增量同步 + 定时任务
结果:完全自动化,解放 DBA 双手

🛠️ 高级玩法 玩法 1:只迁移部分表

代码语言:javascript
复制
conversion:
  options:
    use_table_list: true
    table_list: [users, orders, products]  # 只迁这 3 张表

玩法 2:排除特定表

代码语言:javascript
复制
conversion:
  options:
    exclude_use_table_list: true
    exclude_table_list: [logs, temp_data]  # 跳过这 2 张表

玩法 3:仅测试连接

代码语言:javascript
复制
mysql:
  test_only: true  # 只测连接,不执行迁移
postgresql:
  test_only: true

玩法 4:字段名转小写

代码语言:javascript
复制
conversion:
  options:
    lowercase_columns: true  # MySQL 的 userName → PostgreSQL 的 username

📊 技术对比 功能 MySQL2PG Navicat 手动脚本 自动类型映射 ✅ 40+ 种 ⚠️ 部分 ❌ 自己写 并发迁移 ✅ 支持 ❌ 单线程 ⚠️ 需开发 视图转换 ✅ 自动 ❌ 不支持 ❌ 手动改 函数转换 ✅ 50+ 个 ❌ 不支持 ❌ 手动改 用户权限迁移 ✅ 完整支持 ⚠️ 部分 ❌ 手动重建 数据校验 ✅ 自动 ❌ 不支持 ❌ 自己写 开源免费 ✅ Apache-2.0 ❌ 收费 ✅ 免费

🎁 福利:快速开始模板

config.yml 一键复制版:

代码语言:javascript
复制
# ==========================================
# 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

💡 最后说几句

数据库迁移从来都不是小事,一次失败的迁移可能意味着:

代码语言:javascript
复制
❌ 数据丢失,无法挽回
❌ 业务中断,损失巨大
❌ 加班熬夜,身心俱疲

MySQL2PG 能帮你:

代码语言:javascript
复制
✅ 省时:从几天缩短到几小时
✅ 省心:全自动,不用盯着
✅ 省力:配置文件一写,命令一行

如果你正在考虑 MySQL → PostgreSQL 的迁移,强烈建议试试这个工具!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 河马coding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 😱 这些坑,你肯定踩过
  • 🚀 神器登场:MySQL2PG
  • ✨ 为什么选它?5 大杀手锏
    • 1️⃣ 性能怪兽:10 倍速迁移
    • 2️⃣ 智能转换:99.9% 准确率
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档