首页 > 其他分享 >MogDB插件之高速灌数

MogDB插件之高速灌数

时间:2024-04-15 11:13:50浏览次数:22  
标签:插件 Rows MogDB pg 灌数 bulkload moguser

MogDB 插件之高速灌数
本文出处:https://www.modb.pro/db/336694

对于写密集型系统,我们一般有如下方式来进行加速:

使用批量插入代替单条 insert 语句插入
更好的处理方式是使用 copy 语句代替 insert 语句
同时也可以使用多个 session 并行代替单个 session 的语句操作
相比直接使用 copy,只要数据出现错误,它会中止所有的工作。假如我们最后一条记录有问题,我们前面大量的数据插入都会失效,这通常是我们不能接受的。

因而从外部数据源导入数据,应该考虑导入操作可以持续工作,然后把因为错误拒绝插入的数据另外保存起来。pgloader 工具其实可以做到这点,虽然它不如 copy 速度快,但对于外部数据格式并不那么严格时,这是较好的方式。

对于像外部灌数这样的特定场景,使用 pg_bulkload 工具有时甚至比 copy 还要快,这得意于它采取积极的高性能特性,能够跳过 shared buffer 以及绕过写 WAL 文件,另外它也可以处理坏的数据行。

本文将在 Centos 平台演示 pg_bulkload 插件的使用方法:

pg_bulkload 插件准备
注意:插件包的下载请参考MogDB 插件之跨库访问

将官网下载的 plugins-CentOS-x86-2.1.0.tar.gz 上传到服务器后,解压

$ tar zxvf plugins-CentOS-x86-2.1.0.tar.gz
将插件相关文件安装到 MogDB 数据库:

方式一:使用脚本进行安装
$ ./gs_install_plugin_local -X clusterconfig.xml --pg_bulkload
方式二:手工拷贝安装
$ cd plugins/pg_bulkload
$ cp pg_bulkload.so pg_timestamp.so /opt/mogdb210/lib/postgresql/
$ cp pg_bulkload.control pg_bulkload.sql pg_bulkload--1.0.sql pg_bulkload--unpackaged--1.0.sql uninstall_pg_bulkload.sql /opt/mogdb210/share/postgresql/extension/
$ /usr/bin/mkdir -p /opt/mogdb210/share/postgresql/contrib
$ cp uninstall_pg_timestamp.sql pg_timestamp.sql /opt/mogdb210/share/postgresql/contrib
$ cp pg_bulkload /opt/mogdb210/bin/
本文使用第二种方式。

创建 pg_bulkload 扩展
创建扩展的用户需要具有 sysadmin 权限,本文使用 moguser 用户

MogDB=# \du moguser
List of roles
Role name | Attributes | Member of
-----------+------------+-----------
moguser | Sysadmin | {}

下面使用 moguser 创建 pg_bulkload 扩展,并进行后续测试

$ gsql -U moguser postgres -r
gsql ((MogDB 2.1.0 build 56189e20) compiled at 2022-01-07 18:47:53 commit 0 last mr )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

MogDB=> create extension pg_bulkload with schema public;
CREATE EXTENSION

查看 pg_bulkload 扩展

MogDB=> \dx pg_bulkload
List of installed extensions
Name | Version | Schema | Description
-------------+---------+--------+-----------------------------------------------------------------
pg_bulkload | 1.0 | public | pg_bulkload is a high speed data loading utility for PostgreSQL
(1 row)

pg_bulkload 测试
直接使用参数测试
先创建表

create table test_bulkload(id int, name varchar(128));
再创建一个 txt 文件,写 10W 条数据

$ seq 100000| awk '{print $0"|bulkload"}' > bulkload_output.txt
使用下面的命令导入数据

$ pg_bulkload -i ./bulkload_output.txt -O test_bulkload -l test_bulkload.log -o "TYPE=csv" -o "DELIMITER=|" -d postgres -U moguser
执行结果如下:

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.

连接数据库,查看数据是否导入成功:

MogDB=> select count(1) from test_bulkload ;
count

100000
(1 row)

使用控制文件测试
先创建表

CREATE TABLE foo (a bigint, b text);
创建模拟导入数据文件 foo.csv

$ more foo.csv
1,one
2
3,three,111
four,4
5,five

创建控制文件

$ more sample_csv.ctl
OUTPUT = moguser.foo
INPUT = /home/omm/foo.csv
LOGFILE=/home/omm/pg_bulkload.log
LIMIT = INFINITE
TYPE = CSV
DELIMITER = ","
QUOTE = """
ESCAPE = """
WRITER = DIRECT
MULTI_PROCESS = NO
PARSE_ERRORS = -1
PARSE-BADFILE=/home/omm/pg_bulkload_bad.log
DUPLICATE_ERRORS = 0
ON_DUPLICATE_KEEP = NEW
TRUNCATE = YES

