pgloader 实战:MySQL 转 PostgreSQL 一条命令,坏行自动隔离不中断
pgloader 实战MySQL 转 PostgreSQL 一条命令坏行自动隔离不中断【免费下载链接】pgloaderMigrate to PostgreSQL in a single command!项目地址: https://gitcode.com/gh_mirrors/pg/pgloaderpgloader 是一个把数据搬进 PostgreSQL 的迁移工具一条命令完成表结构、索引、数据的全量迁移坏数据行单独隔离而不中断整体任务。本文面向会用终端、看得懂 SQL 的运维和数据工程师带你快速上手 MySQL 转 PostgreSQL 和 CSV 导入。它到底解决了什么问题打个比方pgloader 相当于数据库世界的 rsync 加转码器。你把源端和目标端各给它一个连接串它自己读元数据、改写出兼容的建表语句再走 COPY 协议把数据流过去。它和裸 COPY 最大的差别在错误处理。PostgreSQL 的事务模型意味着 COPY 流里只要有一行数据不合法整批数据全部被拒任务直接失败。pgloader 把数据切成小批次默认每批 25000 行见 docs/batches.rst某一批失败时就缩小范围重试把坏行挑出来写到 reject 文件里好数据继续入库。跨数据库场景它还顺带做类型转写比如把 MySQL 的0000-00-00日期转成 NULL因为公历没有公元零年。和常见做法放在一起看对比项原生 COPY通用 ETL 工具pgloader错误容忍一行坏全批回滚视工具而定坏行隔离继续加载跨库类型转写无需手工开发映射内置规则可覆盖建表/索引/外键迁移手动需额外配置自动发现并转换上手成本低但只能同格式高一条命令或一个 .load 文件装起来也不重v4 版是纯 Clojure 重写的单文件 JAR只要 Java 21 以上没有原生库依赖见 README.md。需要源码的话克隆 https://gitcode.com/gh_mirrors/pg/pgloader 即可。⚡ 一句话定位它是给 PostgreSQL 准备的容错搬运工不是通用 ETL 平台。3 个高频场景照着敲就行MySQL 转 PostgreSQL一条命令全量迁移场景老系统跑在 MySQL 上要整体搬进 PostgreSQL连表结构一起。createdb pagila pgloader mysql://userlocalhost/sakila postgresql:///pagila就这一行。pgloader 连上 MySQL 读表定义转写建表语句含索引、外键、注释再并行灌数据。常见坑MySQL 里0000-00-00、0000-00-00 00:00:00这种零值日期 PostgreSQL 不认。数据库源默认是 on error stop遇到就停。解法是在 .load 文件里加一条CAST type datetime to timestamptz using (zero-dates-to-null)零日期自动变 NULL。CSV 导入 PostgreSQL坏行自动隔离场景业务导出的 CSV 要进已有表里面可能有脏数据。pgloader --type csv \ --field id --field name \ --with truncate \ --with skip header 1 \ --with fields terminated by , \ ./sales.csv \ postgres:///pgloader?tablenamesales文件类源默认 on error resume next坏行进 reject 文件任务不中断。常见坑跑完以为没数据其实坏行都在/tmp/pgloader/下的*.dat/*.log里。先查 reject 文件再调数据比盯着日志猜快得多。增量同步小表重跑大表交给逻辑复制场景迁移后源库还在写需要周期性把变更补进目标库。LOAD DATABASE FROM pgsql://usersrc/shop INTO pgsql://userdst/shop WITH data only, truncate对维度表这类小表定时重跑这条命令就是最省心的增量。常见坑别指望它对大流水表做行级增量。目标表是 truncate 后重写源库新增的主键序列值不会自动对齐需要手动setval重置序列。如果真要行级 CDC官方文档直接指路 pgcopydb基于逻辑解码pgloader 负责全量pgcopydb 接增量分工更清晰。 场景选型记一下全量跨库、文件导入、定期重跑是 pgloader 的三个舒适区。数据量多大参数怎么配pgloader 参数不少但真正影响耗时的是少数几个。先看决策矩阵量级对号入座数据规模workersconcurrencybatch 建议预估耗时量级小于 10GB4默认1默认 25000 行/批分钟级到小时10–100GB82–4默认1–4 小时100GB–1TB8–164调大 batch rows数小时需时间窗超过 1TB拆分执行按大表单独调大表先压测按天规划只记三件事就够了workers是表级并行度控制几张表同时拷。文件源默认 8数据库源默认 4。concurrency是表内并行度把一张大表拆成多个主键区间同时读需要源表有主键MySQL 按 PK 区间、PG 14 按 ctid 块。max parallel create index控制建索引线程数索引多的大表别让它全量并发。调优前 vs 调优后以官方默认 workers4 跑一个约 80GB 的订单库6 小时左右改成 workers8、concurrency4 后约 2.5 小时经验值供量级参考实际看硬件和网络。Top 5 高频报错查表就行现象根因一行解法invalid byte sequence for encoding UTF8源端是 latin1 等编码连接串或 WITH 里指定源编码转写integer out of range for type数值超出目标类型范围CAST type int to bigint 升级类型permission denied for table迁移用户权限不够授予目标库 CREATE 与 TRUNCATE加载中途内存吃紧批次在内存驻留批量过大调小 batch rows 或 batch sizecould not connect to server网络不通或监听地址错查 host、端口与防火墙加大超时️ 排错顺序建议先看 reject 文件再看日志最后才怀疑参数。写在最后pgloader 把搬数据库这件苦差事压缩成一条命令加几行 CAST 规则全量迁移、文件导入、定期重跑都能覆盖。延伸阅读快速上手与命令行参数docs/quickstart.rst批处理与错误隔离机制docs/batches.rst内置转换函数清单docs/ref/transforms.rst【免费下载链接】pgloaderMigrate to PostgreSQL in a single command!项目地址: https://gitcode.com/gh_mirrors/pg/pgloader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考