DM8 dmfldr(快速数据装载)
1. DM Fast Loader 概述
1) DMFLDR 架构
dmfldr (DM Fast Loader)是DM 提供的快速数据装载命令行工具。用户通过使用dmfldr 工具能够把按照一定格式排序的文本数据以简单、快速、高效的方式载入到DM 数据库中,或把DM 数据库中的数据按照一定格式写入文本文件。
dmfldr 的系统结构如图

如图所示,dmfldr 实际上除了客户端工具,还包含一个在数据库服务器中的dmfldr 功能模块,它们共同完成dmfldr 的各项功能。
当进行数据载入时,dmfldr客户端接收用户提交的命令与参数,分析控制文件与数据文件,将数据打包发送给服务器端的dmfldr模块,由服务器完成数据的真正装载工作。并分析服务器返回的消息,必要时根据用户参数指定生成日志文件与错误数据文件。
当进行数据导出时,dmfldr客户端接收用户提交的命令与参数,分析控制文件,将用户要求转换成相应消息发送给服务器端的dmfldr模块。服务器解析并打包需要导出的数据,发送给dmfldr客户端,客户端将数据写入指定的数据文件,必要时根据用户参数指定生成日志文件。
2) 提升 dmfldr 性能的方法
用户在使用 dmfldr 时根据系统和数据的具体情况对一些参数进行调整,可以获得更好的性能,这些参数包括:
|
A. BUFFER_NODE_SIZE BUFFER_NODE_SIZE 设置读取文件缓冲区页大小,值越大,缓冲区的页越大,每次读取的数据就越多,每次发送到服务器的数据也就越多,效率越高。但其大小受dmfldr客户端内存大小限制。 B. READ_ROWS 在某些情况下,BUFFER_NODE_SIZE读入的数据行数很大,而后续操作处理不了这么大的行数,此时可以用READ_ROWS来限制处理的行数。dmfldr取READ_ROWS和BUFFER_NODE_SIZE中较小的值作为一次处理的行数。 C. SEND_NODE_NUMBER 指定dmfldr在数据载入时发送节点的个数,默认由系统计算一个初始值。若在数据载入时发现发送节点不够用,系统会动态增加分配。在系统内存足够的情况下,可以适当设大SEND_NODE_NUMBER值,提升dmfldr载入性能。 D. TASK_THREAD_NUMBER 指定dmfldr在数据载入时处理用户数据的线程数目。默认情况下,dmfldr将该参数值设为系统CPU的个数,但当CPU个数大于8时,默认值都被置为8。在dmfldr客户端所在机器CPU大于8环境中,提高TASK_THREAD_NUMBER值可以提升dmfldr装载性能。 E. BLDR_NUM 水平分区表装载时,指定服务器BLDR的最大个数,默认为64。 服务器的BLDR保存水平分区子表相关信息,BLDR_NUM的设置也就指定了服务器能同时载入的水平分区子表的个数。若BLDR_NUM设置太大,当水平分区子表数过多时,可能会导致服务器内存不足。当载入时实际需要的BLDR个数超出BLDR_NUM设置时,会淘汰指定子表的BLDR,并替换为新的子表BLDR。 F. BDTA_SIZE BDTA (Batch Data)的大小,默认为5000。 BDTA 代表DM数据库批量数据处理机制中一个批量,在内存、CPU允许的条件下,增大BDTA_SIZE能加快装载速度;在网络是装载性能瓶颈时,增大BDTA_SIZE影响不大。 G. INDEX_OPTION 索引的设置选项,默认为1。INDEX_OPTION的可选项有1、2和3。 1 代表服务器装载数据时先不刷新二级索引,而是将新数据按照索引预先排序,在装载完成后,再将排好序的数据插入索引。如果在数据载入前,目标表中已有较多数据,建议INDEX_OPTION置为1。 2 代表服务器在快速装载过程中不刷新二级索引数据,只在装载完成时重建所有二级索引。如果在数据载入前,目标表中没有数据或数据量较小,建议INDEX_OPTION置为2。 3 代表服务器使用追加模式来进行二级索引的插入, 在数据装载的过程中, 同时进行二级索引的插入, 当原有数据量远大于插入数据量时, 建议INDEX_OPTION置为3。 |
3) dmfldr 的使用限制
dmfldr 的使用存在以下一些限制:
|
A. 不支持向临时表、外部表装载数据 B. 不支持向系统表装载数据 C. 不支持向带有位图索引的表装载数据 D. 不支持向带有函数索引的表装载数据 E. 不支持向带有全文索引的表装载数据 F. 不支持向DCP代理装载数据 |
dmfldr 装载时,对约束进行检查,对各种约束的处理机制如下表所示

