一、概述
本文档主要介绍如何使用 DM8 快速装载工具进行 DM 数据库中表数据的快速载入和载出。
1.1功能简介
DM 提供了两种形式的快速装载工具:一是 dmfldr;二是 dmldrc 和 dmldrp。用户通过使用快速装载工具能够把按照一定格式排序的文本数据以简单、快速、高效的方式载入到 DM 数据库中,或把 DM 数据库中的数据按照一定格式载出到文本文件中。
两种形式的工具,功能完全一样,区别是应用场景不同。在软硬件资源充裕的情景下,首选 dmfldr 工具,dmfldr 在一台机器上启动即可,独立完成快速装载任务,简单高效。在机器资源匮乏的极端情景下,需选择 dmldrc 和 dmldrp 工具,分别部署在两台机器上,各自占用较少的机器资源,相互配合共同完成快速装载任务,可克服机器资源不足的问题。
其中,表及表的同义词支持数据载入和载出,视图及视图的同义词仅支持数据载出。
1.2系统结构
1)dmfldr结构
dmfldr(DM Fast Loader)包含 dmfldr 客户端和 dmfldr 模块两部分。dmfldr 客户端实现初始化快速装载环境、读取数据、打包数据和发送数据功能。dmfldr 功能模块嵌入在数据库服务器中,实现装载功能。两者相互协作,共同完成 dmfldr 的各项功能。
dmfldr的系统结构如下图所示:
当进行数据载入时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件与数据文件,将数据打包发送给服务器端的 dmfldr 模块,由 dmfldr 模块完成数据的真正装载工作。并分析服务器返回的消息,必要时根据用户参数指定生成日志文件与错误数据文件。
当进行数据载出时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件,将用户要求转换成相应消息发送给服务器端的 dmfldr 模块。dmfldr 模块解析并打包需要导出的数据,发送给 dmfldr 客户端,客户端将数据写入指定的数据文件,必要时根据用户参数指定生成日志文件。
- dmldrc和dmldrp结构
快速装载工具所在机器的软硬件资源匮乏会影响快速装载的性能。为了应对这种极端情况,DM 提供了一种轻量型的快速装载工具套装:dmldrc 和 dmldrp。dmldrc 为轻量级快速装载工具的客户端,负责初始化快速装载环境和数据处理功能;dmldrp 为轻量级快速装载工具的服务器,负责任务处理和任务发送功能。两者相互配合完成和 dmfldr 客户端一样的功能。dmldrc 和 dmldrp 可部署在不同的机器上。将快速装载工具的任务分配到两个独立的工具上,并部署在不同的机器上,可减轻机器的软硬件压力。
其它模块和 dmfldr 工具中的模块功能一样。
dmldrc 和 dmldrp 工具套装的系统结构如下图所示:
二、启动和参数简介
2.1启动dmfldr
安装好 DM 数据库管理系统后,在安装目录的“bin”子目录下可找到 dmfldr 执行文件。
dmfldr 的使用必须指定必要的参数,否则工具会报错“无效的参数个数”并退出。为 dmfldr 指定参数的格式为:
dmfldr keyword=value [keyword=value ...]
USERID 是启动 dmfldr 必须要指定的参数,且 USERID 必须是第一个参数。其它参数用户需根据实际情况选取。
##使用 USERID 和 CONTROL 参数启动 dmfldr,完成载入
./dmfldr USERID=SYSDBA/SYSDBA MODE='IN' CONTROL=\'/opt/data/test.ctl\'
##使用 USERID 和 CONTROL 参数启动 dmfldr,完成载出
./dmfldr USERID=SYSDBA/SYSDBA MODE='OUT' CONTROL=\'/opt/data/test.ctl\'
##使用 USERID 、OUT、TABLE 和 DATA 参数启动 dmfldr。将 test 表中数据载出到 test.txt 文件中
./dmfldr USERID=SYSDBA/SYSDBA@localhost:5236 MODE='OUT' TABLE=test DATA=\'/opt/data/test.txt\'
##使用 USERID、IN、TABLE 和 DATA 参数启动 dmfldr。将 test.txt 文件中数据载入到 test 表中
./dmfldr USERID=SYSDBA/SYSDBA@localhost:5236 MODE='IN' TABLE=test DATA=\'/opt/data/test.txt\'
除了在启动命令行中直接指定 dmfldr 参数值外,用户还可以通过 CONTROL 参数设置控制文件中的 OPTIONS 选项来指定 dmfldr 参数值,也可以在 dmfldr.ini 配置文件中指定 dmfldr 参数值。
注意:
dmfldr参数值的优先选择顺序为:优先为命令行参数,其次为控制文件中指定的参数值,最后为dmfldr.ini配置文件中指定的参数值。有以下特殊情况:
使用控制文件时,装载表和数据文件优先使用控制文件中的值;
不使用控制文件时,装载表和数据文件优先使用命令行中的值。
2.2查看dmfldr参数
dmfldr 使用较为灵活,参数较多,用户可以使用“dmfldr help”查看 dmfldr 版本信息和各参数的简单信息。
[dmdba@DM01 ~]$ dmfldr help
version: 03134284132-20240124-216362-20081 Pack5
格式: ./dmfldr KEYWORD=value
例程: ./dmfldr SYSDBA/SYSDBA CONTROL='/opt/data/fldr.ctl'
USERID 必须是命令行中的第一个参数
字符串类型参数必须以引号封闭
关键字 说明(默认值)
--------------------------------------------------------------------------------
USERID 用户名/口令, 格式:{<username>[/<password>] | /}[@<connect_identifier>][<option>] [<os_auth>]
<connect_identifier> : [<svc_name> | host[:port] | <unixsocket_file>]
<option> : #{<exetend_option>=<value>[,<extend_option>=<value>]...}
--此行外层{}是为了封装参数之用,书写时需要保留
<os_auth> : AS {SYSDBA|SYSSSO|SYSAUDITOR|USERS|AUTO}
CONTROL 控制文件,字符串类型
LOG 日志文件,字符串类型 (fldr.log)
BADFILE 错误数据记录文件,字符串类型 (fldr.bad)
SKIP 初始忽略逻辑行数 (0)
LOAD 需要装载的行数 (ALL)
ROWS 提交频次 (50000), DIRECT为FALSE有效
DIRECT 是否使用快速方式装载 (TRUE)
SET_IDENTITY 是否插入自增列 (FALSE)
SORTED 数据是否已按照聚集索引排序 (FALSE)
INDEX_OPTION 索引选项 (1)
1 不刷新二级索引,数据按照索引先排序,装载完后再
将排序的数据插入索引
2 不刷新二级索引,数据装载完成后重建所有二级索引
3 刷新二级索引, 数据装载的同时将数据插入二级索引
ERRORS 允许的最大数据错误数 (100)
CHARACTER_CODE 字符编码,字符串类型 (GBK, UTF-8, SINGLE_BYTE, EUC-KR)
MODE 装载方式,字符串类型 IN表示载入,OUT表示载出,
OUTORA表示载出ORACLE (IN)
CLIENT_LOB 大字段目录是否在本地 (FALSE)
LOB_DIRECTORY 大字段数据文件存放目录
LOB_FILE_NAME 大字段数据文件名称,仅导出有效 (dmfldr.lob)
BUFFER_NODE_SIZE 读入文件缓冲区的大小 (10),有效值范围1~2048
LOG_SIZE 日志信息缓冲区的大小 (1),有效值范围1~100
READ_ROWS 工作线程一次最大处理的行数 (100000),最大支持2^26-10000
NULL_MODE 载入时NULL字符串是否处理为NULL
载出时空值是否处理为NULL字符串 (FALSE)
NULL_STR 载入时视为NULL值处理的字符串
SEND_NODE_NUMBER 运行时发送节点的个数 (20),有效值范围16~65535
TASK_THREAD_NUMBER 处理用户数据的线程数目,默认与处理器核数量相同,有效值范围1~128
BLDR_NUM 服务器BLDR数目 (64),有效值范围1~1024
BDTA_SIZE bdta的大小 (5000),有效值范围100~10000
COMPRESS_FLAG 是否压缩bdta (FALSE)
MPP_CLIENT MPP环境,是否本地分发 (TRUE)
SINGLE_FILE MPP/DPC环境,是否只生成单个数据文件(FALSE)
LAN_MODE MPP/DPC环境,是否以内网模式装载数据(FALSE)
UNREP_CHAR_MODE 非法字符处理选项(0),为0时表示跳过该数据行,为1时表示使用(*)替换错误字节
SILENT 是否静默方式装载数据(FALSE)
BLOB_TYPE BLOB类型字段数据值的实际类型,字符串类型 (HEX_CHAR)
HEX表示值为十六进制,HEX_CHAR表示值为十六进制字符类型
仅在direct=FALSE有效
OCI_DIRECTORY OCI动态库所在的目录
DATA 指定数据文件路径
ENABLE_CLASS_TYPE 允许用户导入CLASS类型数据 (FALSE)
FLUSH_FLAG 提交时是否立即刷盘 (FALSE)
IGNORE_BATCH_ERRORS 是否忽略错误数据继续导入 (FALSE)
SINGLE_HLDR_HP 是否使用单个HLDR装载HUGE水平分区表 (TRUE)
EP 指定需要发送数据的站点序号列表,仅向MPP/DPC环境导入数据时有效
PARALLEL 是否开启并行装载(FALSE)
SQL 使用自定义查询语句,仅导出模式有效
SQLFILE 自定义查询语句所在文件,仅导出模式有效
TABLE 导入/出表
ROW_SEPERATOR 行分隔符
FIELD_SEPERATOR 列分隔符
COMMIT_OPTION 提交选项(0), 0:每发送一批数据后提交, 1:发送完所有数据后提交
APPEND_OPTION 追加选项(0), 0: 追加方式, 1: 替代方式, 2: 插入方式
COLNAME_HEADING 是否在导出文件头中打印列名(FALSE)
IGNORE_AIMLESS_DATA 是否忽略无目标数据(FALSE)
LOB_AS_VARCHAR 是否将CLOB作为VARCHAR进行导入导出(FALSE)
LOB_AS_VARCHAR_SIZE 将CLOB作为VARCHAR进行导入导出时, lob数据最大大小(10)MB
LOG_LEVEL 记录错误数据信息级别(3), 0: 不记录 1: 只记录到log文件 2: 只记录到bad文件 3: 记录到log和bad文件 4: 错误仅输出到屏幕
FLDR_INI 配置文件路径,字符串类型
RECONN 自动重连次数(0)
RECONN_TIME 自动重连等待时间(5), 单位(s), 有效值范围(1~10000)
WIDTH 设置列数据宽度
SEDF 被替换的字符列表
SEDT 用于替换的字符列表
ESCAPE 转义符
DB2_MODE 兼容DB2模式
PRIORITY_ENCLOSE DB2模式下, enclose优先级最高
HELP 打印帮助信息
三、dmfldr实战
3.1 dmfldr控制文件
控制文件 CONTROL 是启动 dmfldr 必须要指定的参数,用于指定数据文件中数据的格式。在数据载入时,dmfldr 根据控制文件指定的格式来解析数据文件;导出数据时,dmfldr 也会根据控制文件指定的列分隔符、行分隔符等生成数据文件。
展示一个控制文件定义导入或导出数据文件的格式,以及对应的表的映射
##路径:/dm/dmdbms/dmfldr/dep.ctl
OPTIONS
(
SKIP = 0
ROWS = 50000
DIRECT = TRUE
INDEX_OPTION = 2
)
LOAD DATA
INFILE '/dm/dmdbms/dmfldr/dep.txt'
BADFILE '/dm/dmdbms/dmfldr/dep.bad'
INTO TABLE DEPARTMENTS
FIELDS '|'
(
DEPARTMENT_ID,
DEPARTMENT_NAME,
MANAGER_ID,
LOCATION_ID
)
##OPTIONS 选项中定义了 SKIP、ROWS、DIRECT 和 INDEX_OPTION 参数
##LOAD选项中:
##指定了数据文件和数据文件的换行符,还指定了 BADFILE 文件
##指定了操作的数据库基表、列分隔符以及列定义
3.2指定数据文件
指定数据文件的方式有三种:一是在控制文件中指定;二是通过命令行参数 DATA 直接指定;三是使用 dmfldr.ini 指定。使用其中一种方式指定即可。
当 dmfldr 工作在 IN 模式时,从数据文件中读取数据并载入数据库;当工作在 OUT 模式时,从数据库中将指定数据导出到数据文件。
数据文件通常为文本文件,列与列之间由列分隔符隔开,行与行之间由行分隔符隔开。数据文件中的列分隔符和行分隔符由用户指定,并在控制文件中设置为与数据文件中的一致。
3.2.1在控制文件中指定数据文件
展示如何使用控制文件进行载入
##建表TEST
CREATE TABLE TEST(C1 INT,C2 INT,C3 DATE);
##编辑数据文件test.txt,存放路径为/dm/dmfldr/test.txt,文件内容如下
1 1|2015-11-06
2 2|2015-11-05
3 3|2015-11_04
##编辑控制文件test.ctl,存放路径为/dm/dmfldr/test.ctl,内容如下
LOAD DATA
INFILE '/dm/dmfldr/test.txt'
INTO TABLE TEST
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2,
C3 DATE FORMAT 'yyyy-mm-dd'
)
##使用dmfldr进行数据载入
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\'
3.2.2使用DATA参数指定数据文件
也可以使用 DATA 参数指定 dmfldr 的数据文件。用户可以在命令行中直接指定 DATA 参数,也可以在 dmfldr.ini 配置文件中指定 DATA 参数。如果控制文件中数据文件路径指定为‘**’*,那么会使用命令行或 dmfldr.ini 配置文件中指定的 DATA 参数来替换‘*’,优先使用命令行中指定的 DATA 参数进行替换。
展示如何使用 DATA 参数指定数据文件进行载入
##建表TEST
DROP TABLE TEST;
CREATE TABLE TEST(C1 INT,C2 INT,C3 DATE);
##编辑数据文件test.txt,存放路径为/dm/dmfldr/test.txt,文件内容如下
1 1|2015-11-06
2 2|2015-11-05
3 3|2015-11_04
##编辑控制文件test.ctl,存放路径为/dm/dmfldr/test.ctl,内容如下
LOAD DATA
INFILE *
INTO TABLE test
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2,
C3 DATE FORMAT 'yyyy-mm-dd'
)
##使用dmfldr进行数据载入
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\' data=\'/dm/dmfldr/test.txt\'
3.3数据转换与错误数据文件
dmfldr 使用的数据文件都是文本格式的,其中的列值都是以字符串的方式保存在数据文件中。要想将这些数据载入数据库表中,需要将字符串转换成数据库表各列对应的数据类型。dmfldr 支持所有 DM 数据库支持的列定义类型,包括字符串、数值、时间日期、时间日期间隔、大字段类型等。
若数据文件的编码方式与 DM 数据库服务器的编码方式不一样,dmfldr 还需要进行字符编码的转换。dmfldr 支持 UTF-8、GBK 和 GB18030 编码之间的相互转换。
数据类型和编码转换工作由 dmfldr 客户端进行,在这个过程中如果出现错误,dmfldr 会跳过该行继续后面的工作,并记录错误行到 BADFILE 指定的文件。常见的出错的情况有以下几种:
·编码转换失败
·目标列为字符串类型时,数据长度大于列定义长度
·目标列为数值类型时,数据包含非法字符或者转换后超出该数值的范围
·目标列为日期类型时,dmfldr 默认按 yyyy-mm-dd hh:mi:ss 的格式解析,如果数据不是这样的格式,需要指定对应列的时间日期 fmt 格式
注意:BADFILE 仅作用于 dmfldr 的工作 MODE 为 IN 的情况下,MODE 为 OUT 时无效。
允许的最大容错个数由 ERRORS 选项设置,取值范围为 [0,4294967295] 之间的整数,默认为0。当 dmfldr 客户端在数据类型和编码转换过程中出现的错误个数超过了 ERRORS 所设置的数目,dmfldr 会停止载入,当前时间点的所有正确数据将会被提交到服务器端。如果载入过程中不允许出现错误则可以将 ERRORS 设置为 0;如果允许所有的错误出现,则可以将 ERRORS 设置为一个非常大的数。
展示错误数据文件的用法
##建表TEST
DROP TABLE TEST;
CREATE TABLE TEST(C1 INT,C2 INT,C3 DATE);
##编辑数据文件test.txt,存放路径为/dm/dmfldr/test.txt,文件内容如下
1 1|2015-11-06
2 2|2015-11-05
3 3|2015-11_04
44|aaaa-bbb-ccc
##编辑控制文件test.ctl,存放路径为/dm/dmfldr/test.ctl,内容如下
LOAD DATA
INFILE '/dm/dmfldr/test.txt'
INTO TABLE TEST
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2,
C3 DATE FORMAT 'yyyy-mm-dd'
)
##使用dmfldr进行数据载入
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\' badfile=\'/dm/dmfldr/test.bad\'
##查看错误数据文件/dm/dmfldr/test.bad,其内容如下
3.4服务器端错误数据处理
dmfldr 客户端将载入的数据进行数据转换和编码转换后,将转换正确的数据发往 DM 服务器的 dmfldr 模块,也就是 dmfldr 的服务器端,由其进行真正的数据载入工作。
dmfldr 客户端每次向服务器端发送一批数据,在服务器端插入数据的过程中,由于目的表上可能存在约束等原因,导致某些数据无法插入成功,此时服务器端会将这一批数据全部回滚,并将这批数据全部记为错误数据,但服务器端插入时的错误数据并不会记录到 BADFILE 中。
ERRORS 所统计的错误包含在数据转换和数据插入过程中所产生的数据错误,因此当服务器端插入数据记录的错误数据数加上客户端数据转换时的错误数据数超过 ERRORS 参数的指定值时,dmfldr 服务器会停止插入数据。
3.5大字段数据处理
dmfldr 支持对 DM 数据库的大字段类型数据的载入和导出,DM 数据库支持的大字段数据类型有 TEXT、LONGVARCHAR、IMAGE、LONGVARBINARY、BLOB 以及 CLOB。
3.5.1大字段数据的导出
当 dmfldr 工作在导出模式即 MODE 为 OUT 时,dmfldr 生成大字段对应的数据文件名由 LOB_FILE_NAME 指定,若未指定默认为 dmfldr.lob,文件存放于 LOB_DIRECTORY 指定的目录,如果未指定 LOB_DIRECTORY 则存放于指定的导出数据文件同一目录。
展示大字段数据的导出
##建表TEST
DROP TABLE TEST;
CREATE TABLE TEST(C1 INT,C2 BLOB,C3 CLOB);
##插入数据
INSERT INTO TEST VALUES(1,0XAB121032DE,'abcdefg');
INSERT INTO TEST VALUES(2,0XAB121032DE,'abcdefg');
COMMIT;
##编辑控制文件test.ctl,存放路径为/dm/dmfldr/test.ctl,内容如下
LOAD DATA
INFILE '/dm/dmfldr/test.txt'
INTO TABLE test
FIELDS '|'
(
C1,
C2,
C3
)
##使用dmfldr进行导出数据
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\' LOB_DIRECTORY=\'/dm/dmfldr/\' mode=\'out\'
##指定了 LOB_DIRECTORY,而没有指定 LOB_FILE_NAME,导出的大字段数据文件将存放在 LOB_DIRECTORY 指定的/opt/data 目录,文件名为 dmfldr.lob
3.5.2 DIRECT为TRUE时大字段数据的载入
当 MODE 为 IN 且 DIRECT 为 TRUE 时,此时数据载入若涉及到大字段对象,需要用户指定大字段数据文件。若 CLIENT_LOB 为 TRUE,LOB_DIRECTORY 应指定大字段数据文件所在的客户端本地目录,且此时待载入的大字段长度不得超过 2G,否则无法成功载入大字段;若 CLIENT_LOB 为 FALSE,用户必须先把相关文件传送到 DM 服务器所在主库,然后使用 LOB_DIRECTORY 指明存放目录。
大字段数据文件在数据文件中指定,可以是任意格式的文件。在数据文件中,大字段以“文件名:起始偏移:长度”的形式记录在数据文件中。指定的文件名无效时,dmfldr 会报错,装载失败。对于 CLOB 类型字段,当指定的偏移、长度范围内带有不完整字符时,dmfldr 将装载失败。
展示DIRECT为TRUE时大字段数据的载入
##建表TEST
DROP TABLE TEST;
CREATE TABLE TEST(C1 INT,C2 BLOB,C3 CLOB);
##编辑数据文件 test.txt,存放路径为 DM 服务器所在主库的/dm/dmfldr/test.txt,文件内容如下
1|testblob.txt:0:10|testclob.txt:0:10
2|testblob.txt:10:20|testclob.txt:10:20
3|testblob.txt:20:30|testclob.txt:20:30
##testblob.txt、testclob.txt 为文本文件,长度大于 30 字节,存放路径为/dm/dmfldr
##编辑控制文件test.ctl,存放路径为/dm/dmfldr/test.ctl,内容如下
LOAD DATA
INFILE '/dm/dmfldr/test.txt'
INTO TABLE test
FIELDS '|'
(
C1,
C2,
C3
)
##使用dmfldr进行导入数据
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\' LOB_DIRECTORY=\'/dm/dmfldr/\'
3.5.3 DIRECT为FALSE时大字段数据的载入
当 MODE 为 IN 且 DIRECT 为 FALSE 时,数据文件中大字段列数据即字段内容。此时,大字段数据长度不允许超过 32KB。BLOB_TYPE 参数指定 BLOB 列内容为十六进制或者字符串:
·BLOB_TYPE 为 HEX_CHAR 时,数据文件中 BLOB 列当作为十六进制内容;
·BLOB_TYPE 为 HEX 时,数据文件中 BLOB 列为字符串形式内容,导入后会转换为十六进制。
BLOB_TYPE 参数只对 DIRECT 为 FALSE 时有效,默认为 HEX_CHAR。
注意
不支持使用包含BLOB列的表生成的导出数据文件在导入时指定BLOB_TYPE为HEX_CHAR。
展示 DIRECT 为 FALSE 的大字段数据载入
##建表TEST
DROP TABLE TEST;
CREATE TABLE TEST(C1 INT,C2 BLOB,C3 CLOB);
##编辑数据文件 test.txt,存放路径为/dm/dmfldr/test.txt,文件内容如下
1|0x12d3c8a7|abcdefg
2|0x12a4cbac|hijlkmn
3|0x22d3c8b3|adefhjd
##编辑控制文件test.ctl,存放路径为/dm/dmfldr/test.ctl,内容如下
LOAD DATA
INFILE '/dm/dmfldr/test.txt'
INTO TABLE test
FIELDS '|'
(
C1,
C2,
C3
)
##使用dmfldr进行导入数据,BLOB_TYPE为HEX_CHAR
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\' direct=false blob_type=\'hex_char\'
##查询表数据
展示BLOB_TYPE为HEX时的数据装载
##清空TEST表
truncate table test;
##使用 dmfldr 进行导入数据,BLOB_TYPE 为 HEX
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\' direct=false blob_type=\'hex\'
##查询表数据
3.6日志文件及日志信息
dmfldr 的日志文件路径由 LOG 参数设置,默认日志文件名为 fldr.log。文件记录了装载过程中的装载信息和错误信息以及统计信息。用户也可以通过设置控制文件中的 OPTIONS 选项来指定日志路径。如果参数及 OPTION 中同时指定了日志路径则其将以 OPTION 中指定的路径为最终路径。
##使用dmfldr进行数据载入时,加上log参数
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\' log=\'/dm/dmfldr/test.log\'
##如果不指定LOG参数,默认日志文件名为
3.7自增列装载
自增列是比较特殊的列,为了保证数据库中自增列列值的正确性,用户在进行数据载入时需要特别注意。
当 DIRECT 参数为 FALSE 时,dmfldr 将把从数据文件中读取的自增列值作为目标值插入数据库表中,用户应当保证每一行的自增列的值符合自增列的规则,否则将造成数据混乱。
当 DIRECT 参数为 TRUE 时,dmfldr 提供了 SET_IDENTITY 参数(缺省为 FALSE)对数据载入时自增列的处理进行设置:
·如果指定 SET_IDENTITY 选项值为 TRUE,则 dmfldr 将把从数据文件中读取的自增列值作为目标值插入数据库表中,用户应当保证每一行的自增列的值符合自增列的规则,否则将造成数据混乱;
·如果 SET_IDENTITY 选项值设置为 FALSE,则 dmfldr 将忽略数据文件中对应自增列的值,服务器将根据自增列定义和表中已有数据自动生成自增列的值插入每一行的对应列。
展示自增列的装载
##建表TEST,并插入两行数据
DROP TABLE TEST;
CREATE TABLE TEST(C1 INT IDENTITY(1,1),C2 VARCHAR);
INSERT INTO TEST(C2) VALUES('AAA');
INSERT INTO TEST(C2) VALUES('BBB');
COMMIT;
##查询表数据
##编辑数据文件 test.txt,存放路径为/dm/dmfldr/test.txt,文件内容如下
2|aaa
3|bbb
4|ccc
##编辑控制文件 test.ctl,存放路径为/dm/dmfldr/test.ctl,内容如下
LOAD DATA
INFILE '/dm/dmfldr/test.txt'
INTO TABLE test
FIELDS '|'
(
C1,
C2
)
##使用dmfldr进行数据装载
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\' direct=true set_identity=false
##再次查看表TEST的数据
##表TEST 中已有两行数据,由于 SET_IDENTITY 置为 FALSE,因此在数据载入时 dmfldr 根据 C1 列的定义和表中已有数据,为 C1 列重新插入合适的值。
展示 SET_IDENTITY 置为 TRUE 时的装载
##清空表TEST,并重新插入数据
TRUNCATE TABLE TEST;
INSERT INTO TEST(C2) VALUES('AAA');
INSERT INTO TEST(C2) VALUES('BBB');
COMMIT;
##使用dmfldr进行数据装载
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\' direct=true set_identity=true
##查看表TEST的数据
3.8数据排序
SORTED 参数用来设置数据是否已经按照聚集索引排序,缺省为 FALSE。
如果设置为 TRUE,则用户必须保证数据已按照聚集索引排序完成,并且如果表中存在数据,需要插入的数据索引值要比表中数据的索引值大,服务器在做插入操作时顺序进行插入。若数据并未按照索引排序,则 dmfldr 会报错,装载失败。对于存在分区表的情况,当数据未按照索引排序时,使用 dmfldr 向分区表进行装载,可能能够成功装载全部数据;也可能仅能成功装载部分数据或装载失败,此时 dmfldr 会报错;成功装载入子表的数据排序正确。
如果设置为 FALSE,则服务器对于每条记录进行定位插入。
此参数仅在 MODE 为 IN 且 DIRECT 为 TRUE 的情况下有效。
在数据量大,并且确定数据已按照聚集索引排序完成的情况下,将 SORTED 参数设置为 TRUE,可以提升装载性能。
展示数据排序
##建表TEST
DROP TABLE TEST;
CREATE TABLE TEST(C1 INT CLUSTER PRIMARY KEY,C2 VARCHAR);
##编辑数据文件 test.txt,存放路径为/dm/dmfldr/test.txt,文件内容如下
2|aaa
3|bbb
4|ccc
5|ddd
1|zzz
##编辑控制文件 test.ctl,存放路径为/dm/dmfldr/test.ctl,内容如下
LOAD DATA
INFILE '/dm/dmfldr/test.txt'
INTO TABLE test
FIELDS '|'
(
C1,
C2
)
##使用dmfldr进行数据载入
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\' sorted=true
##数据文件中的数据并没有按照
不能使用
3.9空值处理
dmfldr 通过设置 NULL_MODE 参数来处理空值。
·设置为 TRUE,载入时 NULL 字符串处理为 NULL,载出时空值处理为 NULL 字符串
·设置为 FALSE,载入时 NULL 字符串处理为字符串,载出时空值处理为空串
展示null_mode为true时的空值处理
##建表TEST
DROP TABLE TEST;
CREATE TABLE TEST(C1 INT,C2 VARCHAR);
##编辑数据文件test.txt,存放路径为/dm/dmfldr/test.txt,文件内容如下
1|aaa
2|NULL
3|null
##编辑控制文件test.ctl,存放路径为/dm/dmfldr/test.ctl,内容如下
LOAD DATA
INFILE '/dm/dmfldr/test.txt'
INTO TABLE test
FIELDS '|'
(
C1,
C2
)
##使用dmfldr进行数据载入
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\' null_mode=true
##查看表TEST 的数据,数据文件中 C2 列的“NULL”和“null”字符串都被处理为空值
SELECT C1, IFNULL(C2, 'NULL VALUE') FROM TEST;
展示 null_mode 为 false 时的空值处理
##清空表TEST
TRUNCATE TABLE TEST;
##使用dmfldr进行数据载入
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\' null_mode=false
##查看表 TEST 的数据,数据文件中 C2 列的“NULL”和“null”字符串直接被作为字符串值插入表中
SELECT C1, IFNULL(C2, 'NULL VALUE') FROM TEST;
3.10条件过滤
通过在控制文件中指定 WHEN<field_conditions>子句,可以在装载过程中对数据进行过滤,符合 field_conditions 条件的数据才会被装载。
对于条件过滤的使用需注意以下几点:
·判断条件中的操作符仅支持比较相等和不相等,即=、!=和<>这三个比较操作符;
·目前仅支持使用 AND 连接多个过滤条件;
·BLANKS 和 WHITESPACE 表示若干个空格;
·判断条件若使用(p1:p2)作为比较表达式,其意义与在 POSTION 子句中的意义相同,表示从该行指定位置获取数据进行比较,起始位置和结束位置表示的都是字节位置,包含边界 p1,p2;
·如果判断条件中使用 colid 作为比较表达式,该列必须在 INTO 表的 coldef_option 中进行说明;
·如果判断条件中使用 colid 作为比较表达式,判断条件中使用的列仅用于过滤,并没有对应表中的某个实际列,应在 col_def 中指明 FILLER 属性表示装载时跳过该列;
·如果判断条件中比较数据是字符常量值,其长度小于比较表达式长度,则在其之后补充空格;如果判断条件中比较数据是二进制串常量,其长度小于比较表达式长度,则在之后补充 0。
展示条件过滤
##建表TEST
DROP TABLE TEST;
CREATE TABLE TEST(C1 INT,C2 INT);
##编辑数据文件 test.txt,存放路径为/dm/dmfldr/test.txt,文件内容如下
12
23
32
48
91
##编辑控制文件 test.ctl,存放路径为/dm/dmfldr/test.ctl,内容如下
LOAD DATA
INFILE '/dm/dmfldr/test.txt'
INTO TABLE test
WHEN C1 != '2'
(
C1 position (1:1),
C2 position (2:2)
)
##使用dmfldr进行数据载入
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\'
##查看表 TEST 的数据,可以看到数据文件中的行 2,3 被过滤掉了
3.11多表装载
通过在控制文件中指定多个 INTO TABLE 子句,可以将一批数据同时向多个表进行装载。每个 INTO TABLE 子句中都可以指定 WHEN 过滤条件、FIELDS 子句和列定义子句。
对于多表装载的使用需注意以下几点:
·每个 INTO TABLE 子句的目标表必须是不同的表;
·多表装载时不支持直接装载分区表子表;
·对于第二个及其之后的 INTO TABLE 子句,在其 coldef_option 中,必须为第一列指定 POSITION 选项;
##建表TEST1、TEST2
CREATE TABLE TEST1(C1 INT,C2 INT);
CREATE TABLE TEST2(C1 INT,C2 INT);
##编辑数据文件test.txt,存放路径为/dm/dmfldr/test.txt,文件内容如下
1,2
2,3
3,2
4,8
9,1
##编辑控制文件 test.ctl,存放路径为/dm/dmfldr/test.ctl,内容如下
LOAD DATA
INFILE '/dm/dmfldr/test.txt'
INTO TABLE test1
WHEN C1 != '1'
FIELDS ','
(
c1 position (1:1),
c2 position (3:3)
)
INTO TABLE test2
WHEN (3:3) = '2' AND c1 != '3'
FIELDS ','
(
c1 position (1:1),
c2 position (3:3)
)
使用dmfldr进行数据载入
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/dm/dmfldr/test.ctl\'
##查看表TEST1和TEST2的数据如下:
3.12提升dmfldr性能
用户在使用 dmfldr 时根据系统和数据的具体情况对一些参数进行调整,可以获得更好的性能,这些参数包括:
·BUFFER_NODE_SIZE
BUFFER_NODE_SIZE 设置读取文件缓冲区页大小,值越大,缓冲区的页越大,每次读取的数据就越多,每次发送到服务器的数据也就越多,效率越高。但其大小受 dmfldr 客户端内存大小限制。
·READ_ROWS
在某些情况下,BUFFER_NODE_SIZE 读入的数据行数很大,而后续操作处理不了这么大的行数,此时可以用 READ_ROWS 来限制处理的行数。dmfldr 取 READ_ROWS 和 BUFFER_NODE_SIZE 中较小的值作为一次处理的行数。
·SEND_NODE_NUMBER
指定 dmfldr 在数据载入时发送节点的个数,默认由系统计算一个初始值。若在数据载入时发现发送节点不够用,系统会动态增加分配。在系统内存足够的情况下,可以适当设大 SEND_NODE_NUMBER 值,提升 dmfldr 载入性能。
·TASK_THREAD_NUMBER
指定 dmfldr 在数据载入时处理用户数据的线程数目。默认情况下,dmfldr 将该参数值设为系统 CPU 的个数,但当 CPU 个数大于 8 时,默认值都被置为 8。在 dmfldr 客户端所在机器 CPU 大于 8 环境中,提高 TASK_THREAD_NUMBER 值可以提升 dmfldr 装载性能。
·BLDR_NUM
水平分区表装载时,指定服务器 BLDR 的最大个数,缺省为 64。
服务器的 BLDR 保存水平分区子表相关信息,BLDR_NUM 的设置也就指定了服务器能同时载入的水平分区子表的个数。若 BLDR_NUM 设置太大,当水平分区子表数过多时,可能会导致服务器内存不足。当载入时实际需要的 BLDR 个数超出 BLDR_NUM 设置时,会淘汰指定子表的 BLDR,并替换为新的子表 BLDR。
·BDTA_SIZE
BDTA(Batch Data)的大小,缺省为 5000。
BDTA 代表 DM 数据库批量数据处理机制中一个批量,在内存、CPU 允许的条件下,增大 BDTA_SIZE 能加快装载速度;在网络是装载性能瓶颈时,增大 BDTA_SIZE 影响不大。
·INDEX_OPTION
索引的设置选项,缺省为 1。INDEX_OPTION 的可选项有 1、2 和 3。
1 代表服务器装载数据时先不刷新二级索引,而是将新数据按照索引预先排序,在装载完成后,再将排好序的数据插入索引。如果在数据载入前,目标表中已有较多数据,建议 INDEX_OPTION 置为 1。
2 代表服务器在快速装载过程中不刷新二级索引数据,只在装载完成时重建所有二级索引。如果在数据载入前,目标表中没有数据或数据量较小,建议 INDEX_OPTION 置为 2。
3 代表服务器使用追加模式来进行二级索引的插入,在数据装载的过程中,同时进行二级索引的插入,若未禁用全局索引,则在非 DPC 环境下,全局索引可通过设置 INDEX_OPTION 为 3 进行插入。当原有数据量远大于插入数据量时,建议 INDEX_OPTION 置为 3。
3.13 dmfldr使用限制
dmfldr 的使用存在以下一些限制:
·不支持向临时表、外部表装载数据
·不支持向系统表装载数据
·不支持向带有位图索引的表装载数据
·不支持向带有函数索引的表装载数据
·不支持向带有全文索引的表装载数据
·不支持向 DCP 代理装载数据
·不支持在 DPC 环境下,向带有全局索引的表装载数据
·dmfldr 装载时会对约束进行检查,对各种约束的处理机制如下表所示;由于 dmfldr 不处理约束的有效性,都视为有效,故需要用户自行处理约束有效性等相关内容
约束 | 数据不满足时 | 数据插入与否 | 约束是否有效 |
非空约束(NOT NULL) | 报错 | 不插入 | 有效 |
聚集索引(CLUSTER PRIMARY KEY) | 报错 | 不插入 | 有效 |
唯一约束(UNIQUE, PRIMARY KEY) | 报错 | 插入 | 有效 |
引用约束(FOREIGN KEY) | 不报错 | 插入 | 有效 |
CHECK 约束(CHECK) | 不报错 | 插入 | 有效 |
注意:
当数据不满足唯一约束时,唯一约束仍有效,但相关联的唯一索引将会失效。
达梦社区: https://eco.dameng.com