1. https://www.jianshu.com/p/b576207f2f3c

1. pg_bulkload介绍

PostgreSQL提供了一个copy命令的便利数据加载工具,copy命令源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载。pg_bulkload是一种用于PostgreSQL的高速数据加载工具,相比copy命令。最大的优势就是速度。优势在让我们跳过shared buffer,wal buffer。直接写文件。pg_bulkload的direct模式就是这种思路来实现的,它还包含了数据恢复功能,即导入失败的话,需要恢复

2. pg_bulkload架构图

pg_bulkload主要包括两个模块:reader和writer。reader负责读取文件、解析tuple,writer负责把解析出的tuple写入输出源中。pg_bulkload最初的版本功能很简单,只是加载数据。3.1版本增加了数据过滤的功能。

 
pg_bulkload.png

3. pg_bulkload安装

该工具不是PostgreSQL系统自带;需要下载安装;

  1. [root@Postgres201 ~]# unzip pg_bulkload-VERSION3_1_10.zip
  2. [root@Postgres201 ~]# cd pg_bulkload-VERSION3_1_10
  3. [root@Postgres201 pg_bulkload-VERSION3_1_10]# make
  4. [root@Postgres201 pg_bulkload-VERSION3_1_10]# make install

安装完成;要使用它需要建extension

  1. [postgres@Postgres201 ~]$ psql lottu lottu
  2. psql (9.6.0)
  3. Type "help" for help.
  4. lottu=# create extension pg_bulkload;
  5. CREATE EXTENSION

4. pg_bulkload参数和控制文件

  1. [postgres@Postgres201 ~]$ pg_bulkload --help
  2. pg_bulkload is a bulk data loading tool for PostgreSQL
  3. Usage:
  4. Dataload: pg_bulkload [dataload options] control_file_path
  5. Recovery: pg_bulkload -r [-D DATADIR]
  6. Dataload options:
  7. -i, --input=INPUT INPUT path or function
  8. -O, --output=OUTPUT OUTPUT path or table
  9. -l, --logfile=LOGFILE LOGFILE path
  10. -P, --parse-badfile=* PARSE_BADFILE path
  11. -u, --duplicate-badfile=* DUPLICATE_BADFILE path
  12. -o, --option="key=val" additional option
  13. Recovery options:
  14. -r, --recovery execute recovery
  15. -D, --pgdata=DATADIR database directory
  16. Connection options:
  17. -d, --dbname=DBNAME database to connect
  18. -h, --host=HOSTNAME database server host or socket directory
  19. -p, --port=PORT database server port
  20. -U, --username=USERNAME user name to connect as
  21. -w, --no-password never prompt for password
  22. -W, --password force password prompt
  23. Generic options:
  24. -e, --echo echo queries
  25. -E, --elevel=LEVEL set output message level
  26. --help show this help, then exit
  27. --version output version information, then exit

除了在命令行上指定参数外,还可以在控制文件中指定参数,下面介绍控制文件里的参数。

  1. TYPE=CSV|BINARY|FIXED|FUNCTION:输入数据的类型,默认是CSV。
    CSV:从CSV格式的文本文件里加载数据。
    BINARY|FIXED:从二进制文件里加载数据。
    FUNCTION:从函数输出中加载数据。
  2. INPUT|INFILE=path|stdin|function_name: 数据源,必须指定,类型不同,它的值不一样
    path:此处就是路径,可以是相对路径,pg服务器必须有读文件的权限
    stdin:pg_bulkload将从标准输入读取数据。
    SQL FUNCTION:指定SQL函数,用这个函数返回插入数据,可以是内建的函数,也可以是用户自定义的函数
  3. WRITER=DIRECT|PARALLEL|BUFFERED|BINARY:加载数据的方式,默认是DIRECT
    DIRECT:直接把数据写入表中,绕过了共享内存并且不写日志,需要提供恢复函数。
    BUFFERED:把数据写入共享内存,写日志,利用pg的恢复机制。
    PARALLEL:并行处理模式,速度比DIRECT更快
    BINARY:把输入数据转换成二进制数据,然后加载。
  4. OUTPUT|TABLE=table_name|outfile 输出源,即把数据导到哪里。
    表:把数据导入到数据库的表里。
    文件:指定文件的路径,把数据导入到文件里。
  5. LOGFILE=path 日志文件的路径 ,执行过程中会记录状态。
  6. MULTI_PROCESS=YES|NO 若设置了此值,会开启多线程模式,并行处理数据导入。若没设置,单线程模式,默认模式是单线程模式。
  7. SKIP|OFFSET=n 跳过的行数,默认是0,不能跟"TYPE=FUNCTION"同时设置。
  8. LIMIT|LOAD 限制加载的行数,默认是INFINITE,即加载所有数据,这个选项可以与"TYPE=FUNCTION"同时设置。
  9. ON_DUPLICATE_KEEP = NEW | OLD 对表存在唯一约束是保留最新的记录还是现有的记录
  10. PARSE_BADFILE = path 用来记录写入所有失败的记录。
  11. TRUNCATE = YES | NO 用来truncate目标表现有所有的记录。
  12. DELIMITER = delimiter_character 文件的分隔符

