pgloader 实现 PostgreSQL 数据迁移完整实战从一条命令到生产级大表【免费下载链接】pgloaderMigrate to PostgreSQL in a single command!项目地址: https://gitcode.com/gh_mirrors/pg/pgloader凌晨两点一次 3800 万行的导入被中断第 21403112 行有个空日期psql 的 \copy 把整张表回滚了。重头再来又是 40 分钟。加载器没有错误容忍度是数据迁移拖成项目的最常见原因。pgloader 是构建在 COPY 命令之上的 PostgreSQL 数据迁移工具。它和 \copy 的核心区别只有一个遇到坏行时写入 reject 文件然后继续加载好数据。一条命令即可完成 MySQL、SQLite 或文件类数据源的「结构 数据 索引」迁移。五分钟上手SQLite 到 PostgreSQL 的一条命令最常见的整库迁移场景不需要写任何配置文件两条命令就能闭环。① 安装。v4 是单文件 JAR需要 Java 21 及以上Debian/Ubuntu 也可直接用官方仓库的 v3 包apt-get install -y pgloader # v3 包 pgloader --version # v4 等价命令java -jar pgloader.jar --version② 建一个空目标库执行迁移createdb newdb # 空目标数据库 pgloader ./app.db postgresql:///newdb # SQLite 文件作为源整库迁移③ 验证结果psql postgresql:///newdb -c \dt # 目标表清单 psql postgresql:///newdb -c select count(*) from t1 # 行数抽查 ls /tmp/pgloader/ # reject 文件空即干净输出根目录默认是/tmp/pgloader/用--root-dir改位置--logfile与--summary分别落日志和汇总报告。v3 与 v4 的命令行和.load语法完全一致区别只在入口是pgloader还是java -jar pgloader.jar。核心工作流四个可直接照抄的数据迁移任务下面四个任务覆盖了绝大多数真实迁移整库搬迁、容错导入、遗留格式、分阶段大表。MySQL 整库迁移结构、数据、索引一次完成任务描述把一个存量 MySQL 库整体搬进 PostgreSQL表结构和索引都要保留。① 写.load文件-- erp.load LOAD DATABASE FROM mysql://userlocalhost:3306/erp INTO postgresql:///erp_new WITH workers 4, -- 4 个并行读端 create tables, create indexes, reset sequences -- 加载后重算序列 CAST type timestamp to timestamptz using zero-dates-to-null, -- 0000-00-00 零日期 → NULL column t.amount to numeric drop not null; -- 放宽与实际数据不符的 NOT NULL② 先干跑验证连接再实跑pgloader --dry-run erp.load # 只校验两端连接不写数据 pgloader erp.load容易踩的坑0000-00-00零日期和smallint unsigned已有默认 cast 规则自己再写显式CAST时注意别把它们覆盖掉。bigint unsigned列会超出 int8 上限存在这类列必须显式加CAST type bigint unsigned to numeric。迁移对象是表、索引、外键、序列存储过程、触发器、函数不在范围内需要单独盘点。常用的内置转换函数速查转换函数作用典型用途zero-dates-to-nullMySQL 零日期转 NULLtimestamp/date 列empty-string-to-null空字符串转 NULL文本列兜底base64-decodebase64 解码为 byteaCSV 里的二进制内容byte-vector-to-hexstring字节转十六进制串uuid/char 列CSV 批量导入坏行不停整场任务描述几千万行 CSV有表头、有空字段导入后坏行要能修复、能重导。① 加载文件LOAD CSV FROM data/sales.csv HAVING FIELDS id, region, sale_date, amount -- 按文件列顺序 INTO postgresql:///sales?tablenamet_sales WITH skip header 1, fields terminated by ,, fields optionally enclosed by , null-if , -- 空字符串按 NULL 处理 on error resume next, -- 坏行进 reject 文件继续加载 batch rows 10000; -- 每万行一批提交控制内存 CAST column amount to numeric using empty-string-to-null; -- 金额空串记为 NULL② 跑完后处理 reject 文件cat /tmp/pgloader/t_sales.reject.csv # 查看被拒行 # 修复坏数据后重跑该 .load先加 WITH truncate 清表容易踩的坑HAVING FIELDS的列顺序以文件为准不是表。表里多出来的列用TARGET COLUMNS指定映射。reject 文件默认落在/tmp/pgloader/表名.reject.csv大数据量时确认这块盘的空间。DBF 与定长文件文件即模式任务描述老系统遗留的 DBase 文件或定长报表没有列名清单结构就藏在文件里。① DBF 直接进# 文件头自带字段定义无需手敲列名 pgloader --type dbf data/DNORDOC.DBF postgresql:///legacy?tablenamet_cust② 定长文件按宽度声明LOAD FIXED FROM data/geo.txt HAVING FIELDS id (10), -- 固定 10 个字符 name (20) INTO postgresql:///geo;容易踩的坑定长(n)按字符计宽不是字节中文多字节环境下先确认文件编码否则整行错位DBF 备注文件.dbt的编码常与主文件不同出现乱码先查编码再查数据。分阶段迁移结构与数据拆成两步任务描述上百 GB、迁移窗口有限先把结构建好数据后跑每一步都可独立重跑。① 只建结构LOAD DATABASE FROM mysql://userlocalhost/erp INTO postgresql:///erp_new WITH schema only; -- 只建表与索引② 只灌数据按主键区间切分并行LOAD DATABASE FROM mysql://userlocalhost/erp INTO postgresql:///erp_new WITH data only, workers 8, rows per range 100000, -- 每张表按主键切 10 万行区间 multiple readers per thread;中断恢复没有内置断点把耗时最长的大表拆成独立LOAD语句中断后只重跑对应语句重跑前加WITH truncate清表避免主键冲突。边界与取舍哪些数据迁移场景该换工具pgloader 是批量迁移工具不是持续同步——和复制类工具分工配合时才最稳。四类场景建议交接持续增量同步pgloader 不做 CDC。标准打法是 pgloader 负责首次全量PostgreSQL 逻辑复制或 Debezium接住后续增量。源端是 Oracle不在支持列表。先用外部表导出成 CSV 再LOAD CSV或换 Oracle 专用工具。pg 到 pgpg_dump/pg_restore更直接保留对象更全pgloader 的价值在异构源。存储过程、触发器、函数不迁移。迁移前盘点清单数据到位后逐个改写为 PL/pgSQL。版本选择上v4 是单 JAR内存用-Xmx调适合大迁移跑爆堆内存的场景v3 是发行版包适合不便装 Java 21 的环境。两者.load语法与命令行一致切换成本低。决策速查按数据量与场景选配置先看源形态、再看体量照抄表中配置再微调。源形态典型体量推荐入口调优要点上线前必查SQLite 单文件10 GB一条命令pgloader app.db postgresql:///newdb默认即可行数比对MySQL 整库10–100 GB.loadworkers 4batch rows 10000零日期、无符号整型列超大表库100 GBrows per rangemultiple readers per threadworkers 8调大-Xmxreject 文件为空CSV 报表任意LOAD CSVon error resume nextnull-if、skip headerreject 修复后重导DBF / 定长任意--type dbf/LOAD FIXED字符宽 vs 字节宽文件编码上线前 Checklist--dry-run验证源与目标连接可达目标存储 ≥ 源体积 2 倍索引与临时空间reject 目录所在盘空间足够行数比对脚本化源 vs 目标按表reset sequences已重算序列权限、search_path、应用连接参数已恢复存储过程与触发器已盘点并有改写计划迁移后旧库保留只读观察应用最后切换日志--logfile与汇总报告--summary是迁移的两个交付物和 reject 文件一起归档作为验收凭证。【免费下载链接】pgloaderMigrate to PostgreSQL in a single command!项目地址: https://gitcode.com/gh_mirrors/pg/pgloader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考