云贝教育 |【技术文章】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,一经查实,立即删除!

相关文章

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统计数据中字符的出现次数,根据每个字符的出现次数来编码,出现次数越多的数据使用越短的编码长度,从而实现数据压缩的目的。 …

南京观海微电子---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…

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

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

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

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

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

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

单片机原理及应用

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

学习或复习电路的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框架 …

任务2.1 一元二次方程(顺序结构版)

在这个任务中&#xff0c;我们编写了一个Java程序来解决一元二次方程。程序接受用户输入的系数a、b、c&#xff0c;并计算出方程的根。通过计算判别式delta的值&#xff0c;我们可以确定方程有两个不相等实根、两个相等实根还是没有实数根。这个程序遵循了IPO模式&#xff0c;即…

MCGS学习——MCGS仿真与实体西门子监控

MCGS仿真与西门子监控 前提知识——博图与MCGS联合仿真 适用于什么设备都没有的情况下进行学习 对NetToPLCsim进行初始设置 找到博图的IP地址 勾选允许远程对象的通信访问 勾选系统时钟参数&#xff0c;主要是需要用到1HZ的脉冲&#xff0c;做一个闪烁的灯 编写简单程序&am…

如何在Linux系统使用Docker本地部署Halo网站并实现无公网IP远程访问

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可…

2024/3/28 IOday1

编写一条学生链表&#xff0c;写一些能够像链表里边添加数据的函数 实现&#xff1a;将链表中的所有内容保存到文件中去 以及 读取文件中的所有内容&#xff0c;加载到链表里 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef int datat…

SpringBoot学习之ElasticSearch下载安装和启动(Windows版)(三十)

本文先写windows下的下载安装和启动,后续有时间再补充其他环境下(Mac、Linux、Docker)的,这里我们后续对ElasticSearch简称为ES,读者习惯这一称呼就好。 一,ES下载 可以百度【ElasticSearch官网】或者直接点击这里的ES官网下载地址:​​​​​ Download Elasticsearch…