PostgreSQL pg_bulkload 导入 BINARY 格式数据

1 背景知识

本章主要介绍如何使用 pg_bulkload 导入自定义生成的BINARY数据

2 BINARY 格式数据单进程导入

2.1 上传 BINARY 格式数据

isbn.data 文件为导出 BINARY 格式数据所生成的 BINARY 格式数据文件,请上传到 /soft 目录。

ls -l /soft/isbn.data
//屏幕输出:
-rw------- 1 postgres postgres 255799131 May  7 16:32 /soft/isbn.data

2.2 创建表

创建用于装载 BINARY 数据的表 isbn

psql -U postgres -d testdb
DROP SCHEMA IF EXISTS zlibrary CASCADE;
CREATE SCHEMA zlibrary;

CREATE TABLE zlibrary.isbn (
    zlibrary_id integer NOT NULL,
    isbn character varying(13) NOT NULL
);


ALTER TABLE ONLY zlibrary.isbn
    ADD CONSTRAINT "PRIMARY_9E9D7BB2" PRIMARY KEY (zlibrary_id, isbn);


ALTER TABLE ONLY zlibrary.isbn
    ADD CONSTRAINT "isbn_id_2E99E8E3" UNIQUE (isbn, zlibrary_id);

2.3 创建控制文件

上传数据加载的控制文件 isbn.data.ctl 。此文件由导出 BINARY 格式数据生成,并修改为如下。

su - postgres 
vi /soft/isbn.data.ctl 
INPUT = /soft/isbn.data
OUTPUT = zlibrary.isbn
LOGFILE = /soft/isbn.data.log
PARSE_BADFILE = /soft/isbn.data.prs
DUPLICATE_BADFILE = /soft/isbn.data.dup
PARSE_ERRORS = INFINITE
DUPLICATE_ERRORS = 0
ON_DUPLICATE_KEEP = NEW
SKIP = 0
LIMIT = INFINITE
CHECK_CONSTRAINTS = NO
MULTI_PROCESS = NO
VERBOSE = NO
TRUNCATE = YES
WRITER = DIRECT
TYPE = BINARY
COL = BIGINT (8)
COL = VARCHAR (13)
# ENCODING = UTF8
参数 说明
INTPUT /soft/isbn.data 指定BINARY 数据文件位置。这里为服务器上文件路径,请参考 PostgreSQL pg_bulkload 控制文件参数#2.2 INPUT INFILE
OUTPUT zlibrary.isbn 指定导入表的名称。默认未指定模式名,请参考 PostgreSQL pg_bulkload 控制文件参数#2.4 OUTPUT TABLE
LOGFILE /soft/isbn.data.log 指定导入过程中的日志文件,请参考 PostgreSQL pg_bulkload 控制文件参数#2.13 LOGFILE
PARSE_BADFILE /soft/isbn.data.prs 指定无法解析的损坏记录的日志文件,请参考 PostgreSQL pg_bulkload 控制文件参数#2.14 PARSE_BADFILE
DUPLICATE_BADFILE /soft/isbn.data.dup 指定发生唯一键冲突的记录的日志文件,请参考 PostgreSQL pg_bulkload 控制文件参数#2.15 DUPLICATE_BADFILE
PARSE_ERRORS INFINITE 指定无法解析的损坏记录的错误上限,请参考 PostgreSQL pg_bulkload 控制文件参数#2.10 PARSE_ERRORS
DUPLICATE_ERRORS 0 指定发生唯一键冲突记录的错误上限,请参考 PostgreSQL pg_bulkload 控制文件参数#2.11 DUPLICATE_ERRORS
ON_DUPLICATE_KEEP NEW 指定发生唯一键冲突记录的动作,NEW 表示删除旧数据,保留新数据,请参考 PostgreSQL pg_bulkload 控制文件参数#2.12 ON_DUPLICATE_KEEP
SKIP 0 指定数据的偏移量,请参考 PostgreSQL pg_bulkload 控制文件参数#2.5 SKIP OFFSET
LIMIT INFINITE 指定导入数据的限制,请参考 PostgreSQL pg_bulkload 控制文件参数#2.6 LIMIT LOAD
CHECK_CONSTRAINTS NO 指定是否生效检查约束,请参考 PostgreSQL pg_bulkload 控制文件参数#2.9 CHECK_CONSTRAINTS
MULTI_PROCESS NO 指定是否开启并发导出,请参考 PostgreSQL pg_bulkload 控制文件参数#2.18 MULTI_PROCESS
VERBOSE NO 指定日志的打印级别,请参考 PostgreSQL pg_bulkload 控制文件参数#VERBOSE
TRUNCATE YES 指定导入之前是否要清空表数据。请参考 PostgreSQL pg_bulkload 控制文件参数#2.16 TRUNCATE
WRITER DIRECT 导出 BINARY 数据。请参考 PostgreSQL pg_bulkload 控制文件参数#2.3 WRITER LOADER
COL INTEGER(8) 指定第一列的数据类型,请参考 PostgreSQL pg_bulkload 控制文件参数#4 Binary 导出参数
COL VARCHAR(13) 指定第二列的数据类型,请参考 PostgreSQL pg_bulkload 控制文件参数#4 Binary 导出参数
ENCODING UTF8 指定导入的数据的字符集,请参考 PostgreSQL pg_bulkload 控制文件参数#2.7 ENCODING

