
pg2mysqlPostgreSQL到MySQL数据迁移的保姆级实战指南【免费下载链接】pg2mysql项目地址: https://gitcode.com/gh_mirrors/pg2/pg2mysql数据库搬家听着简单干过的都知道坑有多深。从PostgreSQL迁到MySQL最让人头疼的往往不是数据量而是那些看起来一样、用起来完全不同的数据类型。尤其是text字段——在PostgreSQL里它可以装下几乎无限长的文本到了MySQL却可能因为长度超限被悄悄截断。pg2mysql正是为解决这类问题而生的开源工具它用三个命令帮你完成迁移前的兼容性检查、迁移执行和迁移后的完整性校验让整趟数据搬家的过程有章可循、有据可查。迁移路上的拦路虎为什么PostgreSQL的数据到了MySQL会出问题先讲个真实场景。某天你的业务系统要从PostgreSQL切到MySQL表结构看起来差不多字段名、表名都对得上于是你信心满满地开始导数据。结果导完一查用户留言板里的长文本缺了尾巴日志表里的字段被截断——数据无声无息地丢了这才是最可怕的。问题就出在text类型上。PostgreSQL官方文档说得很直白text几乎没有长度限制。而MySQL里同名类型上限是65535个字符更常用的varchar还必须显式声明长度比如varchar(255)。两边都叫text容量却天差地别。你很难靠肉眼逐列比对去发现这种隐患更没法预料哪一行数据会超限。这就像搬家前不量门框尺寸等沙发卡在门口才傻眼。而pg2mysql的做法很聪明它在动手搬家之前先帮你量好尺寸把可能塞不进去的行李一件件找出来。认识主角三个命令覆盖迁移全流程pg2mysql是纯Go编写的命令行工具核心思路非常清晰——迁移不是一把梭而是先体检、再搬运、后复查三步走validate迁移前检查找出PostgreSQL中那些塞不进MySQL表结构的行migrate正式执行数据迁移把数据从PostgreSQL安全搬到MySQLverify迁移完成后逐表比对确认两边内容一致一上来就摸清了对手的套路自然事半功倍。环境准备三步拿到可执行文件别被从源码编译吓到其实就三条命令的事。确保机器上有Go环境然后执行git clone https://gitcode.com/gh_mirrors/pg2/pg2mysql cd pg2mysql go build -o pg2mysql ./cmd/pg2mysql/编译完成后当前目录下会多出一个pg2mysql可执行文件直接就能用。工具依赖Go标准库和少量第三方库编译过程一般不会卡壳。配置文件的正确打开方式两段连接信息搞定使用前需要准备一个YAML格式的配置文件把两端数据库的连接信息写清楚mysql: database: target-db username: mysql-user password: mysql-password host: 127.0.0.1 port: 3306 postgresql: database: source-db username: pg-user password: pg-password host: 127.0.0.1 port: 5432 ssl_mode: disablessl_mode字段用于指定PostgreSQL的连接加密模式日常本地调试填disable即可。注意MySQL端口默认3306PostgreSQL默认5432别填反了。实操第一步validate给数据做一次精密体检配置写好后运行迁移前的检查pg2mysql -c config.yml validate工具会读取两端数据库的表结构逐列判断MySQL端是否有足够的容量装下PostgreSQL端的数据。如果发现问题它会直接告诉你found incompatible rows in apps with IDs [2] found incompatible rows in app_usage_events with IDs [9 10 11 12]看到这样的输出先别急着迁移。这些ID对应的行就是超尺寸行李要么在源端清理要么把目标表的字段长度放宽处理干净再进入下一步。这一步的价值在于把可能的数据丢失风险提前暴露出来而不是等迁移完成后再补救。实操第二步migrate一条命令跑通数据搬迁体检通过正式搬家pg2mysql -c config.yml migrate --truncate命令执行时会打印每张表的写入进度inserted 2 records into organizations inserted 3 records into lockings inserted 0 records into route_bindings ...这里的--truncate参数表示迁移前先清空目标表适合全量迁移的场景。如果目标表里已有数据想保留去掉这个参数即可。另外工具在迁移时会自动处理外键约束的启停避免插入顺序导致约束报错这个细节对数据完整性很重要。实操第三步verify让结果经得起对账迁移完成不代表万事大吉收尾的复查环节不能省pg2mysql -c config.yml verify工具会逐表逐行比对源库和目标库的内容Verifying table spaces_developers...OK Verifying table organizations...OK Verifying table droplets... FAILED: 1 row missing Missing IDs: 1,3,5看到OK的表示该表数据完全一致看到FAILED和缺失ID列表说明还有漏网之鱼需要回去排查。值得说明的是verify对时间戳做了秒级精度比对因为MySQL的datetime精度通常达不到PostgreSQL的微秒级这是符合预期的差异。它能用在哪些场景系统切换应用要从PostgreSQL迁移到MySQL先跑通这套体检—搬运—复查流程降低切换风险数据备份把PostgreSQL数据定期同步一份到MySQL作为异构备份环境同步开发、测试、生产环境使用不同数据库时用它保持数据口径一致迁移演练正式迁移前先跑一遍流程摸清数据规模和潜在风险原理浅析它是怎么判断不兼容的看代码会发现pg2mysql的结构非常清晰。config.go负责解析配置文件db.go里的BuildSchema会从两端数据库拉取表结构信息Column.Compatible方法则是兼容性判断的核心当源端字段没有长度限制MaxChars为0而目标端有限制时就判定存在风险再通过GetIncompatibleRowIDs查出具体是哪些行超限。迁移阶段migrator.go会先禁用目标库的外键约束用预处理语句逐表写入全程有watcher.go里的进度打印。校验阶段verifier.go则用一条带EXISTS的查询逐行比对找出缺失记录。整个设计体现了可观察、可追踪的思路——每一步都有输出出了问题知道去哪查。常见问题速答Q迁移前必须跑validate吗建议必须。它是唯一能在迁移前暴露超限风险的环节跳过它等于闭眼过河。Qmigrate不带--truncate会怎样目标表已有数据时会尝试追加写入主键冲突的行会插入失败并打印错误其余继续执行。Qverify报Missing IDs怎么处理通常是该行在迁移时因类型或约束问题被跳过回头检查对应ID的源数据调整目标表结构后单独补迁。Q时间字段比对不一致MySQL官方版对时间戳做四舍五入MariaDB则直接截断工具按秒级截断比对这是设计内的行为。写在最后数据迁移这件事最怕的不是麻烦而是我以为成功了。pg2mysql的价值恰恰在于它把迁移从一次性的冒险变成了一条可检查、可复现、可验证的流水线——validate替你提前排雷migrate替你稳妥搬运verify替你逐行对账。就算你是第一次做跨库迁移照着validate→migrate→verify的顺序走一遍也能心里有底。下一步找个测试环境用一份真实的业务数据跑一遍全流程。先validate看报出哪些不兼容行再决定是改表结构还是清数据——当你亲眼看到verify全部输出OK的那一刻就会明白什么叫搬得放心。【免费下载链接】pg2mysql项目地址: https://gitcode.com/gh_mirrors/pg2/pg2mysql创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考