控制文件 OUTPUT 描述数据导入的目标表,INPUT 描述输入的数据文件,LOGFILE 描述导入过程的日志,DELIMITER 描述数据分割符, PARSE_BADFILE 描述解析失败的记录文件,其他参数可以参考字面含义。

然后使用下面的命令

$ pg_bulkload sample_csv.ctl -d postgres -U moguser
执行结果如下

NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
0 Rows skipped.
2 Rows successfully loaded.
3 Rows not loaded due to parse errors.
0 Rows not loaded due to duplicate errors.
0 Rows replaced with new rows.
WARNING: some rows were not loaded due to errors.

上面命令执行完成之后,错误数据我们可以从 pg_bulkload_bad.log 文件进行查看

$ more pg_bulkload_bad.log
2
3,three,111
four,4
正常的数据记录可以从 foo 表中查看

MogDB=> select * from foo;
a | b
---+------
1 | one
5 | five
(2 rows)

标签:插件,Rows,MogDB,pg,灌数,bulkload,moguser
From: https://www.cnblogs.com/helloopenGauss/p/18135500

相关文章

  • 9个MogDB存储过程示例
    9个MogDB存储过程示例本文出处:https://www.modb.pro/db/400634存储过程是一组结构化的查询和语句,例如控制语句和声明。这里介绍9个在不同情况下很有用的存储过程示例。创建测试表:createtablepublic.test1(idint,namevarchar(10));使用存储过程插入数据CREATEORR......
  • leetcode插件问题
    1.使用一段时间后,提交答案一直返回undefind原因为插件缓存token有效期已过,需要重新登录2.重新登录......
  • oh-my-zsh安装自动建议插件
    1.插件列表zsh-autosuggestions:这个是自动建议插件,能够自动提示你需要的命令。zsh-syntax-highlighting:这个是代码高亮插件,能够使你的命令行各个命令清晰明了。2.安装插件2.1自动安装2.1.1添加插件OhMyZsh提供了一种简便的方式来安装官方仓库中的插件。打开~/......
  • vscode使用gdb插件调试二进制文件
    使用vscode访问虚拟机里面的代码。代码是在虚拟机的xshell编译的(必须的debug模式)。现在可以通过在vscode下面安装gdb插件。然后就可以在vscode下面使用gdb来启动这个二进制文件了,还可以在vscode里面,在函数上面打断点。 在vscode左侧栏,点击debug,可以创建launch.json文件。......
  • 读研必备的十个浏览器插件,你用过几个?
    换新电脑在登录google浏览器账号时,一股脑给我同步了几十个读研时期使用的浏览器插件,现在已经脱离了科研环境用不上了,发现这些插件在科研时期帮助我提升了效率,于是在移除之前整理出了我读研时期用到最多、对我最有帮助的十个浏览器插件,希望正在读研的学弟学妹能看到这篇文章,对你们......
  • VSCode使用Go插件
    本文更新于2023-12-26,使用VSCode1.85.1、Go插件v0.40.1。安装Go插件:使用Ctrl+Shift+X打开扩展面板,搜索“Go”,安装“Go”插件(GoforVisualStudioCode)。安装Go插件的依赖工具:因国内无法访问proxy.golang.org,故需自行配置模块代理。运行cmd。在cmd中运行setGOPROXY=h......
  • pgsql的向量插件启用问题
    启用向量插件的时候,没有这个类型,因为只是安装还不够,有插件以后需要进表里创建出这个插件的类型这里使用了docker来装有插件的pgsql步骤dockerexec-it8744660338b9/bin/bash进容器psql\wiki(库名)zdk(管理员名称)切换到你要创建插件的库里(这个和你初始化库有......
  • 开发Rhino插件
    这个文章其实是一个目录,文章从Rhino插件开发的基础入门出发,再到加强提升,罗列出一些有益于阶段性学习的文章,来帮助大家一起开发Rhino插件,作者文笔不是更好,如果有编程语言方面的专业描述不是很准确或者表达方面不够清楚的,欢迎指出纠正,我会持续更新文章,作者一般情况下会及时回复大家......
  • 【虚幻引擎】DTProjectSettings 蓝图获取基本项目配置插件使用说明 获取项目命名,项目
    本插件可以使用蓝图获取到项目的一些基本配置,如获取:公司名、公司识别名、版权声明、描述、主页、许可条款、隐私政策、项目ID、项目命名、项目版本、支持联系方式、项目显示标题、项目调试标题信息、应保留窗口宽高比、使用无边框窗口、以VR启动、允许窗口重设大小、允许关闭、允......
  • rollup开发一个npm插件/包
    创建一个项目创建一个空项目,并初始化npminit-y局部安装rollupyarnadd--devrollup并创建其配置文件rollup.config.jsexportdefault{ input:'src/main.ts', output:{ file:'bundle.js', format:'cjs' }};如果你的项目是源码是基于js写的,那么截止到目前,......