瀚高db_bulkload 用于将大量数据加载到数据库。与传统INSERT/COPY等数据加载方式相比存在较大的差异。INSERT处理机制涉及查询分析、查询重写、查询规划、执行等过程,一条INSERT就会开启一个事务,批量插入数据时这种开销是很影响性能的;COPY的处理方式,跳过以上查询分析、查询重写、查询规划等过程,性能优于INSERT,但频繁的内存操作及WAL日志写入,仍不具备快速导入海量数据的处理能力。
瀚高db_bulkload 的处理方式是绕过了共享内存,不写日志,直接写入文件,速度远超传统数据加载工具。 同时,db_bulkload 支持更多特性,支持灵活的文件输入、网络输入以及SQL函数输入;输入格式支持CSV以及binary;数据加载支持多进程的multi-process模式,速度更快,支持用户自定义的filter,支持唯一约束以及非空约束等等。
db_bulkload 支持PostgreSQL 9.6以上版本、瀚高系列数据库。
l postgresql脚本
该脚本是pg_ctl的包装器命令,可以启动和停止PostgreSQL数据库服务,脚本内部包含了db_bulkload自身的逻辑处理和原生PG的pg_ctl命令。
db_bulkload提供了便捷的postgresql脚本方式,封装pg_ctl数据库管理及恢复模式于一体,完成数据恢复;脚本内部在执行pg_ctl之前首先检测是否需要执行db_bulkload的恢复模式,如果需要则自动执行恢复模式。
l db_bulkload程序
该程序用于加载数据。内部调用PostgreSQL的用户定义函数pg_bulkload()并执行加载。pg_bulkload()函数将在db_bulkload安装期间创建。此命令的使用包括以下三步:
1、编辑一个控制文件,控制文件里包括了加载数据的一些设置,比如输入文件的位置,输出文件,文件格式等,也可以使用命令行参数,路径需要绝对路径。
用户定义函数pg_bulkload()主要由读、写两个模块组成,其基本架构图如下:
reader模块负责读取输入数据,并对其进行编码检查与转换、执行filter、检查约束。writer模块负责将数据加载到表。
l 快速加载巨量数据;
l 灵活的输入输出设置;
l 支持constrains与filter。
以下详细功能描述参考《瀚高数据加载工具(db_bulkload)V1.0技术白皮书 》。
4.1批量加载数据
db_bulkload具备快速加载海量数据的功能。该工具为用户提供了“命令行+参数”以及“控制文件”两种方式加载数据。各参数使用请参考4.5节。
db_bulkload -i ./file_name.data -O table_name -l ./file_name.log -P ./parse_bad.log -o "TYPE=CSV" -o "DELIMITER=|" -d postgres -U postgres
File_name.data 文件中的数据将被加载到table_name 表中,数据格式为CSV,列分隔符为|。日志文件为file_name.log,解析错误保存在parse_bad.log文件中。
db_bulkload ./file_name.ctl -d postgres -U postgres
如果db_bulkload成功完成数据加载,结果如下:
4.2数据恢复
db_bulkload提供了便捷的postgresql脚本方式,封装pg_ctl数据库管理及恢复模式于一体,完成数据恢复;脚本内部在执行pg_ctl之前首先检测是否需要执行db_bulkload的恢复模式,如果需要则自动执行恢复模式。
4.3数据过滤筛选
db_bulkload支持自定义filter函数对输入数据进行逐行过滤,满足过滤条件的行将会被加载到数据库中;用户可以自行编写filter函数并在db_bulkload参数列表中指定。
CREATE FUNCTION sample_filter(integer, text, text, real DEFAULT 0.05) RETURNS record
AS $$ SELECT $1 * $4, upper($3) $$
LANGUAGE SQL;
|
4.4数据约束检查
通过CHECK_CONSTRAINTS 参数开启后在加载数据时进行检查,仅支持唯一约束与非空约束。
4.5参数设置
提供丰富、灵活的参数设置,既可以命令行参数形式使用,也可以集中写入到控制文件中。
连接选项表(可以环境变量代替)
2. 控制文件参数