云贝教育 |【技术文章】pg_bulkload介绍

注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

pg_bulkload 是一个高性能的数据加载工具,专门为PostgreSQL数据库设计,用于大批量数据的快速导入。pg_bulkload的工作原理是绕过传统的SQL INSERT语句,通过直接写入底层数据文件和WAL日志,显著提升了数据加载速度和效率。

下面是pg_bulkload的一些核心特性和使用方法:

1.设计理念:

pg_bulkload旨在实现批量数据加载的高性能和高吞吐量,特别适合大数据导入、历史数据迁移和数据分析场景。

2. 工作流程:

  • 控制文件:pg_bulkload通过一个控制文件(control file)来配置导入过程,包括数据源、目标表
  • 字段映射、错误处理策略等。
  • 数据文件:原始数据通常以CSV、TXT或其他格式存储在数据文件中。
  • 日志文件:加载过程中产生的错误记录会写入到错误日志文件中。
  • 并行导入:pg_bulkload可以利用多核处理器并行加载数据,进一步提升导入速度。

3. 主要特性:

  • 快速导入:通过直接写入数据文件和WAL日志而非逐行插入,极大地减少了数据库的IO负担和事务开销。
  • 错误处理:支持错误记录重试、跳过或记录到特定文件,允许在导入过程中灵活处理错误数据。
  • 并行处理:通过多线程和多进程的方式并行加载数据,充分利用硬件资源。
  • 过滤和转换:支持在导入过程中对数据进行简单的过滤和转换操作。

一、功能测试

1、创建目标表并初始化插件

psql testdb
testdb=# create table test2 (id int,name text);
CREATE TABLEtestdb=# create extension pg_bulkload;  #创建扩展以生成pgbulkload.pg_bulkload() 函数
CREATE EXTENSION
testdb=# \dxList of installed extensionsName     | Version |   Schema   |                           Description                           
-------------+---------+------------+-----------------------------------------------------------------pg_bulkload | 3.1.21  | public     | pg_bulkload is a high speed data loading utility for PostgreSQLplpgsql     | 1.0     | pg_catalog | PL/pgSQL procedural language
(2 rows)

2、准备导入数据

seq 100| awk '{print $0"|test"$0}' >> bulk_test2.txt   

3、加载数据到目标表

[postgres@ora19c ~]$  pg_bulkload -i /home/postgres/bulk_test2.txt -O test2  -l /home/postgres/test2.log -P /home/postgres/test2.txt  -o "TYPE=CSV" -o "DELIMITER=|" -d testdb -U postgres  -h 127.0.0.1
NOTICE: BULK LOAD START
2024-03-24 00:02:14.495 CST [24105] LOG:  pg_bulkload: creating missing LSF directory "pg_bulkload"
2024-03-24 00:02:14.495 CST [24105] STATEMENT:  SELECT * FROM pgbulkload.pg_bulkload($1)
NOTICE: BULK LOAD END0 Rows skipped.100100 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@ora19c ~]$ cat /home/postgres/test2.logpg_bulkload 3.1.21 on 2024-03-24 00:02:14.495113+08INPUT = /home/postgres/bulk_test2.txt
PARSE_BADFILE = /home/postgres/test2.txt
LOGFILE = /home/postgres/test2.log
LIMIT = INFINITE
PARSE_ERRORS = 0
CHECK_CONSTRAINTS = NO
TYPE = CSV
SKIP = 0
DELIMITER = |
QUOTE = "\""
ESCAPE = "\""
NULL = 
OUTPUT = public.test2
MULTI_PROCESS = NO
VERBOSE = NO
WRITER = DIRECT
DUPLICATE_BADFILE = /data/pgdata/data/pg_bulkload/20240324000214_testdb_public_test2.dup.csv
DUPLICATE_ERRORS = 0
ON_DUPLICATE_KEEP = NEW
TRUNCATE = NO0 Rows skipped.100100 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 2024-03-24 00:02:14.495113+08
Run ended on 2024-03-24 00:02:14.634326+08CPU 0.03s/0.01u sec elapsed 0.14 sec

5、使用控制文件来加载数据

# 新建控制文件 ,可以根据之前加载时,产生的日志文件test2.log来更改,去掉里面没有值的参数  NULL = 
vi  test2.ctl 
INPUT = /home/postgres/bulk_test2.txt
PARSE_BADFILE = /home/postgres/test2r_bad.txt
LOGFILE = /home/postgres/test2_output.log
LIMIT = INFINITE
PARSE_ERRORS = 0
CHECK_CONSTRAINTS = NO
TYPE = CSV
SKIP = 0
DELIMITER = |
QUOTE = "\""
ESCAPE = "\""
OUTPUT = public.test2
MULTI_PROCESS = NO
VERBOSE = NO
WRITER = DIRECT
DUPLICATE_BADFILE = /data/pgdata/data/pg_bulkload/20240324000214_testdb_public_test2.dup.csv
DUPLICATE_ERRORS = 0
ON_DUPLICATE_KEEP = NEW
TRUNCATE = YES

