数据加载工具pg_bulkload插件的介绍

发布于:2024-08-13 ⋅ 阅读:(96) ⋅ 点赞:(0)

瀚高数据库
目录
环境
文档用途
详细信息

环境
系统平台: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


网站公告

今日签到

点亮在社区的每一天
去签到