说明
在前一篇文章中,我们介绍了 MYSQL2PG 的 V1.0 版本 诞生的背景及其主要功能。经过这段时间持续的功能迭代和大量实际案例的验证,V2.0版本现已正式发布。新版本代码已适配MySQL 5.7及以上、PostgreSQL 12及以上的数据库版本,新增了视图(VIEW)的自动转换功能,并针对DDL转换和函数(FUNCTION)转换中的诸多语法问题进行了优化。
MySQL2PG:一站式数据库迁移方案
MySQL2PG 是一款使用 Go 语言开发的数据库转换工具,致力于实现从 MySQL 5.7+ 到 PostgreSQL 10+ 的无缝迁移。它支持将MySQL的表结构、数据、视图、索引、函数、用户及用户表权限完整地、链路式地转换到PostgreSQL数据库中。工具在转换过程中支持丰富的参数配置,具备高性能、高可靠性和高移植性的特点。
MySQL2PG的核心优势
与其他迁移方案相比,MySQL2PG在多个维度上展现出独特优势:
| 特性 |
MySQL2PG |
其他工具 |
| 开发语言 |
Go 语言原生开发 |
Java、Python 或其他语言 |
| 部署方式 |
单文件,无额外依赖 |
部署复杂,常依赖第三方库 |
| 跨平台性 |
支持 Windows 与 Linux |
通常仅支持单一平台 |
| 执行效率 |
Go 原生并发,效率高 |
效率相对较低 |
| 参数配置 |
简洁的 YAML 格式配置文件 |
JSON 或其他格式,配置复杂 |
| 开源协议 |
Apache 2.0,完全开源 |
可能收费或功能受限 |
MySQL2PG的详细转换流程
整个迁移过程被清晰地划分为多个步骤,用户可以通过配置文件灵活控制每个环节的执行:
开始
│
├─▶ [Step 0] test_only 模式?
│ ├─ 是 → 测试 MySQL & PostgreSQL 连接 → 显示版本 → 退出
│ └─ 否 → 继续
│
├─▶ [Step 1] 读取 MySQL 表定义
│ ├─ 若 exclude_use_table_list=true → 从数据库层面过滤 exclude_table_list 中的表
│ └─ 若 use_table_list=true → 仅获取 table_list 中的表
│
├─▶ [Step 2] 转换表结构 (tableddl: true)
│ ├─ 字段类型智能映射(如 tinyint(1) → BOOLEAN)
│ ├─ lowercase_columns/lowercase_tables 控制字段名/表名大小写
│ └─ 在 PostgreSQL 中创建表(skip_existing_tables 控制是否跳过)
│
├─▶ [Step 3] 转换视图 (views: true)
│ └─ MySQL 视图定义转换为 PostgreSQL 兼容语法
│
├─▶ [Step 4] 同步数据 (data: true)
│ ├─ 若 truncate_before_sync=true → 清空目标表
│ ├─ 分批读取 MySQL 数据(max_rows_per_batch)
│ ├─ 批量插入 PostgreSQL(batch_insert_size)
│ ├─ 并发线程数由 concurrency 控制
│ └─ 自动禁用外键约束和索引提高性能
│
├─▶ [Step 5] 转换索引 (indexes: true)
│ ├─ 主键、唯一索引、普通索引、全文索引 → 自动重建
│ └─ 批量处理(max_indexes_per_batch=20)
│
├─▶ [Step 6] 转换函数 (functions: true)
│ └─ 支持50+函数映射(如 NOW() → CURRENT_TIMESTAMP,IFNULL() → COALESCE())
│
├─▶ [Step 7] 转换用户 (users: true)
│ └─ MySQL 用户 → PostgreSQL 角色(保留密码哈希)
│
├─▶ [Step 8] 转换表权限 (table_privileges: true)
│ └─ GRANT SELECT ON table → GRANT USAGE, SELECT ON table
│
└─▶ [Final Step] 数据校验与完成 (validate_data: true)
├─ 查询 MySQL 和 PostgreSQL 表行数
├─ 启用之前禁用的外键约束和索引
├─ 若 truncate_before_sync=false → 记录不一致表,继续执行
├─ 输出转换统计报告和性能指标
└─ 生成不一致表清单(如有)
如何使用
直接下载二进制文件
项目在GitHub上已预先编译好了适用于Windows和Linux平台的二进制文件,你可以直接下载使用。
下载地址: https://github.com/xfg0218/MySQL2PG/releases/tag/v2.0.0
使用源码编译
如果你希望从源码构建,需要提前部署好 Go 1.24+ 环境,然后按照以下步骤操作。
# 克隆仓库
git clone https://github.com/xfg0218/mysql2pg.git
cd mysql2pg
# 构建项目
make build
# 创建配置文件
cp config.example.yml config.yml
接下来,你需要修改 config.yml 文件中的转换配置部分。以下是一个关键配置项的说明:
conversion:
# 转换选项,按照以下参数顺序进行
options:
tableddl: true # step1: 转换表DDL
data: true # step2: 转换数据(先转DDL后转数据)
view: true # step3: 转换表视图
indexes: true # step4: 转换索引
functions: true # step5: 转换函数
users: true # step6: 转换用户
table_privileges: true # step7: 转换用户在表上的权限
lowercase_columns: true # 控制表字段是否需要转小写,true为转小写(默认值)
skip_existing_tables: true # 如果表在PostgreSQL中已存在则跳过,否则创建
use_table_list: false # 是否使用指定的表列表进行数据同步,其他步骤不生效
table_list: [table1] # 指定要同步的表列表,当use_table_list为true时生效,格式为[table1,table2,...]
exclude_use_table_list: false # 是否使用跳过表列表,为true时忽略exclude_table_list中的表
exclude_table_list: [table1] # 要跳过的表列表,当exclude_use_table_list为true时生效
validate_data: true # 同步数据后验证数据一致性
truncate_before_sync: true # 同步前是否清空表数据
配置完成后,执行生成的二进制文件即可开始迁移任务。
问题反馈与社区
MySQL2PG 是一个活跃的 开源项目,欢迎大家使用并提出宝贵意见。如果在使用过程中遇到任何问题,可以通过GitHub仓库提交Issue,或者直接联系作者。同时,也欢迎对 MySQL 和 PostgreSQL 等数据库技术感兴趣的朋友,到 云栈社区 进行更深入的交流与探讨。
|