一次搞定PostgreSQL到MySQL迁移:pg2mysql的validate、migrate、verify三连击 📅 2026/8/19 13:42:59 一次搞定PostgreSQL到MySQL迁移pg2mysql的validate、migrate、verify三连击【免费下载链接】pg2mysql项目地址: https://gitcode.com/gh_mirrors/pg2/pg2mysql凌晨两点手机在床头疯狂震动。线上系统报错、数据对不上、业务方在群里连环你——而这已经是这个月第三次因为数据库迁移出问题了。你盯着屏幕上那行Data too long for column心里只有一个念头如果迁移前能提前发现这个问题该多好。别急今天我们要聊的开源工具pg2mysql就是专门为PostgreSQL 到 MySQL 数据迁移而生的。它把迁移前检查、数据搬运、迁移后核对三件事打包成三条命令帮你把最容易翻车的环节变成自动化的流水线。一句话说清它到底帮你解决了什么pg2mysql 做的事很简单在表结构基本对齐的前提下安全地把数据从 PostgreSQL 搬到 MySQL并在动手前后各设一道保险。它最亮眼的两个卖点迁移前自动体检先查 PostgreSQL 里哪些数据装不进 MySQL 的字段给出具体行 ID让你在出错之前就把问题修掉迁移后逐行核对搬完不算完它会把两个库逐表逐行比对告诉你缺了哪些 ID3 分钟快速上手安装、配置、首次运行一气呵成第一步编译安装约 30 秒pg2mysql 是 Go 写的编译干净利落一行命令搞定git clone https://gitcode.com/gh_mirrors/pg2/pg2mysql cd pg2mysql go build -o pg2mysql ./cmd/pg2mysql/你会看到当前目录下多出一个可执行文件pg2mysql。就这么简单无依赖、无环境变量拿起来就能用。第二步写配置文件约 1 分钟它只需要一个 YAML 文件把两个数据库的连接信息填进去mysql: database: your-mysql-db username: mysql-user password: mysql-password host: 127.0.0.1 port: 3306 postgresql: database: your-postgres-db username: postgres-user password: postgres-password host: 127.0.0.1 port: 5432 ssl_mode: disable你会看到文件保存为config.yml后pg2mysql 的三个子命令都会通过-c config.yml读取它。注意 PostgreSQL 的ssl_mode字段是必须的按需填disable或require即可。第三步跑一次验证约 30 秒配置写好先别急着迁移跑一下体检./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]有问题的表和具体行 ID 一目了然。修完这些数据再跑一遍直到全部OK就可以放心进入迁移环节了。真实场景拆解三条命令如何串起一次完整迁移 场景一迁移前的数据体检——validate 命令这是 pg2mysql 最救命的功能也是它诞生的初衷。PostgreSQL 里最常见的字符类型是text官方文档明确说它几乎没有长度限制但 MySQL 里同名的text类型上限是 65535 字符而更常用的varchar还得显式声明长度比如varchar(255)。这意味着PostgreSQL 里能存下的数据MySQL 里未必装得下。validate 会逐表逐行检查把超限的数据揪出来./pg2mysql -c config.yml validate如果某张表没有id列它会退而求其次只报不兼容的行数有id列的表则会直接列出具体 ID方便你精准定位修复。 场景二正式搬运——migrate 命令体检全部通过后执行迁移./pg2mysql -c config.yml migrate --truncate你会看到每一张表的搬运进度都实时打印——inserted 2 records into organizations inserted 3 records into lockings inserted 0 records into service_dashboard_clients inserted 0 records into route_bindings ...这里有几个贴心的细节--truncate会在写入前清空目标表适合重复迁移、全量覆盖的场景不想要这个行为去掉参数即可迁移前会自动禁用目标库的外键约束搬完再恢复避免插入顺序导致的外键报错对于有id列的表它还会跳过目标库中已存在的 ID天然支持增量续传——中途断了重跑也不会重复插入✅ 场景三搬完不算完——verify 命令迁移结束数据真的对齐了吗让 verify 来背书./pg2mysql -c config.yml verify你会看到Verifying table spaces_developers...OK Verifying table security_groups_spaces...OK Verifying table droplets... FAILED: 1 row missing Missing IDs: 1,3,5 Verifying table organizations...OK它会对两个库逐表逐行做精确比对只要有一行对不上就明确告诉你缺了哪几个 ID。看到满屏OK你才敢拍着胸脯跟业务方说数据没问题。避坑锦囊新手最容易踩的 4 个坑坑 1跳过 validate 直接 migrate结果中途报Data too long迁移中断你还得手动回滚正确姿势先validate把不兼容行全部修掉再动手一次通过坑 2误以为 MySQL 的 text 和 PG 的 text 是一回事结果超过 65535 字符的数据被静默截断数据悄悄丢了正确姿势把目标列定义成longtext或足够大的varchar让 validate 帮你确认坑 3重复迁移导致主键冲突结果第二次 migrate 直接报 duplicate key正确姿势重复全量迁移时带上--truncate增量场景下 pg2mysql 会自动跳过已存在的 ID坑 4verify 在时间戳上较真结果明明数据差不多却报缺失正确姿势verify 假设 PostgreSQL 的精确时间戳在迁移到 MySQL 时被截断了但官方 MySQL 会四舍五入、MariaDB 则直接截断行为不一致时属于已知现象别慌不是数据真的丢了原理通俗化它就像一个靠谱的搬家公司把数据库迁移想象成搬家validate 是搬家前的清点——先到新房子量好每个柜子的尺寸再对照旧房子逐件家具检查凡是塞不进去的提前贴标签告诉你这张沙发进不了门migrate 是正式搬运——先把所有房门锁都打开禁用约束按清单一件件搬搬完再把门锁上恢复约束绝不落下一件verify 是搬家后的复核——拿着旧房子的清单到新房子逐件对账少了哪件、缺了哪个编号当场点给你看。全程三张清单环环相扣。你在中间要做的只是把 validate 揪出来的超标家具提前处理掉剩下的就交给它了。最后别让数据迁移成为你的午夜惊魂回顾一下pg2mysql 的价值其实就一句话把迁移出错从不可控的灾难变成可控的流程。先体检、再搬运、后复核三步闭环每一步都有明确反馈每一次出错都能定位到具体行——这对任何要面对 PostgreSQL 到 MySQL 迁移的团队来说都称得上迁移保险级别的工具。下一步很明确去官方仓库git clone https://gitcode.com/gh_mirrors/pg2/pg2mysql花三分钟跑通上面的流程顺手给项目点个 Star让更多人看到这个宝藏工具如果遇到问题欢迎向项目提交 PR——比如 verify 命令对不同 MySQL 分支时间戳行为的智能兼容就是项目 README 里公开征集的改进方向数据迁移这件事值得被认真对待。让 pg2mysql 帮你把风险挡在动手之前把核对做在交付之后从此告别凌晨两点的手机震动。【免费下载链接】pg2mysql项目地址: https://gitcode.com/gh_mirrors/pg2/pg2mysql创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考