注册
dmfldr-快速装载(达梦数据库)
技术分享/ 文章详情 /

dmfldr-快速装载(达梦数据库)

少年 2025/07/04 20 0 0

1.概述

1.1 功能简介

dmfldr(DM Fast Loader)是 DM 提供的快速数据装载命令行工具。用户通过使用
dmfldr 工具能够把按照一定格式排序的文本数据以简单、快速、高效的方式载入到 DM 数
据库中,或把 DM 数据库中的数据按照一定格式写入文本文件。
1.2 启动dmfldr
安装好 DM 数据库管理系统后,在安装目录的“bin”子目录下可找到 dmfldr 执行文件。
启动操作系统的命令行窗口,进入“dmfldr”所在目录,可以准备启动 dmfldr 工具了。
dmfldr 的使用必须指定必要的参数,否则工具会报错“无效的参数个数”并退出。为dmfldr 指定参数的格式为:
dmfldr keyword=value [keyword=value …]
例如:
dmfldr USERID=SYSDBA/SYSDBA CONTROL=‘c:\fldr.ctl’
如例子所示,USERID 和 CONTROL 是启动 dmfldr 必须要指定的参数,且 USERID 必 须是第一个参数,CONTROL 必须是第二个参数。查看相关参数可以使用 “dmfldr help””查看各参数的简单信息。

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

  • 启动前准备:dmfldr 命令行格式如下:
dmfldr USERID=<用户名>/<密码>@<主机>:<端口> MODE='IN/OUT' CONTROL='<控制文件路径>'

2.2在控制文件中指定数据文件
可以在控制文件的 LOAD 节点中指定数据文件。

建表test**
CREATE TABLE TEST(A1 INT,A2 INT,A3 DATE); 

编辑数据文件 test.txt,存放路径为/dm/data/test/test.txt,文件内容如下
1|1 2024-11-06
2|2 2023-11-05
3|3 2025-06_04

编辑控制文件 test1.ctl,存放路径为/dm/data/test/test.ctl,内容如下:


OPTIONS
(
    SKIP = 0           
    ROWS = 50000       
    DIRECT = TRUE      
    INDEX_OPTION = 1    
)

LOAD DATA
INFILE '/dm/data/test' STR X '0A'    
BADFILE '/dm/data/test/test.bad'           
INTO TABLE TEST                       
FIELDS '|'                      
(
  A1 TERMINATED BY ' ', 
A2, 
A3 DATE FORMAT 'yyyy-mm-dd' 
)

2.3)使用 dmfldr 进行数据载入

./dmfldr userid=SYSDBA/Dameng123 10.127.17.108:5238 control=\'/dm/data/test1.ctl\' log=\'/opt/data/test.log\' 

查看日志文件/dm/data/test.log,其内容如下:
image.png
3、数据排序
建表 TEST

DROP TABLE TEST; 
CREATE TABLE TEST(C1 INT CLUSTER PRIMARY KEY,C2 VARCHAR);

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

2|aaa 
3|bbb 
4|ccc 
5|ddd 
1|zzz 
编辑控制文件 test.ctl,存放路径为/dm/data/test/test.ctl,内容如下:
LOAD DATA 
INFILE '/dm/data/test/test.txt' 
INTO TABLE test 
FIELDS '|' 
( 
C1, 
C2 
)
[dmdba@dameng bin]$ ./dmfldr userid=SYSDBA/Dameng123@10.127.17.108:5238 control=\'/dm/data/test/test.ctl\' log=\'/dm/data/test.log\' sorted=true
dmfldr V8
控制文件:

加载行数: 全部

每次提交服务器行数: 50000

跳过行数: 0

允许错误数: 100

是否直接加载: Yes

是否插入自增列: No

数据是否已按照聚集索引排序: Yes

字符集: UTF-8



数据文件共1个:
/dm/data/test/test.txt

错误文件: fldr.bad

目标表: TEST

列名                                                                                                                           包装数据类型   终止
C1                                                                                                                               CHARACTER            |
C2                                                                                                                               CHARACTER            |

行缓冲区数量: 4
任务线程数量: 4

不能使用NOSORT选项,数据非有序
0 行记录已提交

目标表: TEST
load success.
失败原因: 不能使用NOSORT选项,数据非有序
0 行加载成功。
5 行由于数据错误没有加载。
0 行由于数据格式错误被丢弃。

