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 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,其内容如下:
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表
2.插入数据。
编辑控制文件 test.ctl,存放路径为/dm/data/test.ctl,内容如下:
使用 dmfldr 进行导出数据
./dmfldr userid=sysdba/Dameng123@10.127.17.108:5238 control=\'/dm/data/test.ctl\' LOB_DIRECTORY=\'/dm/data/\' mode=\'out\'
在这个例子中,指定了 LOB_DIRECTORY,而没有指定 LOB_FILE_NAME,导出的大字段数据文件将存放在 LOB_DIRECTORY 指定的/opt/data 目录,文件名为 dmfldr.lob。
例 2 展示 DIRECT 为 TRUE,CLIENT_LOB 为 FALSE 时大字段数据的载入。
4.2.建表 TEST2。
2.编辑数据文件 test.txt,存放路径为 DM 客户端机器上的/dm/data/test2.txt,文件内容如下:
4.3.使用 dmfldr 进行导入数据。
./dmfldr userid=sysdba/Dameng123@10.127.17.108:5238 control=\'/dm/data/test2.ctl\' LOB_DIRECTORY=\'/dm/data/\' mode=\'out\'
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;
此时表 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的约束检查机制
达梦社区地址 :https://eco.dameng.com
文章
阅读量
获赞