5. pg_bulkload的使用

创建测试表tbl_lottu和测试文件tbl_lottu_output.txt

  1. [postgres@Postgres201 ~]$ psql lottu lottu
  2. psql (9.6.0)
  3. Type "help" for help.
  4. lottu=# create table tbl_lottu(id int,name text);
  5. CREATE TABLE
  6. [postgres@Postgres201 ~]$ seq 100000| awk '{print $0"|lottu"}' > tbl_lottu_output.txt
  1. 不使用控制文件使用参数
  1. [postgres@Postgres201 ~]$ pg_bulkload -i /home/postgres/tbl_lottu_output.txt -O tbl_lottu -l /home/postgres/tbl_lottu_output.log -P /home/postgres/tbl_lottu_bad.txt -o "TYPE=CSV" -o "DELIMITER=|" -d lottu -U lottu
  2. NOTICE: BULK LOAD START
  3. NOTICE: BULK LOAD END
  4. 0 Rows skipped.
  5. 100000 Rows successfully loaded.
  6. 0 Rows not loaded due to parse errors.
  7. 0 Rows not loaded due to duplicate errors.
  8. 0 Rows replaced with new rows.
  9. [postgres@Postgres201 ~]$ cat tbl_lottu_output.log
  10. pg_bulkload 3.1.9 on 2018-07-12 13:37:18.326685+08
  11. INPUT = /home/postgres/tbl_lottu_output.txt
  12. PARSE_BADFILE = /home/postgres/tbl_lottu_bad.txt
  13. LOGFILE = /home/postgres/tbl_lottu_output.log
  14. LIMIT = INFINITE
  15. PARSE_ERRORS = 0
  16. CHECK_CONSTRAINTS = NO
  17. TYPE = CSV
  18. SKIP = 0
  19. DELIMITER = |
  20. QUOTE = "\""
  21. ESCAPE = "\""
  22. NULL =
  23. OUTPUT = lottu.tbl_lottu
  24. MULTI_PROCESS = NO
  25. VERBOSE = NO
  26. WRITER = DIRECT
  27. DUPLICATE_BADFILE = /data/postgres/data/pg_bulkload/20180712133718_lottu_lottu_tbl_lottu.dup.csv
  28. DUPLICATE_ERRORS = 0
  29. ON_DUPLICATE_KEEP = NEW
  30. TRUNCATE = NO
  31. 0 Rows skipped.
  32. 100000 Rows successfully loaded.
  33. 0 Rows not loaded due to parse errors.
  34. 0 Rows not loaded due to duplicate errors.
  35. 0 Rows replaced with new rows.
  36. Run began on 2018-07-12 13:37:18.326685+08
  37. Run ended on 2018-07-12 13:37:18.594494+08
  38. CPU 0.14s/0.07u sec elapsed 0.27 sec
  1. 导入之前先清理表数据
  1. [postgres@Postgres201 ~]$ pg_bulkload -i /home/postgres/tbl_lottu_output.txt -O tbl_lottu -l /home/postgres/tbl_lottu_output.log -P /home/postgres/tbl_lottu_bad.txt -o "TYPE=CSV" -o "DELIMITER=|" -o "TRUNCATE=YES" -d lottu -U lottu
  2. NOTICE: BULK LOAD START
  3. NOTICE: BULK LOAD END
  4. 0 Rows skipped.
  5. 100000 Rows successfully loaded.
  6. 0 Rows not loaded due to parse errors.
  7. 0 Rows not loaded due to duplicate errors.
  8. 0 Rows replaced with new rows.
  9. [postgres@Postgres201 ~]$ psql lottu lottu -c "select count(1) from tbl_lottu;"
  10. count
  11. --------
  12. 100000
  13. (1 row)
  1. 使用控制文件
    新建控制文件lottu.ctl
  1. INPUT = /home/postgres/lotu01
  2. PARSE_BADFILE = /home/postgres/tbl_lottu_bad.txt
  3. LOGFILE = /home/postgres/tbl_lottu_output.log
  4. LIMIT = INFINITE
  5. PARSE_ERRORS = 0
  6. CHECK_CONSTRAINTS = NO
  7. TYPE = CSV
  8. SKIP = 5
  9. DELIMITER = |
  10. QUOTE = "\""
  11. ESCAPE = "\""
  12. OUTPUT = lottu.tbl_lottu
  13. MULTI_PROCESS = NO
  14. WRITER = DIRECT
  15. DUPLICATE_BADFILE = /home/postgres/tbl_lottu.dup.csv
  16. DUPLICATE_ERRORS = 0
  17. ON_DUPLICATE_KEEP = NEW
  18. TRUNCATE = YES

使用控制文件进行加载操作

  1. pg_bulkload /home/postgres/lottu.ctl -d lottu -U lottu
  2. [postgres@Postgres201 ~]$ pg_bulkload /home/postgres/lottu.ctl -d lottu -U lottu
  3. NOTICE: BULK LOAD START
  4. NOTICE: BULK LOAD END
  5. 5 Rows skipped.
  6. 95 Rows successfully loaded.
  7. 0 Rows not loaded due to parse errors.
  8. 0 Rows not loaded due to duplicate errors.
  9. 0 Rows replaced with new rows.