跳过的逻辑记录总数: 0
读取的逻辑记录总数: 5
拒绝的逻辑记录总数: 5

11.712(ms)已使用

4.大字段数据库处理
dmfldr 支持对 DM 数据库的大字段类型数据的载入和导出,DM 数据库支持的大字段数据类型有 TEXT、LONGVARCHAR、IMAGE、LONGVARBINARY、BLOB 以及 CLOB。
当 dmfldr 工作在导出模式即 MODE 为 OUT 时,dmfldr 生成大字段对应的数据文件名由 LOB_FILE_NAME 指定,若未指定默认为 dmfldr.lob,文件存放于 LOB_DIRECTORY 指定的目录,如果未指定 LOB_DIRECTORY 则存放于指定的导出数据文件同一目录。
例 1 展示 DIRECT 为 TRUE,CLIENT_LOB 为 TRUE 时大字段数据的载入。
4.1.建立一张TEST表
image.png
2.插入数据。
image.png
编辑控制文件 test.ctl,存放路径为/dm/data/test.ctl,内容如下:
image.png
使用 dmfldr 进行导出数据

 ./dmfldr userid=sysdba/Dameng123@10.127.17.108:5238 control=\'/dm/data/test.ctl\' LOB_DIRECTORY=\'/dm/data/\' mode=\'out\'

image.png
在这个例子中,指定了 LOB_DIRECTORY,而没有指定 LOB_FILE_NAME,导出的大字段数据文件将存放在 LOB_DIRECTORY 指定的/opt/data 目录,文件名为 dmfldr.lob。
例 2 展示 DIRECT 为 TRUE,CLIENT_LOB 为 FALSE 时大字段数据的载入。
4.2.建表 TEST2。
image.png
2.编辑数据文件 test.txt,存放路径为 DM 客户端机器上的/dm/data/test2.txt,文件内容如下:
image.png

4.3.使用 dmfldr 进行导入数据。

./dmfldr userid=sysdba/Dameng123@10.127.17.108:5238 control=\'/dm/data/test2.ctl\' LOB_DIRECTORY=\'/dm/data/\' mode=\'out\'

image.png
5.使用 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/data/test.txt,文件内容如下:
1 1|2025-11-06

2 2|2025-11-05

3 3|2025-06_04

编辑控制文件 test.ctl,存放路径为/dm/data/test.ctl,内容如下:

LOAD DATA

INFILE *

INTO TABLE test

FIELDS '|'

(

C1 TERMINATED BY ' ',

C2,

C3 DATE FORMAT 'yyyy-mm-dd'

)

5.3使用 dmfldr 进行数据载入

./dmfldr userid=sysdba/Dameng123@10.127.17.108:5238 control=\'/dm/data/test.ctl\'badfile=\'/dm/data/test.bad\'

5.4日志文件及日志信息
dmfldr 的日志文件路径由 LOG 参数设置,默认日志文件名为 fldr.log。文件记录了装载过程中的装载信息和错误信息以及统计信息。用户也可以通过设置控制文件中的 OPTIONS 选项来指定日志路径。如果参数及 OPTION 中同时指定了日志路径则其将以 OPTION 中指定的路径为最终路径。
例 展示日志文件的用法。
1.建表 TEST

ROP TABLE TEST;

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


[dmdba@dameng bin]$ cat /dm/data/test/test.txt
1|1 2025-06-06

2|2 2025-06-05

3|3 2025-06_20

[dmdba@dameng bin]$ cat /dm/data/test/test.ctl
LOAD DATA
INFILE '/dm/data/test/test.txt'
INTO TABLE test
FIELDS '|'
(
C1,

C2 TERMINATED BY ' ',

C3 DATE FORMAT 'yyyy-mm-dd'
)

[dmdba@dameng bin]$ ./dmfldr userid=SYSDBA/Dameng123@10.127.17.108:5238 control=\'/dm/data/test/test.ctl\' log=\'/dm/data/test.log\'
dmfldr V8
控制文件:

加载行数: 全部

每次提交服务器行数: 50000

跳过行数: 0

允许错误数: 100

是否直接加载: Yes

是否插入自增列: No

数据是否已按照聚集索引排序: No

字符集: UTF-8



数据文件共1个:
/dm/data/test/test.txt

