PostgreSQL 迁移 MySQL 实战避坑手册:用 pg2mysql 三大命令搞定数据库迁移

📅 发布时间:2026/8/19 17:44:48
PostgreSQL 迁移 MySQL 实战避坑手册:用 pg2mysql 三大命令搞定数据库迁移 PostgreSQL 迁移 MySQL 实战避坑手册用 pg2mysql 三大命令搞定数据库迁移【免费下载链接】pg2mysql项目地址: https://gitcode.com/gh_mirrors/pg2/pg2mysql这是一篇写给数据库迁移新手的实战教程。pg2mysql 是一款专为 PostgreSQL 迁移 MySQL 设计的开源数据库迁移工具通过 validate、migrate、verify 三大命令完成兼容性检查、数据搬运与完整性核对帮你把最容易出问题的字符类型长度差异、数据丢失风险在正式迁移前就排查干净。一、一次真实的迁移翻车现场朋友小张上周跟我吐槽公司要把一套老系统从 PostgreSQL 换到 MySQL上线前一天做数据核对发现events 表少了 3 万条记录原因居然是 PostgreSQL 里text类型的字段存了 8 万多个字符而 MySQL 同名类型最多只能装 65535 个字符——数据被静默截断了业务方一脸懵DBA 一脸黑。这个场景是不是很熟悉PostgreSQL 和 MySQL 虽然都叫关系型数据库但底层对字符类型的处理逻辑完全不同。手动写脚本搬数据往往只关注能连上、能 INSERT却忽略了两边的字段容量是否真的匹配。pg2mysql 就是为这种场景而生的它把迁移前检查、迁移中搬运、迁移后核对做成了三个命令让整个 PostgreSQL 迁移 MySQL 的过程可预期、可回滚、可验收。二、动手前准备一条 YAML 配置打通两端pg2mysql 的核心思路很简单你给它一份配置文件告诉它 PostgreSQL 和 MySQL 分别在哪剩下的活它来干。配置文件是标准的 YAML 格式逐项拆解如下mysql: database: your-mysql-db # 目标库名 username: mysql-user # MySQL 账号 password: mysql-password # MySQL 密码 host: 127.0.0.1 # MySQL 地址 port: 3306 # MySQL 端口 postgresql: database: your-postgres-db # 源库名 username: postgres-user # PostgreSQL 账号 password: postgres-password # PostgreSQL 密码 host: 127.0.0.1 # PostgreSQL 地址 port: 5432 # PostgreSQL 端口 ssl_mode: disable # SSL 模式本地测试用 disable几个新手容易忽略的细节端口别写错MySQL 默认 3306PostgreSQL 默认 5432两者差很多写反了连不上。ssl_mode 怎么填本机或内网测试直接disable生产环境按 PostgreSQL 官方文档里的取值配置比如require、verify-ca等。先建好目标库pg2mysql 负责搬数据不负责帮你建 MySQL 库和表结构迁移前请确保 MySQL 端表结构已存在且与 PostgreSQL 大体对应。 大白话解释ssl_mode就是要不要给数据库连接加一把加密锁。本地练手无所谓跨机房传输数据时务必开启。三、三步完成安装源码编译只要一条命令pg2mysql 是用 Go 写的安装方式就是从源码编译。在终端里依次执行git clone https://gitcode.com/gh_mirrors/pg2/pg2mysql cd pg2mysql go build -o pg2mysql ./cmd/pg2mysql/三步之后当前目录会多出一个名为pg2mysql的可执行文件验证一下是否成功./pg2mysql --help如果终端能打印出包含validate、migrate、verify三个子命令的说明说明安装完成。新手最容易在这里遇到两个报错报错现象原因解决办法command not found: go本机没装 Go 环境先安装 Go 1.x 并配置好GOPATHundefined: xxx编译失败Go 版本过旧或依赖未拉取升级 Go 版本后重新执行go build四、核心原理为什么必须做兼容性检查很多人不理解都是数据库直接SELECT ... INSERT ...不就行了问题恰恰出在字符类型的容量差异上。PostgreSQL 的text类型在官方文档里被描述为实际上没有长度限制你可以往里塞任意长度的字符串。MySQL 的text类型被硬性限制为 65535 字符而更常用的varchar(n)则要求在定义时明确写出上限比如varchar(255)。翻译成人话就是PostgreSQL 里一个text字段能存下一本书MySQL 里同一个名字的字段只能存一篇短文章。如果源库数据超长迁移到 MySQL 时要么报错中断要么被静默截断——后者更可怕因为数据看起来迁过去了实际已经残缺。pg2mysql 的解法是三层防线validate迁移前逐表逐行检查把MySQL 装不下的数据行揪出来精确到主键 ID。migrate确认兼容后用预处理语句批量插入支持先TRUNCATE目标表再灌数据。verify迁移后做逐行比对找出缺失的记录给出缺失行的 ID 清单。所以流程必须是validate → migrate → verify跳过第一步直接 migrate等于把风险留到了上线之后。五、迁移实战全流程从检查到验收的完整清单假设你的配置文件叫config.yml完整流程如下。Step 1检查 MySQL 表结构是否兼容./pg2mysql -c config.yml validate输出可能长这样found incompatible rows in apps with IDs [2] found incompatible rows in app_usage_events with IDs [9 10 11 12] found incompatible rows in events with IDs [16 17 18]看到incompatible rows别慌这是工具在帮你提前发现雷区。根据提示的 ID 去源库把这些行的超长数据修正比如截短、改字段类型再重新跑一遍 validate直到所有表都输出OK。Step 2正式搬运数据./pg2mysql -c config.yml migrate --truncate--truncate的含义是复制数据前先把目标表清空保证迁移结果干净不会跟残留数据混在一起。执行过程中会逐表打印插入条数inserted 2 records into organizations inserted 3 records into lockings inserted 2 records into droplets ...Step 3核对数据是否完整./pg2mysql -c config.yml verify工具会逐张表比对 PostgreSQL 与 MySQL 的内容正常情况打印OKVerifying table spaces_developers...OK Verifying table organizations...OK Verifying table lockings...OK如果出现缺失会明确告诉你缺了哪些 IDVerifying table droplets... FAILED: 1 row missing Missing IDs: 1,3,5这时按 ID 排查修复重跑 migrate 补数据即可。⚠️ 注意verify 对时间戳做的是近似比对。MySQL 官方版对时间戳是四舍五入MariaDB 则是截断两者行为不一致这是官方文档里明确说明的已知特性。一张表看懂三大命令分工命令阶段作用关键参数validate迁移前检查数据是否兼容定位问题行 ID无migrate迁移中从 PostgreSQL 搬运数据到 MySQL--truncate清空目标表verify迁移后逐行核对报告缺失记录无六、避坑指南新手最容易踩的 3 个坑坑 1跳过 validate 直接 migrate这是最常见的错误。很多人图省事validate 输出一堆incompatible也当没看见结果 migrate 中途报错或数据被截断。正确姿势validate 不通过绝不进入 migrate。坑 2不建目标表结构就开跑pg2mysql 只搬数据不建表。MySQL 端如果连表都不存在migrate 会直接失败。正确姿势先把 PostgreSQL 的表结构翻译成 MySQL 版本并建好类型要尽量对齐尤其是text对应text、varchar(255)对应varchar(255)。坑 3把--truncate当摆设如果目标表里本来就有旧数据不加--truncate会导致新旧数据混在一起verify 时根本分不清谁是谁。正确姿势全量迁移务必加--truncate只迁增量时才考虑去掉。七、进阶技巧从能迁到迁得稳跑通基本流程只是第一步把 pg2mysql 用出价值还需要掌握这几个进阶玩法1. 数据完整性校验当定期体检把 verify 挂进定时任务每周跑一次对比 PostgreSQL 与 MySQL 的内容。数据库迁移工具不只是迁移那一刻用平时还能当双库一致性巡检员发现数据对不上立刻报警。2. 多环境数据同步开发、测试、生产三套环境要保数据一致在每套环境各放一份配置文件用同一套 migrate verify 流程同步数据比手工导出导入靠谱得多。3. 数据库升级前的数据转移从旧版 MySQL 升到新版、或从 PostgreSQL 迁移到 MySQL 新版本时pg2mysql 可以作为数据转移的标准动作配合--truncate保证目标库干净。4. 了解一下背后的模块设计pg2mysql 的源码结构很清晰想二次开发可以按图索骥源码文件职责config.go解析 YAML 配置并校验字段validator.go实现兼容性检查逻辑migrator.go实现数据搬运逻辑verifier.go实现迁移后的逐行校验八、写在最后迁移成功的三个要点回顾整篇教程PostgreSQL 迁移 MySQL 这件事记住三句话就够了先检查再动手validate 是唯一能在数据出问题前拦下你的关卡别跳过。全量迁移用--truncate清空目标表再灌数据避免新旧混杂。迁移完必须 verify没有核对环节的迁移等于没有验收的上线。数据迁移从来不是把数据倒过去这么简单字符容量差异、时间戳精度、主键冲突每一个坑都能让上线变成事故现场。pg2mysql 把这三件事拆成了三个命令让每一步都有据可查、有错可改。现在就拉一份配置文件拿测试库跑一遍 validate → migrate → verify 全流程你会在十分钟内体会到数据库迁移工具本该有的样子。祝迁移顺利不踩坑【免费下载链接】pg2mysql项目地址: https://gitcode.com/gh_mirrors/pg2/pg2mysql创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考