瀚高数据库
目录
环境
文档用途
详细信息
环境
系统平台:Linux x86-64 Red Hat Enterprise Linux 7
版本:12
文档用途
本文档主要介绍pg_bulkload插件的安装与使用。
详细信息
研发公司:NTT OSS Center DBMS Development and Support Team,与pg_rman出自相同开发者
license协议:BSD
一、pg_bulkload安装
有从源码安装和rpm安装两种方式,这里仅采用README.md中给出的源码安装。
1.安装前提:提前安装好pg数据库并初始化数据目录。
此外,官方文档还给出了需求库:
PostgreSQL devel package : postgresqlxx-devel(RHEL), postgresql-server-dev-x.x(Ubuntu)
PAM devel package : pam-devel(RHEL), libpam-devel(Ubuntu)
Readline devel or libedit devel package : readline-devel or libedit-devel(RHEL), libreadline-dev or libedit-dev(Ubuntu)
C compiler and build utility : "Development Tools" (RHEL), build-essential(Ubuntu)
2.安装步骤:
1)下载安装包:
git clone https://github.com/ossc-db/pg_bulkload.git
[postgres@pg-bulkload opt]$ ll
total 19896
drwxr-xr-x 11 postgres postgres 4096 Oct 27 15:28 pg_bulkload
2)进入目录并编译安装:
cd pg_bulkload
make
make install
注意:编译时需要读取pg_config来获取pg的环境变量,使用root编译时需要环境变量里配上能找到pg_config的路径,也可以将目录的所有者更改为postgres再进行安装。
3)创建extension:
[postgres@pg-bulkload pg_bulkload]$ psql
psql (12.2)
Type "help" for help.
postgres=# CREATE EXTENSION pg_bulkload;
CREATE EXTENSION
二、pg_bulkload使用
pg_bulkload有两种导入数据的方法,通过参数导入和通过控制文件导入。
创建要导入的测试数据
seq 100000| awk '{print $0"|postgres"}' > tbl_test_output.txt
文件内容
[postgres@pg-bulkload pg_bulkload]$ cat tbl_test_output.txt
1|postgres
2|postgres
3|postgres
4|postgres
......
99998|postgres
99999|postgres
100000|postgres
1.使用参数方式导入
1)创建测试表
postgres=# create table tbl_test(id int,name text);
CREATE TABLE
2)导入命令语法
pg_bulkload -i [源数据] -O [目标表] -l [输出日志] -o [控制文件中的选项] -o [控制文件中的选项]
-i 输入
从中加载数据的源。与控制文件中的“ INPUT ”相同。
-O 输出
将数据加载到的目标。与控制文件中的“ OUTPUT ”相同。
-l日志文件
写入结果日志的路径。与控制文件中的“ LOGFILE ”相同。
-P PARSE_BADFILE
写入无法正确解析的坏记录的路径。与控制文件中的“ PARSE_BADFILE ”相同。
-u DUPLICATE_BADFILE
在索引重建期间写入与唯一约束冲突的坏记录的路径。与控制文件中的“ DUPLICATE_BADFILE ”相同。
-o "key=val"
控制文件中可用的任何选项,可传递多个选项。
-d 数据库名
指定要连接的数据库的名称。如果未指定,则从环境变量PGDATABASE中读取数据库名称。如果未设置,则使用为连接指定的用户名。
-h 主机
指定运行服务器的机器的主机名。如果该值以斜杠开头,则它用作Unix域套接字的目录。
-p 端口
指定服务器正在侦听连接的TCP端口或本地Unix域套接字文件扩展名。
-U 用户名
要连接的用户名。
-W 密码
强制pg_bulkload在连接到数据库之前提示输入密码。
这个选项不是必需的,因为如果服务器要求密码认证,pg_bulkload会自动提示输入密码。但是,vacuumdb会浪费一次连接尝试服务器是否需要密码。在某些情况下,输入-W可以避免额外的连接尝试。
-e
发送到服务器的回显命令。
-E
从 DEBUG、INFO、NOTICE、WARNING、ERROR、LOG、FATAL 和PANIC中选择输出消息级别。默认值为INFO。
3)执行导入命令
[postgres@pg-bulkload pg_bulkload]$ pg_bulkload -i /usr/local/pgsql/data/pg_bulkload/tbl_test_output.txt -O tbl_test -l /usr/local/pgsql/data/pg_bulkload/tbl_test_output.log -o "TYPE=CSV" -o "DELIMITER=|"
NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
0 Rows skipped.
100000 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.
4)查看日志文件
[postgres@pg-bulkload pg_bulkload]$ cat tbl_test_output.log
pg_bulkload 3.1.19 on 2021-10-27 16:25:42.045267+08
INPUT = /usr/local/pgsql/data/pg_bulkload/tbl_test_output.txt
PARSE_BADFILE = /usr/local/pgsql/data/pg_bulkload/20211027162542_postgres_public_tbl_test.prs.txt
LOGFILE = /usr/local/pgsql/data/pg_bulkload/tbl_test_output.log
LIMIT = INFINITE
PARSE_ERRORS = 0
CHECK_CONSTRAINTS = NO
TYPE = CSV
SKIP = 0
DELIMITER = |
QUOTE = "\""
ESCAPE = "\""
NULL =
OUTPUT = public.tbl_test
MULTI_PROCESS = NO
VERBOSE = NO
WRITER = DIRECT
DUPLICATE_BADFILE = /usr/local/pgsql/data/pg_bulkload/20211027162542_postgres_public_tbl_test.dup.csv
DUPLICATE_ERRORS = 0
ON_DUPLICATE_KEEP = NEW
TRUNCATE = NO
0 Rows skipped.
100000 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.
Run began on 2021-10-27 16:25:42.045267+08
Run ended on 2021-10-27 16:25:42.098395+08
CPU 0.00s/0.04u sec elapsed 0.05 sec
2.使用控制文件方式导入(csv格式)
1)创建控制文件
[postgres@pg-bulkload pg_bulkload]$ touch test1.ctl
2)控制文件内容
INPUT = /usr/local/pgsql/data/pg_bulkload/tbl_test_output.txt#要从中加载数据的源
PARSE_BADFILE = /usr/local/pgsql/data/pg_bulkload/test1_bad.txt#写入无法正确解析的坏记录的路径
LOGFILE = /usr/local/pgsql/data/pg_bulkload/test1_output.log#写入结果日志的路径
LIMIT = INFINITE#要加载的行数
PARSE_ERRORS = 0#在分析、编码检查、编码转换、筛选函数、检查约束检查、非空检查或数据类型转换期间引发错误的传入元组数。
CHECK_CONSTRAINTS = NO#指定在加载过程中是否检查CHECK约束
TYPE = CSV#输入数据的类型
SKIP = 1000#跳过的输入行数
DELIMITER = |#分隔文件每行中的列的单ASCII字符
QUOTE = "\""#指定ASCII引号字符
ESCAPE = "\""#指定应出现在QUOTE数据字符值之前的ASCII字符
OUTPUT = public.tbl_test1#要将数据加载到的目标
MULTI_PROCESS = NO#是否使用多线程并行对数据进行读取、解析和写入
WRITER = DIRECT#加载数据的方法
DUPLICATE_BADFILE = /usr/local/pgsql/data/pg_bulkload/test1.dup.csv#在索引重建期间写入与唯一约束冲突的坏记录的路径
DUPLICATE_ERRORS = 0#违反唯一约束的传入元组数
ON_DUPLICATE_KEEP = NEW#指定如何处理违反唯一约束的元组
TRUNCATE = YES#指定是否清除目标表中的所有行
3)导入命令语法
pg_bulkload + 控制文件名称
4)新建表并插入一条数据
[postgres@pg-bulkload pg_bulkload]$ psql
psql (12.2)
Type "help" for help.
postgres=# create table tbl_test1(id int,name text);
CREATE TABLE
postgres=# insert into tbl_test1 values (2021,'test');
INSERT 0 1
postgres=# select * from tbl_test1 ;
id | name
------+------
2021 | test
(1 row)
5)执行控制文件
[postgres@pg-bulkload pg_bulkload]$ vim test1.ctl
[postgres@pg-bulkload pg_bulkload]$ pg_bulkload ./test1.ctl
NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
1000 Rows skipped.
99000 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.
6)查询验证
postgres=# select * from tbl_test1 ;
id | name
--------+----------
1001 | postgres
1002 | postgres
1003 | postgres
1004 | postgres
1005 | postgres
1006 | postgres
......
postgres=# select * from tbl_test1 where id = 2021;
id | name
------+----------
2021 | postgres
(1 row)
通过上述结果可以看到,在控制文件中配置参数跳过前1000行并对表先进行truncate操作,导入数据时执行了文件中的配置。
有关具体的参数信息和控制文件可配内容选项,查阅官方文档
http://ossc-db.github.io/pg_bulkload/pg_bulkload.html