错误文件: fldr.bad

目标表: TEST

列名                                                                                                                           包装数据类型   终止
C1                                                                                                                               CHARACTER            |
C2                                                                                                                               CHARACTER            WHT
C3                                                                                                                               yyyy-mm-dd           |

行缓冲区数量: 4
任务线程数量: 4

数据错误
数据错误
3 行记录已提交

目标表: TEST
load success.
失败原因: 数据错误
3 行加载成功。
2 行由于数据错误没有加载。
2 行由于数据格式错误被丢弃。

跳过的逻辑记录总数: 0
读取的逻辑记录总数: 5
拒绝的逻辑记录总数: 2

7.922(ms)已使用

5.5自增列装载
自增列是比较特殊的列,为了保证数据库中自增列列值的正确性,用户在进行数据载入时需要特别注意。
当 DIRECT 参数为 FALSE 时,dmfldr 将把从数据文件中读取的自增列值作为目标值插入数据库表中,用户应当保证每一行的自增列的值符合自增列的规则,否则将造成数据混乱。
例 1 展示自增列的装载。
建表 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;

image.png
此时表 TEST 中的数据为:

行号 C1 C2

---------- ----------- ---

1   1  AAA

2   2  BBB
[dmdba@dameng bin]$ cat /dm/data/test/test.txt
1|ddd

2|asss

3|sss

[dmdba@dameng bin]$ cat /dm/data/test/test.ctl
LOAD DATA
INFILE '/dm/data/test/test.txt'
INTO TABLE test
FIELDS '|'
(
C1,

C2 TERMINATED BY ' ',

C3 DATE FORMAT 'yyyy-mm-dd'
)
[dmdba@dameng bin]$ vi  /dm/data/test/test.ctl
[dmdba@dameng bin]$ cat /dm/data/test/test.ctl
LOAD DATA
INFILE '/dm/data/test/test.txt'
INTO TABLE test
FIELDS '|'
(
C1,

C2

)

使用 dmfldr 进行数据载入。


[dmdba@dameng bin]$ ./dmfldr userid=SYSDBA/Dameng123@10.127.17.108:5238 control=\'/dm/data/test/test.ctl\' direct=true set_identity=false
dmfldr V8
控制文件:

加载行数: 全部

每次提交服务器行数: 50000

跳过行数: 0

允许错误数: 100

是否直接加载: Yes

是否插入自增列: No

数据是否已按照聚集索引排序: No

字符集: UTF-8



数据文件共1个:
/dm/data/test/test.txt

错误文件: fldr.bad

目标表: TEST

列名                                                                                                                           包装数据类型   终止
C1                                                                                                                               CHARACTER            |
C2                                                                                                                               CHARACTER            |

行缓冲区数量: 4
任务线程数量: 4

数据错误
数据错误
3 行记录已提交

目标表: TEST
load success.
失败原因: 数据错误
3 行加载成功。
2 行由于数据错误没有加载。
2 行由于数据格式错误被丢弃。

跳过的逻辑记录总数: 0
读取的逻辑记录总数: 5
拒绝的逻辑记录总数: 2

6.094(ms)已使用
查看表数据

SQL> SELECT * FROM TEST;

行号     C1          C2
---------- ----------- ----
1          1           AAA
2          2           BBB
3          3           ddd
4          4           asss
5          5           sss

已用时间: 2.433(毫秒). 执行号:5716.

在这个例子中,表 TEST 中已有两行数据,由于 SET_IDENTITY 置为 FALSE,因此在数据载入时 dmfldr 根据 C1 列的定义和表中已有数据,为 C1 列重新插入合适的值。

我们再看看如果将 SET_IDENTITY 置为 TRUE 结果会怎样。
例 2 展示 SET_IDENTITY 置为 TRUE 时的装载。


[dmdba@dameng bin]$ ./dmfldr userid=SYSDBA/Dameng123@10.127.17.108:5238 control=\'/dm/data/test/test.ctl\' direct=true set_identity=true
dmfldr V8
控制文件:

加载行数: 全部

每次提交服务器行数: 50000

跳过行数: 0

允许错误数: 100

是否直接加载: Yes

是否插入自增列: Yes

数据是否已按照聚集索引排序: No

字符集: UTF-8



数据文件共1个:
/dm/data/test/test.txt

错误文件: fldr.bad