2.4 导入数据

单进程导入数据的耗时为 1m13.846s

time pg_bulkload -U postgres -d testdb isbn.data.ctl
NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
       0 Rows skipped.
       12180911 Rows successfully loaded.
       0 Rows not loaded due to parse errors.
       0 Rows not loaded due to duplicate errors.
       0 Rows replaced with new rows.

real   1m13.846s
user   0m0.001s
sys    0m0.010s

3 BINARY 格式数据并发导入

3.1 上传 BINARY 格式数据

isbn.data 文件为导出 BINARY 格式数据生成的 BINARY 格式数据,请上传到 /soft 文件夹。

ls /soft/isbn.data

3.2 创建控制文件

上传数据加载的控制文件 isbn.data.ctl 。此文件由导出 BINARY 格式数据生成,并参数修改为 MULTI_PROCESS = YES

su - postgres 
vi /soft/isbn.data.ctl 
INPUT = /soft/isbn.data
OUTPUT = zlibrary.isbn
LOGFILE = /soft/isbn.data.log
PARSE_BADFILE = /soft/isbn.data.prs
DUPLICATE_BADFILE = /soft/isbn.data.dup
PARSE_ERRORS = INFINITE
DUPLICATE_ERRORS = 0
ON_DUPLICATE_KEEP = NEW
SKIP = 0
LIMIT = INFINITE
CHECK_CONSTRAINTS = NO
MULTI_PROCESS = YES
VERBOSE = NO
TRUNCATE = YES
WRITER = DIRECT
TYPE = BINARY
COL = BIGINT (8)
COL = VARCHAR (13)
# ENCODING = UTF8

3.3 配置 .pgpass 文件

vi ~/.pgpass
//输入内容:
*:*:*:postgres:postgres

对于如何配置请参考 .pgpass

3.4 导入数据

time pg_bulkload -U postgres -d postgres isbn.data.ctl
NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
       0 Rows skipped.
       12180911 Rows successfully loaded.
       0 Rows not loaded due to parse errors.
       0 Rows not loaded due to duplicate errors.
       0 Rows replaced with new rows.

real   1m13.344s
user   0m0.002s
sys    0m0.006s

4 导入数据将会维护索引

导入数据后请查看索引的详细信息。发现数据量为 471MB

\x
\di+ zlibrary."isbn_id_2E99E8E3" 
List of relations
-[ RECORD 1 ]-+-----------------
Schema        | zlibrary
Name          | isbn_id_2E99E8E3
Type          | index
Owner         | postgres
Table         | isbn
Persistence   | permanent
Access method | btree
Size          | 471 MB
Description   |

5 参考链接

pg_bulkload (ossc-db.github.io)