达梦数据库dmfldr快速装载工具的使用

       在达梦数据库中,有几种常用的数据迁移工具。1.DTS  2.DEXP  3.DMETL  4.DMHS  5.DMFLDR

       在进行数据迁移时,需根据不同情况选择不同的迁移工具。dmfldr适合数据量特别巨大的情况,且性能相比其他工具更好,但是功能性方面较差。本文主要介绍如何使用dmfldr快速装载工具进行DM数据库中表数据的快速载入和导出。 

1 概述

1.1功能简介

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

1.2系统结构

       dmfldr的系统结构如下图所示。

       如图所示,dmfldr实际上除了客户端工具,还包含一个在数据库服务器中的dmfldr功能模块,它们共同完成dmfldr的各项功能。

  1. 当进行数据载入时,dmfldr客户端接收用户提交的命令与参数,分析控制文件与数据文件,将数据打包发送给服务器端的dmfldr模块,由服务器完成数据的真正装载工作。并分析服务器返回的消息,必要时根据用户参数指定生成日志文件与错误数据文件。
  2. 当进行数据导出时,dmfldr客户端接收用户提交的命令与参数,分析控制文件,将用户要求转换成相应消息发送给服务器端的dmfldr模块。服务器解析并打包需要导出的数据,发送给dmfldr客户端,客户端将数据写入指定的数据文件,必要时根据用户参数指定生成日志文件。  

2 dmfldr入门

2.1启动dmfldr 

       安装好 DM7 数据库管理系统后,在安装目录的“bin”子目录下可找到 dmfldr 执行文件。

       启动操作系统的命令行窗口,进入“dmfldr”所在目录,如果配置了环境变量,则可以在任何位置启动,可以准备启动 dmfldr 工具了。

       dmfldr 的使用必须指定必要的参数,否则工具会报错“无效的参数个数”并退出。为dmfldr指定参数的格式为:

       dmfldrkeyword=value [keyword=value ...]

       例如:

               dmfldr USERID=SYSDBA/SYSDBACONTROL='c:\fldr.ctl'

       如例子所示,USERID 和CONTROL 是启动 dmfldr 必须要指定的参数,且 USERID 必须是第一个参数,CONTROL 必须是第二个参数。

2.2查看dmfldr参数

       dmfldr 使用较为灵活,参数较多,用户可以使用“dmfldr help”查看各参数的简单信息。

       dmfldr help

       格式: DMFLDR KEYWORD=value

       例程: DMFLDR SYSDBA/SYSDBACONTROL='c:\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, GB18030,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水平分区表 (FALSE) 
EP                                                                      指定需要发送数据的站点序号列表,仅向MPP环境导入数据时有效 
HELP                                                                 打印帮助信息 

3 dmfldr实战

3.1 dmfldr控制文件

       控制文件CONTROL是启动dmfldr必须要指定的参数,用于指定数据文件中数据的格式。在数据载入时,dmfldr根据控制文件指定的格式来解析数据文件;导出数据时,dmfldr也会根据控制文件指定的列分隔符、行分隔符等生成数据文件。 

       控制文件中还可以指定其他dmfldr参数值。 

       dmfldr控制文件的语法如下所示: 

[OPTIONS( 
<id>=<value> 
…… 
 
)] 
LOAD [DATA] 
INFILE  < <file_option>|<directory_option> > 
[BADFILE <path_name>] 
[APPEND|REPLACE|INSERT] 
<into_table_clause> 

<id> ::=参数 
<value> ::=值

<file_option> ::= [LIST] <path_name> [<row_term_option>] [,<path_name> [<row_term_option>]]
<directory_option> ::= DIRECTORY <path_name> [<row_term_option>] 
<path_name> ::=文件地址
<row_term_option> ::=STR [X] <delimiter> 
<into_table_clause> ::= <into_table_single>{<into_table_single>}
<into_table_single> ::=INTO TABLE [<schema>.]<tablename> 
                        [EP <ep_option>] 
                        [WHEN <field_conditions>] 
                        [FIELDS [TERMINATED BY] [X] <delimiter>] 
                        [<enclosed_option>] 
                        [<coldef_option>] 