6、使用控制文件来加载数据

 pg_bulkload  /home/postgres/test2.ctl -d testdb -U postgres -h 127.0.0.1NOTICE: BULK LOAD START
NOTICE: BULK LOAD END0 Rows skipped.100100 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.


二、关于写WAL日志

pg_bulkload 默认是跳过buffer 直接写文件 ,如果写的过程出现异常,需要wal日志恢复时,加载 -o "WRITER=BUFFERED" 参数可以强制让其写wal日志 。

 pg_bulkload -i /home/postgres/bulk_test2.txt -O test2  -l /home/postgres/test2.log -P /home/postgres/test2.txt  -o "TYPE=CSV" -o "DELIMITER=|" -o "TRUNCATE=YES" -o "WRITER=BUFFERED" -d testdb -U postgres  -h 127.0.0.1

那如何证明?其实不难,一是可以跟踪pg_bulkload的函数调用写日志的次数,二是对比加不加参数WRITER=BUFFERED前后日志量

我们先用第二种方法对比日志量

1)不加参数WRITER=BUFFERED

--调用pg_bulkload前
testdb=# select pg_current_wal_lsn();pg_current_wal_lsn 
--------------------0/2DB5000
(1 row)----调用pg_bulkload
pg_bulkload -i /home/postgres/bulk_test2.txt -O test2  -l /home/postgres/test2.log -P /home/postgres/test2.txt  -o "TYPE=CSV" -o "DELIMITER=|" -d testdb -U postgres  -h 127.0.0.1--调用pg_bulkload后
testdb=# select '0/26CAD68'::pg_lsn;pg_lsn   
-----------0/2DB70C0
(1 row)

查看产生的日志量

testdb=# select '0/2DB70C0'::pg_lsn-'0/2DB5000'::pg_lsn;?column? 
----------8384

2)加参数WRITER=BUFFERED

testdb=# select pg_current_wal_lsn();pg_current_wal_lsn 
--------------------0/26CAD68
(1 row)pg_bulkload -i /home/postgres/bulk_test2.txt -O test2  -l /home/postgres/test2.log -P /home/postgres/test2.txt  -o "TYPE=CSV" -o "DELIMITER=|" -o "TRUNCATE=YES" -o "WRITER=BUFFERED" -d testdb -U postgres  -h 127.0.0.1testdb=# select pg_current_wal_lsn();pg_current_wal_lsn 
--------------------0/2DB5000
(1 row)

查看产生的日志量

testdb=# select '0/2DB5000'-'0/26CAD68'::pg_lsn::pg_lsn;?column? 
----------7250584
(1 row)


由此可见,日志产生量巨大!从侧面也可以验证pg_bulkload默认情况下,只会产生少量的wal日志。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】MySQL小结

MySQL数据库的基本信息 数据:记录事物的信息 表:数据的集合,由行和列组成;将多条数据组合在一起 数据库:是表的集合,是存储以统一格式且相互有关数据的仓库 DBMS的主要功能:1.数据库的建立和维…

JetPack之DataBinding基础使用

目录 一、简介二、使用2.1 使用环境2.2 xml文件绑定数据2.3 数据绑定的对象2.3.1 object2.3.2 ObseravbleField2.3.3 ObseravbleCollection 2.4 绑定数据 三、应用场景 一、简介 DataBinding是谷歌15年推出的library,DataBinding支持双向绑定,能大大减少绑定app逻辑…

【C语言】huffman编码实现数据压缩

目录 原理类型定义完整代码实验无重复数据的压缩情况有重复数据的压缩情况数据中只有一种字符的情况 原理 huffman统计数据中字符的出现次数,根据每个字符的出现次数来编码,出现次数越多的数据使用越短的编码长度,从而实现数据压缩的目的。 …

如何利用InternLM2的开源大型语言模型编写代码解释的agent

InternLM2作为一个开源的大型语言模型,具备了强大的编码能力和长文本处理能力,同时也在工具调用方面有所探索。要利用InternLM2编写代码解释的agent,可以依据文章中提及的“Tool-Augmented LLMs”部分进行设计。这部分探讨了如何通过特定的方…

南京观海微电子---Vitis HLS的工作机制——Vitis HLS教程

1. 前言 Vitis HLS(原VivadoHLS)是一个高级综合工具。用户可以通过该工具直接将C、 C编写的函数翻译成HDL硬件描述语言,最终再映射成FPGA内部的LUT、DSP资源以及RAM资源等。 用户通过Vitis HLS,使用C/C代码来开发RTL IP核&#x…

VSCode 如何同步显示网页在手机或者平板上

