在数据库迁移和数据导入场景中,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 或更高):
-
下载最新 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 -
编译安装(需要旧版 SBCL 作为 bootstrap,如果已卸载可先临时安装):
yum install sbcl -y # 临时安装旧版引导 ./make.sh --prefix=/usr/local ./install.sh -
替换系统 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 rows、batch concurrency等参数以优化性能。 - pgloader 还支持更多高级功能,如从 MySQL 整库迁移、数据转换规则等,详情可参考官方文档:https://pgloader.readthedocs.io/
通过以上步骤,你就可以在 PostgreSQL 环境中快速搭建起类似 Oracle SQL*Loader 的高效数据加载能力。实际使用中,pgloader 的灵活性和容错性往往能显著提升迁移效率。