<schema> ::=模式名 
<tablename> ::=表名 
<ep_option> ::=(<ep_list>) 
<ep_list> ::=整型数字列表,以逗号分隔 
<field_conditions> ::= <field_condition>{ AND <field_condition>} 
<field_condition> ::= [(] <cmp_exp><cmp_ops><cmp_data>[)] 
<cmp_exp> ::= <colid> | (p1:p2) 
<cmp_ops> ::= = | <> | != 
<cmp_data> ::= [X] '<字符串常量>' | BLANKS | WHITESPACE 
<delimiter> ::='<字符串常量>' 
<coldef_option> ::=(<col_def>{ ,<col_def>}) 
<col_def>::=<col_id> [FILLER][<property_option>][<fmt_option>][<term_option>][<enclosed_option>][<constant_option>][<fun_option>] 
<col_id> ::=列名 
<property_option> ::=<position_option> | NULL 
<position_option> ::=position(p1:p2) | position(p1) 
<fmt_option> ::=DATE FORMAT '<时间日期格式串>' 
<term_option> ::= TERMINATED [BY] <wx_option>
<wx_option> ::= WHITESPACE|[X] <delimiter> 
<enclosed_option> ::= [OPTIONALLY] ENCLOSE [BY] [X] <delimiter> 
<constant_option> ::= CONSTANT "<常量>" 
<fun_option> ::= "函数名称()" 

       对于上述控制文件语法,需要说明的是:

  • dmfldr在处理数据文件中换行符时windows默认为0x0D0A(\r\n),非windows默认为0x0A(\n),用户应该根据现有的数据文件中的换行符做相应的调整。对应选项为<row_term_option>,若指定的<value>值为十六进制的字符串值需要指明[X]选项,<value>值不再需要以0x开头。若没有指明[X]选项,则<value>值为指定的字符串; 
  • 关于列分隔符,用户应当指定FIELDS或者coldef_option中的至少一种。若两者均存在,则以coldef_option中的设置为准,若分隔符指明[X]选项,则表明此分隔符为十六进制格式的字符串;
  • 关于file_option,用来指定单个文件; 
  • 关于directory_option,用来指定整个文件夹。指定此选项后,dmfldr会自动扫描指定文件夹下的所有文件,这些文件数据将被导入到服务器; 
  • 关于LIST选项,INFILE使用LIST选项时,表明实际的数据文件路径存储在INFILE指定的文件中,该文件可以存储多个实际的数据文件路径,使用逗号或者换行分割; 
  • 关于APPEND|REPLACE|INSERT选项,表示将数据装载时采用的加载方式。INSERT,插入方式,向空表插入新记录(如果不是空表则会报错无效的装载模式);APPEND,追加方式,为缺省方式,在表中追加新记录;REPLACE,替代方
    式,先清空表再插入新记录; 
    当dmfldr处于导出数据模式时,设置为APPEND时,dmfldr会检查导出数据文件是否存在,若存在,则以追加的方式写入数据;若不存在,则新建数据文件;设置为其他值时,dmfldr将直接创建新数据文件。选项默认值为APPEND; 
  • 关于OPTIONS选项,该选项支持命令行参数中除userid,control,help以外的所有参数的指定,每个参数值对使用空格或者换行分割。对于option中出现的参数,在dmfldr的指定执行参数中也出现的,dmfldr会选择option中对应参数的值执行;
  • 关于col_def,FILLER表示跳过处理数据文件中指定列的值;
  • 关于property_option选项 
    ✓ position(p1:p2):从数据文件中每行数据的第p1个字节到第p2个字节为该列值,包含边界p1,p2; 
    ✓ position(p1):从数据文件中每行数据的第p1个字节开始,到下一个列分隔符之间的数据为该列值,包含边界p1; 
    ✓ position选项对大字段数据无效,若对大字段类型指定此选项会报错; 
    ✓ NULL:指定的值为NULL,忽略数据文件中的值; 
    property_option参数仅对导入有效; 
  • 关于term_option选项,该选项用来指定数据文件中指定列的结束标志。列的结束标志可以是WHITESPACE(空格)或者用户自定义的字符串或十六进制串。指定了term_option后,该列不需要用FIELDS分隔; 
  • 关于enclosed_option选项,此参数指定封闭符,为可选参数,默认不存在封闭符。若在into_table_clause和coldef_option中均设置了封闭符,则以coldef_option中的设置为准,若封闭符前指定[X]选项,则表明此封闭符为十六进制格式的字符串; 
  • 分隔符或封闭符字符串的长度均不能超过255个字节; 
  • 关于constant_option选项,指定constant关键字后,数据文件中不需要为该列准备数据,如果指定了,该列数据将作为下一字段数据装载而导致数据混乱。constant选项对大字段类型无效;
  • 关于fun_option选项,目前只支持trim()和replace(colname, srcStr, destStr)函数。trim()函数用于去除列数据的前后空格;replace()函数用于将colname列名指定的列数据中的srcStr替换为destStr,其中srcStr和destStr参数可使用chr(int)函数将数字转换成字符串,要求chr()的参数和返回值均不超过4个字节; 
  • 关于ep_option选项,用于指定数据将要发送的目的站点,仅适用于MPP环境。 

3.2指定数据文件

3.2.1在控制文件中指定数据文件

       可以在控制文件的LOAD节点中指定数据文件。 
       例如: 
       1) 建表TEST

DROP TABLE TEST; 
CREATE TABLE TEST(C1 INT,C2 INT,C3 DATE); 

       2) 编辑数据文件test.txt,存放路径为/opt/data/test.txt,文件内容如下

1 1|2015-11-06 
2 2|2015-11-05 
3 3|2015-11_04

        3) 编辑控制文件test.ctrl,存放路径为/opt/data/test.ctrl,内容如下:

LOAD DATA 
INFILE '/opt/data/test.txt' 
INTO TABLE test 
FIELDS '|' 
( 
C1 TERMINATED BY ' ', 
C2, 
C3 DATE FORMAT 'yyyy-mm-dd' 
)

       4) 使用dmfldr进行数据载入 

./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/opt/data/test.ctrl\'

3.2.2使用DATA参数指定数据文件

       也可以使用DATA参数指定dmfldr的数据文件,数据文件路径的优先选择顺序为先控制文件,后参数选项。如果控制文件中数据文件路径指定为‘*’,在命令行通过DATA参数指定数据文件路径,DATA所指定的文件路径会替换‘*’。 
       例如: 
       1) 建表TEST

DROP TABLE TEST; 
CREATE TABLE TEST(C1 INT,C2 INT,C3 DATE);

       2) 编辑数据文件test.txt,存放路径为/opt/data/test.txt,文件内容如下 

1 1|2015-11-06 
2 2|2015-11-05 
3 3|2015-11_04

       3) 编辑控制文件test.ctrl,存放路径为/opt/data/test.ctrl,内容如下: 

LOAD DATA 
INFILE * 
INTO TABLE test 
FIELDS '|' 
( 
C1 TERMINATED BY ' ', 
C2, 
C3 DATE FORMAT 'yyyy-mm-dd' 
)

       4) 使用dmfldr进行数据载入

./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/opt/data/test.ctrl\' data=\'/opt/data/test.txt \'

补充:

1.在使用dmfldr时根据系统和数据的具体情况对一些参数进行调整,可以获得更好的性能,这些参数包括:BUFFER_NODE_SIZE 、READ_ROWS、SEND_NODE_NUMBER、TASK_THREAD_NUMBER、BLDR_NUM、BDTA_SIZE、INDEX_OPTION,在实际使用时比较常用的有READ_ROWS 、BUFFER_NODE_SIZE、BDTA_SIZE三个参数。

2.在使用dmfldr导数据的过程中,对于导入失败的数据,dmfldr会记录到指定的bad文件,导入失败的数据可在bad文件中查看。

3.编码问题,在进行导入导出时,可使用参数CHARACTER_CODE指定纯文本文件的编码,特别是在导入数据的时候,建议先确认文件的编码,例如通过命令file -i a.txt 的方式查看文件编码,然后指定文件的编码再进行导入操作。对于导入失败的数据可在第2点中说到的bad文件中查看,如果是编码问题可尝试转换编码的方式解决。

4.关于控制文件中INFILE参数也可以写成如下形式

LOAD DATA 
INFILE '/home/dmdba/test1_*.txt' 
INTO TABLE test 
FIELDS '|' 
( 
C1 TERMINATED BY ' ', 
C2, 
C3 DATE FORMAT 'yyyy-mm-dd' 
)

即当一张表有多个纯文本文件时,可以一次性读取该目录下该所有属于该表的纯文本文件。

5.控制文件中的参数FIELDS 可以指定自定义的分隔符,例如’|‘,’+‘,'|+|',’,‘等等,由Oracle等数据库导出来的纯文本文件可以完美导入达梦数据库中。

6.dmfldr支持多表装载,通过在控制文件中指定多个INTO TABLE子句,可以将一批数据同时向多个表进行装载。每个INTO TABLE子句中都可以指定WHEN过滤条件、FIELDS子句和列定义子句。

     对于多表装载的使用需注意以下几点: 

  • 每个INTO TABLE子句的目标表必须是不同的表; 
  • 每个INTO TABLE子句的目标表必须是不同的表; 
  • 对于第二个及其之后的INTO TABLE子句,在其coldef_option中,必须为第一列指定POSITION选项;

例如:

1) 建表TEST1、TEST2 

DROP TABLE TEST1; 
DROP TABLE TEST2; 
CREATE TABLE TEST1(C1 INT,C2 INT); 
CREATE TABLE TEST2(C1 INT,C2 INT);

2) 编辑数据文件test.txt,存放路径为/opt/data/test.txt,文件内容如下

1,2 
2,3 
3,2
4,8 
9,1

3) 编辑控制文件test.ctrl,存放路径为/opt/data/test.ctrl,内容如下:

LOAD DATA 
INFILE '/opt/data/test.txt' 
INTO TABLE test1 
WHEN C1 != '1' 
FIELDS ',' 
( 
c1 position (1:1), 
c2 
) 
INTO TABLE test2 
WHEN (3:3) = '2' AND c1 != '3' 
FIELDS ',' 
( 
c1 position (1:1), 
c2 
)

4) 使用dmfldr进行数据载入 

./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/opt/data/test.ctrl\'

5) 查看表TEST1和TEST2的数据如下 

SELECT * FROM TEST1; 
行号       C1          C2 
---------- ----------- ----------- 
1          2           3 
2          3           2 
3          4           8 
4          9           1 
SELECT * FROM TEST2; 

更多详细使用信息请参考达梦数据库官方文档--dmfldr使用手册。欢迎访问达梦数据库官网下载开发版体验,点这里直达下载地址。

更多关于达梦的新闻和技术分享请关注达梦公众号:达梦大数据

扫码关注:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章