暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pgloader:PostgreSQL 的数据加载神器与异构数据迁移利器

原创 szrsu 2026-04-07
712

在数据库迁移和数据导入场景中,Oracle 用户对 SQL*Loader(sqlldr)一定非常熟悉。它是 Oracle 官方提供的经典批量加载工具,能高效地将外部文件数据导入 Oracle 表,支持复杂格式解析、错误记录、并行加载等特性。

而对于 PostgreSQL 用户来说,也有类似的工具pgloader。它不仅能从 CSV、固定格式文件加载数据,还支持直接从 MySQL、SQLite、MSSQL 等数据库迁移 schema 和数据,利用 PostgreSQL 的 COPY 机制实现高性能导入。

pgloader 的优势在于:自动处理数据类型转换、支持错误继续加载(坏行隔离到单独文件)、并行批量处理、以及丰富的 BEFORE/AFTER 脚本,非常适合大规模数据迁移项目。

本文将详细介绍 pgloader 的安装、RPM 打包构建、以及实际使用案例,帮助你在 PostgreSQL 环境中快速实现高效数据加载。

一、版本下载

pgloader 的官方源码和发布版本可在 GitHub Releases 获取:

  • 下载地址:https://github.com/dimitri/pgloader/releases

推荐下载最新稳定版本的源码(如 pgloader-3.6.9.tar.gz),后续也可以自行构建 RPM 包。

二、生成 RPM 包(适用于 CentOS/RHEL等环境)

在构建环境中准备源码:

# cd /media/pgloader/ # ls # pgloader-3.6.9.tar.gz --安装构建依赖 # yum -y install yum-utils rpmdevtools "Development Tools" # tar -xf pgloader-3.6.9.tar.gz # cd pgloader-3.6.9 # 安装 spec 文件中声明的构建依赖 # yum-builddep pgloader.spec

如果执行 spectool -g -R pgloader.spec 时因网络问题无法从 GitHub 下载源码(报错:Failed connect to github.com:443),可手动处理:

# mkdir -p /root/rpmbuild/SOURCES/ # cd /root/rpmbuild/SOURCES/ -- 将本地源码包复制并重命名为 spec 期望的文件名 cp /media/pgloader/pgloader-3.6.9.tar.gz /root/rpmbuild/SOURCES/v3.6.9.tar.gz

重要注意事项:pgloader 使用 Common Lisp 编写,构建过程依赖 SBCL(Steel Bank Common Lisp)。系统自带的 SBCL 版本过低(如 1.4.x)会导致编译报错,例如:

Symbol "DEFINE-ALIEN-CALLABLE" not found in the SB-ALIEN package.

解决办法是升级到较新版本的 SBCL(推荐 2.x 或更高):

  1. 下载最新 SBCL 源码(以 2.4.0 为例):

    cd /usr/local/src wget https://downloads.sourceforge.net/project/sbcl/sbcl/2.4.0/sbcl-2.4.0-source.tar.bz2 tar -xjf sbcl-2.4.0-source.tar.bz2 cd sbcl-2.4.0
  2. 编译安装(需要旧版 SBCL 作为 bootstrap,如果已卸载可先临时安装):

    yum install sbcl -y # 临时安装旧版引导 ./make.sh --prefix=/usr/local ./install.sh
  3. 替换系统 SBCL:

    mv /usr/bin/sbcl /usr/bin/sbcl.old ln -s /usr/local/bin/sbcl /usr/bin/sbcl sbcl --version # 确认输出 SBCL 2.4.0

完成 SBCL 升级后,回到 pgloader 目录执行打包:

rpmbuild -ba pgloader.spec

打包成功后,在 /root/rpmbuild/RPMS/x86_64/ 目录下即可找到生成的 RPM 包(如 pgloader-3.6.9-22.el7.x86_64.rpm)。

三、RPM 安装与验证

将生成的 RPM 包拷贝到目标机器,使用以下方式安装(会自动解决依赖):

# 直接安装可能报依赖缺失 rpm -ivh pgloader-3.6.9-22.el7.x86_64.rpm # 推荐使用 yum localinstall 自动安装依赖 yum localinstall pgloader-3.6.9-22.el7.x86_64.rpm -y

安装完成后验证:

pgloader -V # 示例输出: # pgloader version "3.6.7~devel" # compiled with SBCL 2.4.0

四、使用示例:从 CSV 文件加载数据到 PostgreSQL

pgloader 支持通过命令行或 .load 脚本文件进行加载。下面以一个简单 CSV 加载案例演示。

1. 创建测试 CSV 文件
mkdir -p /tmp/pgloader_test cat > /tmp/pgloader_test/test_data.csv << 'EOF' id,name,age,email,created_date 1,张三,28,zhangsan@test.com,2024-01-15 2,李四,32,lisi@test.com,2024-01-16 3,王五,25,wangwu@test.com,2024-01-17 4,赵六,30,zhaoliu@test.com,2024-01-18 5,孙七,35,sunqi@test.com,2024-01-19 EOF
2. 创建 pgloader 加载脚本(推荐方式,便于复杂配置)
cat > /tmp/pgloader_test/load_csv_to_pg.load << 'EOF' LOAD CSV FROM '/tmp/pgloader_test/test_data.csv' WITH ENCODING UTF-8 ( id, name, age, email, created_date ) INTO postgresql://testaa:Gbase123456@10.10.10.150:15400/oradb?test_table WITH truncate, -- 先清空目标表 skip header = 1, -- 跳过 CSV 第一行标题(非常关键!) fields terminated by ',', fields optionally enclosed by '"', batch rows = 1000, -- 每批处理行数 batch concurrency = 1 -- 并发批次 SET client_encoding to 'utf8', work_mem to '12MB', standard_conforming_strings to 'on' BEFORE LOAD DO $$ DROP TABLE IF EXISTS test_table; $$, $$ CREATE TABLE test_table ( id INTEGER PRIMARY KEY, name VARCHAR(50), age INTEGER, email VARCHAR(100), created_date DATE ); $$; EOF
3. 执行加载
pgloader /tmp/pgloader_test/load_csv_to_pg.load

成功执行后,会输出类似以下报告(包含加载统计、耗时、错误数等):

2026-04-03T11:55:13.016008+08:00 LOG pgloader version "3.6.7~devel"
...
             table name errors rows bytes total time
----------------------- --------- --------- --------- --------------
  "public"."test_table" 0 5 0.2 kB 0.092s
...
      Total import time ✓ 5 0.2 kB 0.115s

温馨提示

  • 如果目标表已有索引,pgloader 会提示可能影响性能,建议在加载前用 drop indexes 选项或手动临时删除索引,加载后再重建。
  • 对于生产环境的大文件加载,可进一步调整 batch rowsbatch concurrency 等参数以优化性能。
  • pgloader 还支持更多高级功能,如从 MySQL 整库迁移、数据转换规则等,详情可参考官方文档:https://pgloader.readthedocs.io/

通过以上步骤,你就可以在 PostgreSQL 环境中快速搭建起类似 Oracle SQL*Loader 的高效数据加载能力。实际使用中,pgloader 的灵活性和容错性往往能显著提升迁移效率。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论