找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

565

积分

0

好友

67

主题
发表于 4 天前 | 查看: 17| 回复: 0

说明

在前一篇文章中,我们介绍了 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,或者直接联系作者。同时,也欢迎对 MySQLPostgreSQL 等数据库技术感兴趣的朋友,到 云栈社区 进行更深入的交流与探讨。




上一篇:Go编译时自动插桩实战:利用-toolexec实现零代码修改的追踪
下一篇:30+种网络安全设备分类详解:从防火墙到安全基线,厘清功能边界
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-24 01:42 , Processed in 1.352092 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表