DM8 dmfldr(快速数据装载)

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]

::= 参数

::=

::= [LIST] [] [, []]

::= DIRECTORY []

::= 文件地址

::=STR [X]

::= {}

::=INTO TABLE [.]

[EP ]

[WHEN ]

[FIELDS [TERMINATED BY] [X] ]

[]

[]

::= 模式名

::= 表名

::=()

::= 整型数字列表,以逗号分隔

::= { AND }

::= [(] [)]

::= | (p1:p2)

::= = | <> | !=

::= [X] '< 字符串常量 >' | BLANKS | WHITESPACE

::='< 字符串常量 >'

::=({ ,})

::= [FILLER][][][] [][][]

::= 列名

::= | NULL

::=position(p1:p2) | position(p1)

::=DATE FORMAT '< 时间日期格式串 >'

::= TERMINATED [BY]

::= WHITESPACE|[X]

::= [OPTIONALLY] ENCLOSE [BY] [X]

::= CONSTANT "< 常量 >"

::= " 函数名称 ()"

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


请使用浏览器的分享功能分享到微信等