目标表: TEST

列名                                                                                                                           包装数据类型   终止
C1                                                                                                                               CHARACTER            |
C2                                                                                                                               CHARACTER            |

行缓冲区数量: 4
任务线程数量: 4

数据错误
数据错误
3 行记录已提交

目标表: TEST
load success.
失败原因: 数据错误
3 行加载成功。
2 行由于数据错误没有加载。
2 行由于数据格式错误被丢弃。

跳过的逻辑记录总数: 0
读取的逻辑记录总数: 5
拒绝的逻辑记录总数: 2

11.503(ms)已使用

SQL> SELECT * FROM TEST;

行号     C1          C2
---------- ----------- ----
1          1           AAA
2          2           BBB
3          1           ddd
4          2           asss
5          3           sss

已用时间: 3.443(毫秒). 执行号:5724.

5.6 多表装载

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

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

每个 INTO TABLE 子句的目标表必须是不同的表;
多表装载时不支持直接装载分区表子表;
对于第二个及其之后的 INTO TABLE 子句,在其 coldef_option 中,必须为第一列指定 POSITION 选项;
建表 TEST1、TEST2。

DROP TABLE TEST1;

DROP TABLE TEST2;

CREATE TABLE TEST1(C1 INT,C2 INT);

CREATE TABLE TEST2(C1 INT,C2 INT);

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

2,3

3,2

4,8

9,1

编辑控制文件 test.ctl,存放路径为test.ctl,内容如下:
LOAD DATA
INFILE ‘/opt/data/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 进行数据载入。

 [dmdba@dameng bin]$ ./dmfldr userid=SYSDBA/Dameng123@10.127.17.108:5238 control=\'/dm/data/test/test.ctl\'
dmfldr V8
控制文件:

加载行数: 全部

每次提交服务器行数: 50000

跳过行数: 0

允许错误数: 100

是否直接加载: Yes

是否插入自增列: No

数据是否已按照聚集索引排序: No

字符集: UTF-8



数据文件共1个:
/dm/data/test/test.txt

错误文件: fldr.bad

目标表: TEST1

列名                                                                                                                           包装数据类型   终止
C1                                                                                                                               CHARACTER            ,
C2                                                                                                                               CHARACTER            ,

行缓冲区数量: 4
任务线程数量: 4


数据文件共1个:
/dm/data/test/test.txt

错误文件: fldr.bad

目标表: TEST2

列名                                                                                                                           包装数据类型   终止
C1                                                                                                                               CHARACTER            ,
C2                                                                                                                               CHARACTER            ,

行缓冲区数量: 4
任务线程数量: 4

4 行记录已提交
1 行记录已提交

目标表: TEST1
load success.
4 行加载成功。
0 行由于数据错误没有加载。
0 行由于数据格式错误被丢弃。

跳过的逻辑记录总数: 0
读取的逻辑记录总数: 9
拒绝的逻辑记录总数: 0

11.675(ms)已使用


目标表: TEST2
load success.
1 行加载成功。
0 行由于数据错误没有加载。
0 行由于数据格式错误被丢弃。

跳过的逻辑记录总数: 0
读取的逻辑记录总数: 9
拒绝的逻辑记录总数: 0

11.675(ms)已使用

SQL> select *from test1;

行号     C1          C2
---------- ----------- -----------
1          2           3
2          3           2
3          4           8
4          9           1

已用时间: 0.456(毫秒). 执行号:5733.
SQL> select *from test2;

行号     C1          C2
---------- ----------- -----------
1          1           2

已用时间: 3.239(毫秒). 执行号:5734.

5.7dmfldr 使用限制
dmfldr 的使用存在以下一些限制:

不支持向临时表、外部表装载数据
不支持向系统表装载数据
不支持向带有位图索引的表装载数据
不支持向带有全文索引的表装载数据
不支持向 DCP 代理装载数据
不支持在 DPC 环境下,向带有全局索引的表装载数据
仅支持在 index_option=2 的情况下向带有函数索引的表装载数据
对象表暂不支持快速装载
dmfldr 装载时会对约束进行检查,对各种约束的处理机制如下表所示;由于 dmfldr 不处理约束的有效性,都视为有效,故需要用户自行处理约束有效性等相关内容

表3.1 dmfldr的约束检查机制

image.png

达梦社区地址 :https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服