PostgreSQL pg_bulkload 导出 BINARY 格式数据

1 背景知识

本章介绍如何使用 pg_bulkloadCSV 数据导出为 BANIRY 的格式数据。并将导出的数据进行导入

2 BINARY 数据单进程导出

2.1 上传CSV 文件

isbn.csv 文件为 Zlibrary 的数据库转换后的 CSV 文件。请上传到 /soft 目录。

ls -l /soft/isbn.csv
//屏幕输出:
-rw-r--r-- 1 postgres postgres 253894432 May  2 18:57 /soft/isbn.csv

2.2 创建控制文件

vi /soft/output_baniry_csv.ctl
#
# sample_bin.ctl -- Control file to load fixed binary input data
#
#    Copyright (c) 2007-2024, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
#
WRITER = BINARY                        # [<schema_name>.]table_name
INFILE = /soft/isbn.csv
OUTPUT = /soft/isbn.data

OUT_COL = INTEGER(8)                       # binary integer column (int in C)
OUT_COL = VARCHAR(13)                      # character (10 bytes),

参数说明
对于以上参数详细信息,请参考 pg_bulkload 控制文件参数

参数 说明
OUTPUT /soft/isbn.data 指定导出 BINARY 数据的位置。这里为服务器上文件路径,请参考 PostgreSQL pg_bulkload 控制文件参数#2.4 OUTPUT TABLE
INFILE /soft/isbn.csv 指定要导入的CSV 数据文件,这里使用了绝对路径,请参考PostgreSQL pg_bulkload 控制文件参数#2.2 INPUT INFILE
WRITER BINARY 导出 BINARY 数据。请参考PostgreSQL pg_bulkload 控制文件参数#2.3 WRITER LOADER
OUT_COL INTEGER(8) 指定第一列的数据类型,请参考PostgreSQL pg_bulkload 控制文件参数#4 Binary 导出参数
OUT_COL VARCHAR(13) 指定第二列的数据类型,请参考PostgreSQL pg_bulkload 控制文件参数#4 Binary 导出参数

2.3 导出二进制数据

  1. 清理服务器环境,删除多余的文件。
rm -rf /soft/isbn.data /soft/isbn.data.ctl  /soft/isbn.data.log
  1. 调用 pg_bulkload 将CSV 数据导出为 BANIRAY 格式。
time pg_bulkload -U postgres -d testdb /soft/output_baniry_csv.ctl
  1. 导出所耗费时间为 4.569s
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    0m4.569s
user    0m0.003s
sys     0m0.006s
Note

执行命令后会自动生成2个文件:

  1. isbn.data.ctl 用于导入 BINARY 格式数据 控制文件。
  2. isbn.data 用于导入 BINARY 格式数据 的数据文件。
ls -ltra isbn.*
-rw-r--r-- 1 postgres postgres 253894432 Mar  6 15:12 isbn.csv
-rw------- 1 postgres postgres       393 May  7 16:30 isbn.data.ctl
-rw------- 1 postgres postgres 255799131 May  7 16:30 isbn.data

3 BINARY 数据并发导出

3.1 上传CSV 文件

isbn.csv 文件为 Zlibrary 的数据库转换后的 csv 文件。请上传到 /soft 文件夹。

ls -l /soft/isbn.csv
//屏幕输出:
-rw-r--r-- 1 postgres postgres 253894432 May  2 18:57 /soft/isbn.csv

3.2 创建控制文件

vi /soft/output_baniry_csv.ctl
#
# sample_bin.ctl -- Control file to load fixed binary input data
#
#    Copyright (c) 2007-2024, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
#
WRITER = BINARY                     
MULTI_PROCESS = YES
INFILE = /soft/isbn.csv
OUTPUT = /soft/isbn.data

OUT_COL = INTEGER(8)                       # binary integer column (int in C)
OUT_COL = VARCHAR(13)                      # character (10 bytes),

参数说明

对于以上参数详细信息,请参考 pg_bulkload 控制文件参数

参数 说明
OUTPUT /soft/isbn.data 指定导出 BINARY 数据的位置。这里为服务器上文件路径,请参考 PostgreSQL pg_bulkload 控制文件参数#2.4 OUTPUT TABLE
INFILE /soft/isbn.csv 指定要导入的CSV 数据文件,这里使用了绝对路径,请参考 PostgreSQL pg_bulkload 控制文件参数#2.2 INPUT INFILE
WRITER BINARY 导出 BINARY 数据。请参考 PostgreSQL pg_bulkload 控制文件参数#2.3 WRITER LOADER
OUT_COL INTEGER(8) 指定第一列的数据类型,请参考 PostgreSQL pg_bulkload 控制文件参数#4 Binary 导出参数
OUT_COL VARCHAR(13) 指定第二列的数据类型,请参考 PostgreSQL pg_bulkload 控制文件参数#4 Binary 导出参数
MULTI_PROCESS YES 指定是否开启并发导出,请参考 PostgreSQL pg_bulkload 控制文件参数#2.18 MULTI_PROCESS

3.3 导出二进制数据

  1. 清理环境。
rm -rf /soft/isbn.data /soft/isbn.data.ctl  /soft/isbn.data.log
  1. 调用 pg_bulkload 将CSV 数据导出为 BANIRAY 格式。
time pg_bulkload -U postgres -d testdb /soft/output_baniry_csv.ctl
  1. 导出所耗费时间为 3.845s
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    0m4.043s
user    0m0.003s
sys     0m0.004s

4 小结 & FAQ

4.1 isbn.data.ctl 文件解读

这里是使用 pg_bulkload 导出的控制文件,在未来可以在导入 BINARY 格式数据中使用。

其中的参数说明。请参考 pg_bulkload 控制文件参数

INPUT = /soft/isbn.data
OUTPUT = 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 = NO
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 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 YES 指定是否开启并发导出,请参考 PostgreSQL pg_bulkload 控制文件参数#2.18 MULTI_PROCESS
VERBOSE NO 指定日志的打印级别,请参考 PostgreSQL pg_bulkload 控制文件参数#VERBOSE
TRUNCATE NO 指定导入之前是否要清空表数据。请参考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