云贝教育 |【技术文章】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 TABLE

testdb=# create extension pg_bulkload;  #创建扩展以生成pgbulkload.pg_bulkload() 函数
CREATE EXTENSION
testdb=# \dx
                                     List of installed extensions
    Name     | Version |   Schema   |                           Description                           
-------------+---------+------------+-----------------------------------------------------------------
 pg_bulkload | 3.1.21  | public     | pg_bulkload is a high speed data loading utility for PostgreSQL
 plpgsql     | 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 END
        0 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.log

pg_bulkload 3.1.21 on 2024-03-24 00:02:14.495113+08

INPUT = /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 = NO


  0 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+08

CPU 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.1

NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
        0 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.1

testdb=# 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日志。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【YOLOV5 入门】——detect.py简单解析模型检测基于torch.hub的检测方法

声明:笔记是毕设时根据B站博主视频学习时自己编写,请勿随意转载! 一、打开detect.py(文件解析) 打开上节桌面创建的yolov5-7.0文件夹里的detect.py文件(up主使用的是VScode,我这里使用pycharm…

电商数据采集平台兼具海量采集国内淘系京东国外LAZADA亚马逊阿里巴巴等平台数据采集

很多的电商数据采集API接口可以使用国内电商平台淘系、京东的行业数据,境外Lazada等平台的行业数据,以及各类直播电商数据等,相对淘数据来说,平台更多一些,但是价格也比较贵,一般是按照行业下类目来销售的&…

华为耳机快速配对新设备,一招搞定

耳机现在已经是我们形影不离的随身设备,如果我们碰见华为手机或平板无法连接或连接不上华为耳机(如FreeBuds、FreeLace系列及FreeClip蓝牙耳机)的问题,其实很简单,今天分享一个小妙招,帮助我们快速解决这个…

ConcurrentHashMap 是如何保证并发安全的

ConcurrentHashMap JDK1.7 ConcurrentHashMap 是如何保证并发安全的?使用分段锁的概念: 例如这张图,共有 256 个槽位,如果整个哈希表用一把锁,势必性能低下 如果256个槽位,每个槽位都有一把锁&#xff0…

懒人方法|(一)分享:NHANES数据库怎么下载整理

1.前言 继前面孟德尔随机化的代码分享,应粉丝要求出一篇关于NHANES数据库的数据整理入门教程 前面MR代码:全代码分享|R语言孟德尔随机化怎么做?TwoSampleMR包MR一套标准流程 2.数据库界面 NHANES(National Health …

数据结构算法刷题笔记——题型解法

数据结构算法刷题笔记——题型解法 一、常用容器1.1 vector1.1.1 vector基本操作1.1.1.0 头文件#include<vector>1.1.1.1 构造一个vector容器1.1.1.2 元素访问1.1.1.3 元素个数 .size()1.1.1.4 最大容量 .capacity()1.1.1.5 改变容器有效元素个数 .resize(n)1.1.1.6 改变…

详解智慧路灯杆网关的集中供电能力

智慧路灯杆网关是智慧杆物联网系统中不可或缺的设备。智慧杆网关不仅可以作为杆载设备与云平台、设备与设备之间的桥梁&#xff0c;促进数据的无缝传输&#xff0c;而且还能提供高效的能源管理和供电功能。 BMG8200系列交流型智慧路灯杆网关就集成了强大的供电能力&#xff0c;…

数字信号转模拟信号 DA变换 高精度PWM脉宽调制信号100Hz PWM/5KHz PWM /10KHz PWM转4-20mA/0-10V/1-5V/0-5V

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

如何确保六西格玛培训效果最大化?

近年来&#xff0c;如何确保六西格玛培训的效果&#xff0c;使其真正转化为企业的生产力&#xff0c;成为许多管理者关注的焦点。本文&#xff0c;天行健Six Sigma咨询公司将分享如何确保六西格玛培训效果最大化&#xff0c;帮助企业在实施六西格玛管理的过程中取得更好的成效。…

Java基础-多线程基础

文章目录 1.线程相关概念1.程序2.进程3.线程4.单线程5.多线程6.并发7.并行查看当前电脑cpu数量 2.线程基本使用1.线程类图2.继承Thread创建线程细节说明代码实例 3.实现Runnable来创建线程&#xff08;包括静态代理演示&#xff09;代码实例 3.多线程机制简要介绍代码实例为什么…

qtxlsx 学习

简介&#xff1a; QXlsx是一个可以读写Excel文件的库。不依赖office以及wps组件&#xff0c;可以在Qt5支持的任何平台上使用。 QXlsx和QAxObject 比较 QAxObject使用需要系统中安装了offie或wps&#xff0c;这种方法不推荐使用&#xff1b; 因为如果安装了wps&#xff0c;可…

puzzle(1122)连线迷宫

目录 一&#xff0c;连线迷宫-经典模式 1&#xff0c;规则 2&#xff0c;策略 3&#xff0c;调整的局部性 4&#xff0c;八连通端点的线条合并 taptap小游戏 迷宫解谜 连线迷宫模式 一&#xff0c;连线迷宫-经典模式 1&#xff0c;规则 2&#xff0c;策略 分2步&#x…

Kali远程操纵win7

一.准备 1.介绍 攻击方&#xff1a;kali IPV4:192.168.92.133 被攻击方&#xff1a;win7 IPV4:192.168.92.130 2.使用永恒之蓝漏洞 (1.使用root权限 (2.进入msfconsole (3.添加rhosts (4.run进行一下 二.进行远程操作 1.获取用户名和密码 在cmd5查询 2.获取syste…

Windows下如何查看端口被谁占用

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 开始时经常遇到这种…

LVS负载均衡-DR模式配置

LVS&#xff1a;Linux virtual server ,即Linux虚拟服务器 LVS自身是一个负载均衡器&#xff08;Director&#xff09;&#xff0c;不直接处理请求&#xff0c;而是将请求转发至位于它后端的真实服务器real server上。 LVS是四层&#xff08;传输层 tcp/udp&#xff09;负载均衡…

SpringBoot SpringMVC (详解)

6. SpringBoot Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 是为了快速开发 Spring 程序开发而诞生的。 Spring Boot 的优点&#xff1a; 快速集成框架&#xff0c;Spring Boot 提供了启动添加依赖的功能&#xff0c;⽤于秒级集成各种框架。内置运⾏…

来了!小学生Python创意编程(视频教学版)

目录 写在前面 推荐图书 推荐理由 写在最后 写在前面 在最好的年纪&#xff0c;一起来学Python吧&#xff01;本期博主给大家推荐一本适合小学生阅读的书籍&#xff0c;一起来看看吧~ 推荐图书 小学生Python创意编程&#xff08;视频教学版&#xff09; 直达链接&#x…

uniapp输入框事件(防抖)

一、描述 在输入框输入内容或者说输入关键词的时候&#xff0c;往往都要进行做防抖处理。如果不做防抖&#xff0c;你输入什么&#xff0c;动态绑定的数据就会保持一致。这样不好吗&#xff0c;同步获取。有个业务场景&#xff0c;如果是搜索框&#xff0c;你每次一个字符&…

【差分约束+并查集】第十三届蓝桥杯省赛C++ A组 Java A组/研究生组《推导部分和》(C++)

【题目描述】 【输入格式】 【输出格式】 【数据范围】 【输入样例】 5 3 3 1 5 15 4 5 9 2 3 5 1 5 1 3 1 2 【输出样例】 15 6 UNKNOWN 【思路】 题解来源&#xff1a;AcWing 4651. $\Huge\color{gold}{推导部分和}$ - AcWing 【代码】 #include<bits/stdc.h> #define…

基于深度学习的心律异常分类算法

基于深度学习的心律异常分类系统——算法设计 第一章 研究背景算法流程本文研究内容 第二章 心电信号分类理论基础心电信号产生机理MIT-BIH 心律失常数据库 第三章 心电信号预处理心电信号噪声来源与特点基线漂移工频干扰肌电干扰 心电信号读取与加噪基于小波阈值去噪技术的应用…