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

如图所示,dmfldr 实际上除了客户端工具,还包含一个在数据库服务器的 dmfldr 功能模块,它们共同完成 dmfldr 的各项功能。
当进行数据载入时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件与数据文件,将数据打包发送给服务器端的 dmfldr 模块,由服务器完成数据的真正装载工作。并分析服务器返回的消息,必要时根据用户参数指定生成日志文件与错误数据文件。当进行数据导出时,dmfldr客户端接收用户提交的命令与参数,分析控制文件,将用户要求转换成相应消息发送给服务器端的 dmfldr 模块。服务器解析并打包需要导出的数据,发送给dmfldr客户端,客户端将数据写入指定的数据文件,必要时根据用户参数指定生成日志文件。
进入达梦数据库安装目录的bin目录下,找到dmfldr并指定相关参数进启动数据装载功能。(dmfldr 的使用必须指定必要的参数,否则工具会报错“无效的参数个数”并退出)

进入bin目录,使用dmfldr help 查看dmfldr参数信息,如下:
- 格式: dmfldr.exe KEYWORD=value
-
- 例程: dmfldr.exe SYSDBA/SYSDBA CONTROL='c:\fldr.ctl'
-
-
- USERID 必须是命令行中的第一个参数
-
- CONTROL 必须是命令行中的第二个参数
-
-
- 字符串类型参数必须以引号封闭
-
-
- 关键字 说明(默认值)
-
- --------------------------------------------------------------------------------
-
- USERID 用户名/口令, 格式:{
[/] | /}[@][ -
-
: [ | host[:port] | ] -
-
-
- --此行外层{}是为了封装参数之用,书写时需要保留
-
-
: 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环境,是否只生成单个数据文件(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 打印帮助信息
注意:USERID必须是第一个参数,CONTROL必须是第二个参数,这两个参数都 不能省略;其余参数均为可选参数,可以不指定,指定时也无顺序要求。
| dmfldr参数名 | 使用说明 | 选项情况 |
| USERID | USERID 用于指定数据库的连接信息。必选参数,且必须位于参数位置的第一个。 | 必选 |
| CONTROL | 控制文件的路径,字符串类型。必选参数,且必须位于参数位置的第二个。 | 必选 |
| LOG | dmfldr 的日志文件路径,字符串类型。默认日志文件名为 fldr.log。日志文件记录 了 dmfldr 运行过程中的工作信息、错误信息以及统计信息。 | 可选 |
| NULL_STR | 指定数据文件中 NULL 值的表示字符串,字符串类型,默认忽略此参数。 若设置了 NULL_STR,则此参数值将成为数据文件中 NULL 值的唯一表示方式。 NULL_STR 区分字符串大小写,并且长度不允许超过 128 个字节。 | 可选 |
| BADFILE | 记录错误数据的文件路径,字符串类型。默认的错误文件名为 fldr.bad。文件记录 的信息为数据文件中存在格式错误的行数据以及转换出错的行数据 | 可选 |
| SKIP | 跳过数据文件起始的逻辑行数,整型数值。默认的跳过起始行数为 0 行。如果用户指 定了多个文件,且起始文件中的行数不足 SKIP 所指定的行数,则 dmfldr 工具会扫描下 一个文件直至累加的行数等于 SKIP 所设置的行数或者所有文件都已扫描结束 | 可选 |
| LOAD | 装载的最大行数,整型数值。默认的最大装载行数为数据文件中的所有行数。LOAD 指 定的值不包括 SKIP 指定的跳过的行数 | 可选 |
| ROWS | 每次提交的行数,整形数值。默认的提交行数为 50000 行。提交行数的值表示提交到 服务器的行数,并不一定代表按照数据文件中的数据顺序的行数。用户可以根据实际情况调 整每次提交的行数,以达到性能的最佳点。 | 可选 |
| DIRECT | 数据装载方式,布尔值。默认为 TRUE。DIRECT 指定了装载的方式,当为 TRUE 时, dmfldr 选择快速的载入模式,通过数据的转换和数据的封装直接对 B 树进行操作,省去 了普通插入方式下各个操作符之间的跳转,提升了装载的效率,但对于约束的检查等由用户 保证,dmfldr 将不处理有约束冲突的数据。当为 FALSE 时,dmfldr 选择普通的插入方 式装载数据,可以保证数据的正确性和约束的有效性,效率比前者要低。 | 可选 |
| SET_IDENTITY | 设置自增列选项,布尔值。默认为 FALSE。如果指定 SET_IDENTITY 选项值为 TRUE, 则 dmfldr 将把从数据文件中读取的自增列值作为目标值插入数据库表中,用户应当保证 每一行的自增列的值符合自增列的规则。如果 SET_IDENTITY 选项值设置为 FALSE,则 dmfldr 将忽略数据文件中对应自增列的值,服务器将自动生成自增列的值插入每一行的对 应列。 | 可选 |
| ERRORS | 最大的容错个数,整形数值。取值范围为[0,4294967295],默认为 100。当 dmfldr 在插入过程中出现错误的个数超过了 ERRORS 所设置的数目,则 dmfldr 会停止 载入,当前时间点的所有正确数据将会被提交到服务器。如果载入过程中不允许出现错误则 可以设置 ERRORS 为 0,如果允许所有的错误出现,则可以设置 ERRORS 为一个非常大的 数。ERRORS 所统计的错误包含在数据转换和数据插入过程中所产生的数据错误。 | 可选 |
| CHARACTER_CODE | 数据文件中数据的编码格式,字符串类型。默认为 GBK。CHARACTER_CODE 的可选项 有 GBK、GB18080、UTF-8、SINGLE_BYTE 和 EUC-KR 五种 | 可选 |
| MODE | dmfldr 的装载模式,字符串类型。默认值为 IN。MODE 的可选项有 IN、OUT 和 OUTORA 三种 | 可选 |
| NULL_MODE | 指定载入和导出数据时对 NULL 字符串和空值的处理方式,布尔类型,默认为 FALSE。 若 NULL_MODE 为 TRUE,数据载入时将 NULL 字符串处理为空值,数据导出时则空值 处理为 NULL 字符串;若设置为 FALSE,数据载入时将 NULL 字符串处理为字符串,数据 导出时将空值处理为空串。 | 可选 |
| TASK_THREAD_NUMBE | 指定 dmfldr 在数据载入时处理用户数据的线程数目,整数类型,范围为 1~128。默 认情况下,dmfldr 将该参数值设为系统 CPU 的个数,但无论设定值是多少,dmfldr 至 少会创建 2 个任务线程。在多核 CPU 环境下,增大 TASK_THREAD_NUMBER 值可以提升 dmfldr 装载性能 | 可选 |
| BDTA_SIZE | BDTA(Batch DaTA)的大小,整数类型,范围为 100~10000,默认为 5000。 BDTA 代表 DM 数据库批量数据处理机制中一个批量,在内存、CPU 允许的条件下,增 大 BDTA_SIZE 能加快装载速度;在网络是装载性能瓶颈时,增大 BDTA_SIZE 影响不大。 | 可选 |
| COMPRESS_FLAG | 指定是否压缩 BDTA,布尔类型,默认为 FALSE。 压缩 BDTA 能节省网络带宽,但同时也会加重 CPU 的负担,用户应根据具体应用情况 考虑是否制定压缩。 | 可选 |
| DATA | 指定数据文件路径,字符串类型。 | 可选 |
| SQL | 用户指定 SQL 查询语句,用于导出自定义查询结果数据,仅导出模式有效。 | 可选 |
- [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> ::= "函数名称()"
在控制文件中指定数据文件,编辑控制文件test.ctl信息:
#控制文件中导出TEST用户下TEST表,并保存/dmdbms/test.txt在文件中
- LOAD DATA
-
- INFILE '/dmdbms/test.txt'
-
- INTO TABLE TEST.TEST
-
- FIELDS '|'
dmfldr载出数据:
$ dmfldr userid=SYSDBA/SYSDBA:5236 control='/dmdbms/test.ctl' mode='out'
在目标端数据库创建相同的text表结构:
- CREATE TABLE "TEST"."TEST"
-
- (
-
- "ID" INT IDENTITY(1, 1) NOT NULL,
-
- "C1" VARCHAR(80),
-
- "C2" VARCHAR(80),
-
- "C3" VARCHAR(80),
-
- "CREATE_TIME" TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP NOT NULL,
-
- "UPDATE_TIME" TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP NOT NULL,
-
- NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
将导出的txt文档传到目标数据库服务器,并导入目标表中:
- LOAD DATA
-
- INFILE '/dmdbms/test.txt'
-
- INTO TABLE TEST.TEST
-
- FIELDS '|'
修改test.txt文件属主和属组:
chown dmdba:dinstall /dmdbms/test.txt
dmfldr导入数据:
./dmfldr userid=SYSDBA/SYSDBA:5237 control=\'/dmdbms/test..ctl\' mode=\'in\'
注意:mode默认是in,所以载入的时候,mode可以省略。
linux下单引号’是特殊符号,需要用\转移,否则报错。
更多内容,请访问达梦社区地址:https:eco.dameng.com