2. DMFLDR 语法说明
1) dmfldr 语法格式
dmfldr 的使用必须指定必要的参数,USERID和CONTROL是启动dmfldr必须要指定的参数,且USERID必须是第一个参数,CONTROL必须是第二个参数。
dmfldr 使用较为灵活,参数较多,用户可以使用“dmfldr help”查看各参数的简单信息。
|
[dmdba@mevi4 ~]$ dmfldr help 格式: ./dmfldr KEYWORD=value
例程: ./dmfldr SYSDBA/SYSDBA CONTROL='/opt/data/fldr.ctl'
USERID 必须是命令行中的第一个参数 CONTROL 必须是命令行中的第二个参数
字符串类型参数必须以引号封闭
关键字 说明(默认值) -------------------------------------------------------------------------------- USERID 用户名/口令 格式:USER/PWD@SERVER:PORT#SSL_PATH@SSL_PWD 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 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 环境,是否只生成单个数据文件(FALSE) LAN_MODE MPP 环境,是否以内网模式装载数据(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环境导入数据时有效 PARALLEL 是否开启并行装载(FALSE) SQL 使用自定义查询语句,仅导出模式有效 HELP 打印帮助信息 |
2) 控制文件格式
控制文件 CONTROL 是启动 dmfldr 必须要指定的参数,用于指定数据文件中数据的格式。在数据载入时, dmfldr 根据控制文件指定的格式来解析数据文件;导出数据时, dmfldr 也会根据控制文件指定的列分隔符、行分隔符等生成数据文件。
控制文件中还可以指定其他 dmfldr 参数值。
dmfldr 控制文件的语法如下所示:
|
[OPTIONS(
…… )] LOAD [DATA]
INFILE <
[BADFILE [APPEND|REPLACE|INSERT]
[EP
[WHEN
[FIELDS [TERMINATED BY] [X]
[
[
|
3. DMFLDR 使用示例
1) 普通文本处理
创建测试表mevi.test
SQL> create table mevi.test(c1 int,c2 int,c3 date);
编辑数据文件test.txt,存放路径为/dmdata/fldr/test.txt,文件内容如下
[dmdba@mevi4 fldr]$ cat test.txt
|
1 1|2015-11-06 2 2|2015-11-05 3 3|2015-11_04 |
编辑控制文件test.ctrl,存放路径为/dmdata/fldr/test.ctrl,内容如下
[dmdba@mevi4 fldr]$ cat test.ctrl
|
LOAD DATA INFILE '/dmdata/fldr/test.txt' INTO TABLE mevi.test FIELDS '|' ( C1 TERMINATED BY ' ', C2, C3 DATE FORMAT 'YYYY-MM-DD' ) |
使用dmfldr进行数据载入
# 在linux 系统中路劲这里必须转移一下,Win平台不需要转义:
|
[dmdba@mevi4 ~]$ dmfldr userid=SYSDBA/SYSDBA@MEVI control=\'/dmdata/fldr/test.ctrl\' log=\'/dmdata/fldr/test.log\' |
从日志输出,告诉我们成功导入3行,注意源文件中最后一行的日期格式。
查询验证:
|
SQL> select * from mevi.test;
行号 C1 C2 C3 ---------- ----------- ----------- ---------------------------------------------------------------------------------------------------- 1 1 1 2015-11-06 00:00:00 2 2 2 2015-11-05 00:00:00 3 3 3 2015-11-04 00:00:00 |
2) 处理失败和跳行处理
继续使用之前的环境,修改源文件如下:
[dmdba@mevi4 fldr]$ cat test.txt
|
C1 C2 C3 4 4|2016-11-06 5 5|2016-11-05 6 6|2016-11_04 A A|xxxx-yy-zz |
有3点要求:
A. 加了数据的列头,这个不需要导入,需要跳过。
B. 最后一行,格式不对,无法导入。
C. 导入的时候是追加的模式,控制文件模式有三种模式:replace,insert,append。这里使用append。
根据要求修改之后的控制文件如下:
[dmdba@mevi4 fldr]$ cat test.ctrl
|
OPTIONS ( SKIP = 1 ERRORS = 1 )
LOAD DATA INFILE '/dmdata/fldr/test.txt' BADFILE '/dmdata/fldr/test.bad'
APPEND INTO TABLE mevi.test FIELDS '|' ( C1 TERMINATED BY ' ', C2, C3 DATE FORMAT 'YYYY-MM-DD' ) |
导入数据
|
[dmdba@mevi4 fldr]$ dmfldr userid=SYSDBA/SYSDBA@MEVI control=\'/dmdata/fldr/test.ctrl\' log=\'/dmdata/fldr/test.log\' |
查看数据是否追加了:
|
SQL> select * from mevi.test;
行号 C1 C2 C3 ---------- ----------- ----------- ---------------------------------------------------------------------------------------------------- 1 1 1 2015-11-06 00:00:00 2 2 2 2015-11-05 00:00:00 3 3 3 2015-11-04 00:00:00 4 4 4 2016-11-06 00:00:00 5 5 5 2016-11-05 00:00:00 6 6 6 2016-11-04 00:00:00 |
[dmdba@mevi4 fldr]$ cat test.bad
dmfldr: 2020-07-31 14:58:01 MEVI->TEST A A|xxxx-yy-zz
3) 测试多表导入
对于多表装载的使用需注意以下几点:
A. 每个INTO TABLE子句的目标表必须是不同的表;
B. 多表装载时不支持直接装载分区表子表;
C. 对于第二个及其之后的INTO TABLE子句,在其coldef_option中,必须为第一列指定POSITION选项;
SQL> create table mevi.test1 as select * from mevi.test where 1=0;
SQL> create table mevi.test2 as select * from mevi.test where 1=0;
修改控制文件
|
[dmdba@mevi4 fldr]$ cat test.ctrl OPTIONS ( SKIP = 1 ERRORS = 1 )
LOAD DATA INFILE '/dmdata/fldr/test.txt' BADFILE '/dmdata/fldr/test.bad'
INTO TABLE mevi.test1 FIELDS '|' ( C1 TERMINATED BY ' ', C2, C3 DATE FORMAT 'YYYY-MM-DD' )
INTO TABLE mevi.test2 FIELDS '|' ( C1 position (1:1) TERMINATED BY ' ', C2, C3 DATE FORMAT 'YYYY-MM-DD' ) |
导入数据
|
[dmdba@mevi4 fldr]$ dmfldr userid=SYSDBA/SYSDBA@MEVI control=\'/dmdata/fldr/test.ctrl\' log=\'/dmdata/fldr/test.log\' |
查看数据
|
SQL> select * from mevi.test1;
行号 C1 C2 C3 ---------- ----------- ----------- ---------------------------------------------------------------------------------------------------- 1 4 4 2016-11-06 00:00:00 2 5 5 2016-11-05 00:00:00 3 6 6 2016-11-04 00:00:00 SQL> select * from mevi.test2;
行号 C1 C2 C3 ---------- ----------- ----------- ---------------------------------------------------------------------------------------------------- 1 4 4 2016-11-06 00:00:00 2 5 5 2016-11-05 00:00:00 3 6 6 2016-11-04 00:00:00 |
[dmdba@mevi4 fldr]$ cat test.bad
dmfldr: 2020-07-31 15:49:29 MEVI->TEST1 A A|xxxx-yy-zz
dmfldr: 2020-07-31 15:49:29 MEVI->TEST2 A A|xxxx-yy-zz
4) 大对象处理
dmfldr 支持对DM数据库的大字段类型数据的载入和导出,DM数据库支持的大字段数据类型有TEXT、LONGVARCHAR、IMAGE、LONGVARBINARY、BLOB以及CLOB。
A. 大字段数据的导出
当dmfldr工作在导出模式即MODE为OUT时,dmfldr生成大字段对应的数据文件名由LOB_FILE_NAME指定,若未指定默认为dmfldr.lob,文件存放于LOB_DIRECTORY指定的目录,如果未指定LOB_DIRECTORY则存放于指定的导出数据文件同一目录。
|
建表MEVI.T_LOB SQL> create table mevi.t_lob(c1 int,c2 blob,c3 clob); 插入数据 SQL> insert into mevi.t_lob values(1,0xab121032de,'abcdefg'); SQL> insert into mevi.t_lob values(2,0xab121032de,'abcdefg'); SQL> commit; 编辑控制文件t_lob.ctrl,存放路径为 /dmdata/fldr /t_lob.ctrl ,内容如下: [dmdba@mevi4 fldr]$ cat t_lob.ctrl LOAD DATA INFILE '/dmdata/fldr/t_lob.txt' INTO TABLE mevi.t_lob FIELDS '|' ( C1, C2, C3 ) 进行导出数据 [dmdba@mevi4 fldr]$ dmfldr userid=SYSDBA/SYSDBA@mevi control=\'/dmdata/fldr/t_lob.ctrl\' LOB_DIRECTORY=\'/dmdata/fldr/\' mode=\'out\' LOB_FILE_NAME=\'t_lob\' # 非lob 数据: # 在数据文件中,大字段以“文件名:起始偏移:长度”的形式记录在数据文件中。 [dmdba@mevi4 fldr]$ cat t_lob.txt 1|t_lob:0:5|t_lob:5:7 2|t_lob:12:5|t_lob:17:7 #lob 数据: [dmdba@mevi4 fldr]$ cat t_lob defgdefg[dmdba@mevi4 fldr]$ 没有指定LOB_FILE_NAME时,导出的大字段数据文件名为dmfldr.lob。 |
B. DIRECT 为TRUE时大字段数据的载入
当 MODE 为 IN 且 DIRECT 为 TRUE 时,此时数据载入若涉及到大字段对象,需要用户指定大字段数据文件。若 CLIENT_LOB 为 TRUE , LOB_DIRECTORY 应指定大字段数据文件所在的客户端本地目录;若 CLIENT_LOB 为 FALSE ,用户必须先把相关文件传送到 DM 服务器所在主库,然后使用 LOB_DIRECTORY 指明存放目录
大字段数据文件在数据文件中指定,可以是任意格式的文件。在数据文件中,大字段以“文件名:起始偏移:长度”的形式记录在数据文件中。指定的文件名无效时, dmfldr 会报错,装载失败。对于 CLOB 类型字段,当指定的偏移、长度范围内带有不完整字符时, dmfldr 将装载失败。
|
编辑数据文件t_lob.txt,存放路径为DM服务器所在主库的/dmdata/fldr/t_lob.txt,文件内容如下 [dmdba@mevi4 fldr]$ cat t_lob.txt 1|t_lobblob.txt:0:10|t_lobclob.txt:0:10 2|t_lobblob.txt:10:20|t_lobclob.txt:10:20 3|t_lobblob.txt:20:30|t_lobclob.txt:20:30 其中,t_lobblob.txt、t_lobclob.txt为文本文件,长度大于30字节,存放路径为/dmdata/fldr。 编辑控制文件t_lob.ctrl,存放路径为/dmdata/fldr/t_lob.ctrl,内容如下: [dmdba@mevi4 fldr]$ cat t_lob.ctrl LOAD DATA INFILE '/dmdata/fldr/t_lob.txt' INTO TABLE mevi.t_lob FIELDS '|' ( C1, C2, C3 ) 使用dmfldr进行导入数据 [dmdba@mevi4 fldr]$ dmfldr userid=SYSDBA/SYSDBA@mevi control=\'/dmdata/fldr/t_lob.ctrl\' LOB_DIRECTORY=\'/dmdata/fldr/\' |
C. DIRECT 为FALSE时大字段数据的载入
MODE 为IN且DIRECT为FALSE时,数据文件中大字段列数据即字段内容。BLOB_TYPE参数指定BLOB列内容为十六进制或者字符串:
BLOB_TYPE 为HEX_CHAR时,数据文件中BLOB列当作为十六进制内容;
BLOB_TYPE 为HEX时,数据文件中BLOB列为字符串形式内容,导入后会转换为十六进制。
BLOB_TYPE 参数只对DIRECT为FALSE时有效,默认为HEX_CHAR。
|
编辑数据文件t_lob.txt,存放路径为/dmdata/fldr/t_lob.txt,文件内容如下 [dmdba@mevi4 fldr]$ cat /dmdata/fldr/t_lob.txt 1|0x12d3c8a7|abcdefg 2|0x12a4cbac|hijlkmn 3|0x22d3c8b3|adefhjd 编辑控制文件t_lob.ctrl,存放路径为/dmdata/fldr/t_lob.ctrl,内容如下: [dmdba@mevi4 fldr]$ cat t_lob.ctrl LOAD DATA INFILE '/dmdata/fldr/t_lob.txt' INTO TABLE mevi.t_lob FIELDS '|' ( C1, C2, C3 ) 使用dmfldr进行导入数据,BLOB_TYPE为HEX_CHAR [dmdba@mevi4 fldr]$ dmfldr userid=SYSDBA/SYSDBA@mevi control=\'/dmdata/fldr/t_lob.ctrl\' direct=false blob_type=\'hex_char\' 查询表数据 SQL> select * from mevi.t_lob;
行号 C1 C2 C3 ---------- ----------- ---------- -------- 1 1 0x12D3C8A7 abcdefg 2 2 0x12A4CBAC hijlkmn 3 3 0x22D3C8B3 adefhjd 使用dmfldr进行导入数据,BLOB_TYPE为HEX [dmdba@mevi4 fldr]$ dmfldr userid=SYSDBA/SYSDBA@mevi control=\'/dmdata/fldr/t_lob.ctrl\' direct=false blob_type=\'hex\' 查询表数据 SQL> select * from mevi.t_lob;
行号 C1 C2 C3 ---------- ----------- ---------------------- -------- 1 1 0x12D3C8A7 abcdefg 2 2 0x12A4CBAC hijlkmn 3 3 0x22D3C8B3 adefhjd 4 1 0x30783132643363386137 abcdefg 5 2 0x30783132613463626163 hijlkmn 6 3 0x30783232643363386233 adefhjd |