首先要确保 ①电脑上安装了VsCode ②VsCode安装插件LiveServer 安装成功之后 连续按住 Alt L 、Alt O 会跳转到对应的html页面上 http://127.0.0.1:5500/....... 是这个开头的 然后打开网络 如果桌面有网上邻居的可以直接点桌面的网上邻居 进来找到WLAN这个…

RabbitMQ安装及使用笔记

RabbitMQ安装及使用笔记 RabbitMQ是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP),用于在分布式系统中进行消息传递。 1.安装 利用docker load命令加载mq镜像 docker load -i mq.tar 基于Docker来安装RabbitMQ&#xff…

数据结构(四)顺序表与链表的深层次讲解

我们在数据结构(二),对链表和顺序表已经讲解过了。但很多同学表示有点晦涩难懂那我就出一篇深层次讲解,一步一步来带领大家学习。 我们从头(数据结构)开始完整的来为大家讲解,大家好好看好好学。…

vue3.0开发手册(实用版)

vue3 .2看一遍就会的setup语法糖 起初vue3.0暴露变量必须return出来,template才能使用 vue3.2中,只需要在script标签上加上setup属性,组件在编译的过程中代码运行的上下文是在setup0函数中,无需retuen template 可之间使用 文件…

人工智能在产业中应用--生成智能

二、生成式人工智能 前面介绍了很多人工智能的应用,接下来部分我们会介绍当前正在进行的生成智能。生成智能和以往的人工智能有什么区别,个人觉得主要区别就在于“度”。在表现上就是以前的人工智能更多是利用既有的数据集分布挖掘和解决在这个数据集下…

Python人工智能:气象数据可视化的新工具

Python是功能强大、免费、开源,实现面向对象的编程语言,在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能,这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

单片机原理及应用

单片机时钟电路及时序 时钟电路用于产生AT89S51单片机工作时所必需的时钟脉冲信号(工作频率);AT89S51单片机的CPU正是在时钟脉冲信号的控制下,严格地按时序执行指令进行工作的。AT89S51单片机的最高时钟频率为33MHz。 时钟电路 AT89S51单片机常用的时…

文件披露,Facebook秘密项目中偷窥用户的Snapchat流量

2016年,Facebook启动了一个秘密项目,旨在拦截并解密人们使用Snapchat应用程序及其服务器之间的网络流量。根据新近公开的法庭文件,该项目的目标是了解用户的行为,并帮助Facebook与Snapchat竞争。Facebook将此称为“鬼busters项目”…

Snowflake 时钟回拨问题 解决方案

Snowflake是一种分布式数据存储和计算服务,它使用一种特殊的ID生成策略来确保在分布式系统中生成唯一的ID。这种策略通常被称为Snowflake算法,它由Twitter开发用于生成64位的唯一ID,并且在多个系统和服务中被广泛采用。 Snowflake算法生成的…

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)、logisim工具

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费,70元。据说可以导出 Verilog ! logisim及其衍生版本 都需要安装java环境。 http://www.cburch.com/logisim/ 是原版, 下载页面&#…

Python拆分PDF、Python合并PDF

WPS能拆分合并&#xff0c;但却是要输入编辑密码&#xff0c;我没有。故写了个脚本来做拆分&#xff0c;顺便附上合并的代码。 代码如下&#xff08;extract.py) #!/usr/bin/env python """PDF拆分脚本(需要Python3.10)Usage::$ python extract.py <pdf-fil…

垃圾回收机制--GC 垃圾收集器--JVM调优-面试题

1.触发垃圾回收的条件 新生代 Eden区域满了&#xff0c;触发young gc (ygc)老年代区域满了&#xff0c;触发full gc (fgc)通过ygc后进入老年代的平均大小大于老年代的可用内存,触发full gc(fgc).程序中主动调用的System.gc()强制执行gc,是full gc&#xff0c;但是不必然执行。…

蓝桥杯(3):python搜索DFS

目录 1 DFS简介 1.1 DFS与n重循环 1.2 代码实现 1.3 例题 1.3.1 分糖果 1.3.2 买瓜 2 回溯 2.1 定义 2.2 代码实例 2.1.1 排列数 2.1.2 找子集 2.3 例题 2.3.1 N皇后 2.3.2 小朋友崇拜圈 2.3.3 全球变暖 3 剪枝 3.1 定义 3.2 分类 3.3 例子 3.3.1 数字王国之…

自动化测试:Selenium中的时间等待

在 Selenium 中&#xff0c;时间等待指在测试用例中等待某个操作完成或某个事件发生的时间。Selenium 中提供了多种方式来进行时间等待&#xff0c;包括使用 ExpectedConditions 中的 presence_of_element_located 和 visibility_of_element_located 方法等待元素可见或不可见&…

javaWeb项目-火车票订票信息系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Spring Boot框架 …