
pgloader数据迁移实战5步完成MySQL与SQLite到PostgreSQL的搬迁【免费下载链接】pgloaderMigrate to PostgreSQL in a single command!项目地址: https://gitcode.com/gh_mirrors/pg/pgloader深夜十一点你盯着屏幕上满屏的红色报错第 5 次重跑数据导入脚本只因为源文件里混进了几行脏数据整个批次又被 PostgreSQL 的 COPY 命令原地打断。如果你正在用 PostgreSQL却还没听说过pgloader 数据迁移工具那今天的文章就是为你准备的它会用一条命令把这种噩梦变成三分钟的顺风局。一句话破题pgloader 到底是什么pgloader 是专为 PostgreSQL 设计的数据加载与迁移工具主打口号是Migrate to PostgreSQL in a single command!——用一条命令完成迁移。它能从 MySQL、SQLite、SQL Server 等数据库以及 CSV、DBF、固定宽度文件等多种来源读取数据再通过 PostgreSQL 的 COPY 协议高速灌入目标库。它最核心的杀手锏是智能错误处理默认的 PostgreSQL COPY 行为是全有或全无一行出错就整表回滚而 pgloader 会把坏行单独写进 reject 文件好数据继续前进迁移不因个别脏数据而停摆。三步搞定环境搭建第一步安装。Debian/Ubuntu 用户可以直接apt-get install pgloaderv3 版本想尝鲜最新版可以从源码编译git clone https://gitcode.com/gh_mirrors/pg/pgloader cd pgloader make编译产物在./build/bin/目录。值得一提的是项目正在推进 v4 重构版用 Clojure 重写、打包成单个 JAR只需要 Java 21 运行时无需任何原生依赖用标准的-Xmx参数就能调堆内存大迁移不再有内存耗尽焦虑。第二步准备目标库。给迁移建一个空数据库createdb newdb第三步跑第一条命令。拿项目自带的 SQLite 测试库试水pgloader ./test/sqlite/sqlite.db postgresql:///newdb预期结果终端里滚动出类似下面这样的表格——每个表一行列出错误数、行数、字节数和耗时最后一行给出总计。table name │ errors │ rows │ bytes │ total time ────────────┼────────┼──────┼───────┼─────────── album │ 0 │ 347 │ 21 kB │ 0.014s ...看到Total import time那一行恭喜你第一条迁移已经完成。实战走一遍两个最具代表性的场景场景一整库搬迁 MySQL → PostgreSQL这是 pgloader 最拿手的活儿。执行前它会自动连接 MySQL、抓取元数据表结构、索引、外键、注释做类型映射后再并行搬数据createdb pagila pgloader mysql://userlocalhost/sakila postgresql:///pagila光这一条命令表结构、索引、外键、自增序列就全给你安排明白了。它还内置了数据整形能力比如把 MySQL 的 0000-00-00 这种不合法日期自动转成 PostgreSQL 的 NULL——因为我们的日历里从来没有第 0 年。场景二CSV 文件导入带转换CSV 场景在命令行就能全权指挥不需要写配置文件pgloader --type csv \ --field id,name,email,created_at \ --with truncate \ --with fields terminated by , \ data.csv postgresql:///mydb?tablenameusers注意目标连接串里的?tablenameusers它指定数据要落进哪张表。另外pgloader 还支持从标准输入读数据于是你可以用 Unix 管道把网络上下载的压缩包直接流式导入一气呵成gunzip -c source.csv.gz | pgloader --type csv ... - pgsql:///target?tablenamefoo进阶技巧让迁移又快又稳的三个开关1. 用 .load 配置文件管理复杂任务。当规则变多命令行就装不下了。pgloader 提供了一套 SQL 风格的 DSL领域专属语言把规则写进my.load文件LOAD DATABASE FROM mysql://user:passlocalhost/source_db INTO postgresql://user:passlocalhost/target_db WITH include drop, create tables, create indexes, reset sequences, foreign keys, workers 4, concurrency 2 SET work_mem to 32MB, maintenance_work_mem to 64MB CAST type datetime to timestamptz, type date drop not null drop default using zero-dates-to-null BEFORE LOAD DO $$ create schema if not exists target_schema; $$;WITH段控制迁移行为比如include drop表示可重复执行先删后建SET段给 PostgreSQL 会话设参数CAST段定义类型转换规则BEFORE/AFTER LOAD DO在加载前后执行 SQL比如建 schema、跑analyze。项目里现成的示例非常多比如test/sqlite-chinook.load就是一套教科书式配置抄来改改就能用。2. 并行与批量调优。迁移大库时这四个参数是收益最高的调节旋钮参数作用建议workers 8工作线程数按 CPU 核数调整concurrency 4并发连接数别超过 PostgreSQL 连接上限batch rows 50000每批行数大表加大减少网络往返prefetch rows预取行数让流水线不空转打个比方批量加载就像流水线传送带batch rows决定每个托盘装多少件货prefetch决定传送带前方堆多少件备货调好了整条线就不会停顿。3. 迁移前先体检。用--dry-run只检查连接和配置、不实际加载用--on-error-stop在严格场景下遇错即停用--summary report.txt把统计结果落盘归档。避坑清单新手最容易踩的 5 个坑坑现象解法忘了建目标库连接报错先createdb再迁移CSV 没指定表名报无法确定目标表目标串加?tablenamexxx编码乱码中文变???--encoding latin1或SET client_encoding目标表已存在且不想清空主键冲突WITH truncate或include drop想严格把关坏行悄悄跳过加--on-error-stop或设on error stop另外记住被拒绝的坏行不会丢pgloader 会生成一对reject.dat原始数据和reject.log错误原因迁移完记得去核对这两份文件把脏数据修好再补导。量化对比它凭什么比 COPY 好用维度pgloader传统 COPY单行错误隔离坏行继续加载 ✅整批回滚 ❌数据源数据库 文件共 8 种 ✅基本只有 CSV ✅/❌建表建索引自动发现并创建 ✅需手工预处理 ❌类型转换内置规则 自定义 CAST ✅需提前清洗 ❌并行度workers concurrency ✅有限 ⚠️一句话总结COPY 是搬运工pgloader 是带装修队的搬家公司——不仅搬得快还把水电布线索引、外键、序列全给接通了。生态与延伸从哪儿继续挖官方文档docs/quickstart.rst 三分钟上手docs/command.rst 是命令 DSL 全量参考各数据源手册docs/ref/csv.rst、docs/ref/mysql.rst、docs/ref/sqlite.rst示例配置test/ 目录下全是真实可跑的.load文件对应每种来源类型核心源码src/load/migrate-database.lisp迁移总编排、src/pg-copy/copy-retry-batch.lisp坏行二分定位重试、src/utils/transforms.lisp转换函数库写在最后数据迁移从来不该是加班夜的独角戏。pgloader 的价值不只是快而是把出错时该怎么办这个问题替你兜住了底——这恰恰是生产环境里最贵的部分。去test/目录挑一个离你场景最近的示例改两行连接串跑起来吧。试完如果遇到有意思的坑欢迎回来聊聊你是怎么绕过去的。【免费下载链接】pgloaderMigrate to PostgreSQL in a single command!项目地址: https://gitcode.com/gh_mirrors/pg/pgloader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考