6.总结

pg_bulkload是一种用于PostgreSQL的高速数据加载工具,相比copy命令。最大的优势就是速度。优势在让我们跳过shared buffer,wal buffer。直接写文件。pg_bulkload的direct模式就是这种思路来实现的。不足的是;表字段的顺序要跟导入的文件报错一致。希望后续版本能开发。

[转帖]PostgreSQL数据加载工具之pg_bulkload的更多相关文章

  1. PostgreSQL数据加载工具之pg_bulkload

    1. 介绍 PostgreSQL提供了一个copy命令的便利数据加载工具,copy命令源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载.pg_bulkload ...

  2. GreenPlum数据加载

    1. copy命令 对于数据加载,GreenPlum数据库提供copy工具,copy工具源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载.使用copy命令进行 ...

  3. MPP 二、Greenplum数据加载

    Loading external data into greenplum database table using different ways... Greenplum 有常规的COPY加载方法,有 ...

  4. flask+sqlite3+echarts3+ajax 异步数据加载

    结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...

  5. 浅谈Entity Framework中的数据加载方式

    如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Arc ...

  6. Android Volley和Gson实现网络数据加载

    Android Volley和Gson实现网络数据加载 先看接口 1 升级接口 http://s.meibeike.com/mcloud/ota/cloudService POST请求 参数列表如下 ...

  7. Echarts通过Ajax实现动态数据加载

    Echarts(3.x版)官网实例的数据都是静态的,实际使用中往往会要求从服务器端取数据进行动态显示,官网教程里给出的异步数据加载很粗略,下面就以官网最简单的实例为例子,详细演示如下过程:1.客户端通 ...

  8. DICOM:DICOM三大开源库对比分析之“数据加载”

    背景: 上一篇博文DICOM:DICOM万能编辑工具之Sante DICOM Editor介绍了DICOM万能编辑工具,在日常使用过程中发现,“只要Sante DICOM Editor打不开的数据,基 ...

  9. PyTorch数据加载处理

    PyTorch数据加载处理 PyTorch提供了许多工具来简化和希望数据加载,使代码更具可读性. 1.下载安装包 scikit-image:用于图像的IO和变换 pandas:用于更容易地进行csv解 ...

  10. ScrollView嵌套ListView,GridView数据加载不全问题的解决

    我们大家都知道ListView,GridView加载数据项,如果数据项过多时,就会显示滚动条.ScrollView组件里面只能包含一个组件,当ScrollView里面嵌套listView,GridVi ...

随机推荐

  1. nacos-config配置中心

    依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-clou ...

  2. 华为云发布CodeArts APIMock服务,精准Mock,并行开发零等待!

    本文分享自华为云社区<华为云发布CodeArts APIMock服务,精准Mock,并行开发零等待!>,作者: 华为云头条. 2023年10月10日,华为云正式发布CodeArts API ...

  3. Spark-submit执行流程,了解一下

    摘要:本文主要是通过Spark代码走读来了解spark-submit的流程. 1.任务命令提交 我们在进行Spark任务提交时,会使用"spark-submit -class .....&q ...

  4. 从零开始学python | 什么是Python JSON?

    摘要:您知道如何从在线API传输数据或将各种数据存储到本地计算机吗?您已经将自己沉浸于JSON的一种方式中,JSON表示Java Script Object Notation.它是一种著名的流行数据格 ...

  5. allowedOrigins cannot contain the special value "*"

    Spring Boot的版本高于 2.4以后 ,原来的配置已经不适合目前的版本 将代码中的allowedOrigins改为allowedOriginPatterns @Configuration pu ...

  6. MySQL 数据分组后取第一条数据

    SQL SERVER数据分组后取第一条数据--PARTITION BY -- 不加 distinct(a.id) order by 会有问题 导致获取出来的数据不对 SELECT id,title,d ...

  7. ByteBuffer 字节缓冲区

          HeapByteBuffer 在jvm堆上面的一个buffer,底层的本质是一个数组  由于内容维护在jvm里,所以把内容写进buffer里速度会快些:并且,可以更容易回收 DirectB ...

  8. 【已解决】Uiautomatorviewer报错:Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationT...

    报错 使用Uiautomatorviewer连接真机报错Unexpected error while obtaining UI hierarchy (获取UI层次结构时出现意外错误) android8 ...

  9. GO语言之环境搭建和基本命令

    目录 go语言基础 下载go编译器 go目录简介 gopath简介 环境变量配置 GOPATH PATH go语言项目结构 IDE下载与配置 安装goland goland里添加goroot和gopa ...

  10. 2020年第十一届蓝桥杯省赛 第二场(10月17日)B组个人题解

    A 找出来1到2020之间数位为2的数量. 不用特别去考虑,直接循环即可 B 求分子分母最小因子为1的. 跑两个for循环,写一个gcd就可以了 答案:2481215 int main() { // ...