dmfldr概述
Dmfldr(DM Fast Loader)包含dmfldr客户端和dmfldr模块两部分。Dmfldr客户端实现初始化快速装载环境、读取数据、打包数据和发送数据功能。Dmfldr功能模块嵌入在数据库服务器中,实现装载功能。两者相互协作,共同完成dmfldr的各项功能。
当进行数据载入时,dmfldr客户端接收用户提交的命令与参数,分析控制文件与数据文件,将数据打包发送给服务器端的dmfldr模块,由dmfldr模块完成数据的真正装载工作。并分析服务器返回的消息,必要时根据用户参数指定生成日志文件与错误数据文件。
当进行数据载出时,dmfldr客户端接收用户提交的命令与参数,分析控制文件,将用户要求转换成相应消息发送给服务器端的dmfldr模块。Dmfldr模块解析并打包需要导出的数据,发送给dmfldr客户端,客户端将数据写入指定的数据文件,必要时根据用户参数指定生成日志文件。
dmfldr操作
1、启动dmfldr
Dmfldr在安装好DM的dmdbms/bin目录下
可通过dmfldr help 来查看参数用法
—载入
dmfldr userid=sysdba/dameng123 mode=’IN’ control=/dmdata/tmp/text.ctl
—载出
dmfldr userid=sysdba/dameng123 mode=’OUT’ control=/dmdata/tmp/text.ctl
注意:
Dmfldr参数值的优先选择顺序为:优先为命令行参数,其次为控制文件中指定的参数值,最后为dmfldr.ini配置文件中指定的参数值。当出现以下情况时:使用控制文件,装载表和数据文件优先使用控制文件中的值;不使用控制文件时,装载表和数据文件优先使用命令行中的值。
2、主要参数
Dmfldr中涉及众多参数,userid是必选参数,且必须是第一位。其余参数为可选,需要时指定,指定时无顺序要求。
1)USERID
Userid用于指定数据库的连接信息。必选参数,且必选位于参数位置的第一个。
2)CONTROL
控制文件用于指定数据文件的路径和数据格式。在数据载入时,根据控制文件指定的格式来解析数据文件;导出数据时,根据控制文件指定的列分隔符、行分隔符生成数据文件。
3)LOG
指定日志文件路径。日志文件记录了运行过程中的工作信息、错误信息以及统计信息。
4)BADFILE
记录错误数据的文件路径。文件记录的信息为数据文件中存在格式错误的行数据以及转换出错的行数据。
5)MODE
指定装载模式。Mode可选in、out、outora和local_file 。
In模式从数据文件中将数据载入数据库;Out模式从数据库中将数据导出到数据文件;outora模式表示导出oracle表的数据,此模式下暂不支持带有大字段表的导出。Local_file表示数据导入时,不向服务器发送数据,而是将数据写入本地文件。
6)DATA
指定数据文件路径。如果控制文件缺省或控制文件中数据文件路径指定为‘*’,那么会使用命令行或 dmfldr.ini 配置文件中 DATA 参数指定的数据文件。优先使用命令行中指定的 DATA 参数指定的数据文件。
7)TABLE
指定导入或导出表的表名,可以包含模式名。若导出指定SQL或SQLFILE参数,则该选项失效。
dmfldr测试
1、指定数据文件
1)在控制文件中指定数据文件
—创建测试表
SQL> CREATE TABLE TEST(C1 INT,C2 INT,C3 DATE);
—创建测试数据文件
vim /dmdata/test.txt
1 1|2015-11-06
2 2|2015-11-05
3 3|2015-11_04
—创建测试文件
vim /dmdata/test.ctl
LOAD DATA
INFILE ‘/dmdata/test.txt’
INTO TABLE test
FIELDS ‘|’
(
C1 TERMINATED BY ’ ',
C2,
C3 DATE FORMAT ‘yyyy-mm-dd’
)
—载入测试
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’
—结果验证
2)使用data参数指定数据文件
—清理测试表
SQL> truncate table sysdba.test;
—创建测试数据文件
vim /dmdata/test.txt
1 1|2015-11-06
2 2|2015-11-05
3 3|2015-11_04
—创建测试文件
vim /dmdata/test.ctl
LOAD DATA
INFILE *
INTO TABLE test
FIELDS ‘|’
(
C1 TERMINATED BY ’ ',
C2,
C3 DATE FORMAT ‘yyyy-mm-dd’
)
—载入测试
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’ data=\’/dmdata/test.txt\’
—结果验证
2、数据转换与错误数据文件
数据类型和编码转换工作由dmfldr客户端进行,在这个过程中若出现错误,会跳过该行继续后面的工作,并记录错误行到badfile文件中。Badfile仅作用于dmfldr的工作mode为in的情况下,mode为out时无效。
—清理测试表
SQL> truncate table sysdba.test;
—创建测试数据文件
vim /dmdata/test.txt
1 1|2015-11-06
2 2|2015-11-05
3 3|dddd-cc-ee
4 4|2015-11_04
—创建测试文件
vim /dmdata/test.ctl
LOAD DATA
INFILE ‘/dmdata/test.txt’
INTO TABLE test
FIELDS ‘|’
(
C1 TERMINATED BY ’ ',
C2,
C3 DATE FORMAT ‘yyyy-mm-dd’
)
—载入测试
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’ badfile=\’/dmdata/test.bad\’
—查看badfile
3、大字段数据处理
1)大字段数据的导出
—创建测试表
SQL> create table test2 (C1 INT,C2 BLOB,C3 CLOB);
—插入测试数据
INSERT INTO TEST2 VALUES(1,0XAB121032DE,‘ddddddggg’);
INSERT INTO TEST2 VALUES(2,0XAB121032DE,‘pjjhhghyh’);
COMMIT;
—编辑控制文件
Vim /dmdata/test.ctl
LOAD DATA
INFILE ‘/dmdata/test.txt’
INTO TABLE test2
FIELDS ‘|’
( C1, C2, C3 )
—导出测试
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’ lob_directory=\’/dmdata\’ mode=\’out\’
2)direct为ture时大字段数据的载入
—清理测试表
SQL> truncate table test2;
—编辑数据文件
[dmdba@dm dmdata]$ cat test.txt
1|testblob.txt:0:10|testclob.txt:0:10
2|testblob.txt:10:20|testclob.txt:10:20
3|testblob.txt:20:30|testclob.txt:20:30
Vim /dmdata/testblob.txt
dddddddddddddccccccccccccccccccdddddddddddddddddddddddddddddddddd
Vim /dmdata/testclob.txt
ccccccccccccccccsdddddddddddddddddddddddddccccccccccccccccccc
—编辑控制文件
Vim /dmdata/test.ctl
LOAD DATA
INFILE ‘/dmdata/test.txt’
INTO TABLE test2
FIELDS ‘|’
( C1, C2, C3 )
—导出测试
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’ lob_directory=\’/dmdata\’
3)direct为false时大字段数据的载入
—清理测试表
SQL> truncate table test2;
—编辑数据文件
[dmdba@dm dmdata]$ cat test.txt
1|0x12d3c8a7|abcdefg
2|0x12a4cbac|hijlkmn
3|0x22d3c8b3|adefhjd
—编辑控制文件
Vim /dmdata/test.ctl
LOAD DATA
INFILE ‘/dmdata/test.txt’
INTO TABLE test2
FIELDS ‘|’
( C1, C2, C3 )
—导入测试(blob_type为hex_char时,blob列作为十六进制内容)
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’ direct=false blob_type=\’hex_char\’
—导入测试(blob_type为hex时,blob列作为字符串导入后转换为十六进制)
dmfldr userid=sysdba/dameng123@localhost:5236 control=‘/dmdata/test.ctl’ direct=false blob_type=‘hex’
—结果查看
4、日志文件及日志信息
—创建测试表
SQL> CREATE TABLE TEST3(C1 INT,C2 INT,C3 DATE);
—编辑数据文件
[dmdba@dm dmdata]$ cat test.txt
1|1 2024-05-28
2|2 2024-05-29
3|3 2024-05_30
—编辑控制文件
Vim /dmdata/test.ctl
LOAD DATA
INFILE ‘/dmdata/test.txt’
INTO TABLE test3
FIELDS ‘|’
(
C1,
C2 TERMINATED BY ’ ',
C3 DATE FORMAT ‘yyyy-mm-dd’
)
—导入测试
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’ log=\’/dmdata/test.log\’
5、自增列装载
自增列是比较特殊的列,为了保证数据库中自增列列值的正确性,用户在进行数据载入时需要特别注意。当DIRECT参数为 FALSE 时,dmfldr 将把从数据文件中读取的自增列值作为目标值插 入数据库表中,用户应当保证每一行的自增列的值符合自增列的规则,否则将造成数据混乱。当DIRECT参数为TRUE时,dmfldr 提供了SET_IDENTITY参数对数据载入时自增列的处理进行设置。
—创建测试表
CREATE TABLE TEST55(C1 INT IDENTITY(1,1),C2 VARCHAR);
INSERT INTO TEST55(C2) VALUES(‘AAA’);
INSERT INTO TEST55(C2) VALUES(‘BBB’);
—编辑数据文件
[dmdba@dm dmdata]$ cat test.txt
2|aaa
3|bbb
4|ccc
—编辑控制文件
Vim /dmdata/test.ctl
LOAD DATA
INFILE ‘/dmdata/test.txt’
INTO TABLE test55
FIELDS ‘|’
(
C1,
C2
)
—导入测试(SET_IDENTITY=false)
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’ SET_IDENTITY=false
—导入测试(SET_IDENTITY=true)
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’ SET_IDENTITY=true
6、数据排序
如果设置为 TRUE,则用户必须保证数据已按照聚集索引排序完成,并且如果表中存在 数据,需要插入的数据索引值要比表中数据的索引值大,服务器在做插入操作时顺序进行插 入。若数据并未按照索引排序,则dmfldr会报错,装载失败。如果设置为FALSE,则服务器对于每条记录进行定位插入。此参数仅在MODE为IN且DIRECT为TRUE的情况下有效。
—创建测试表
SQL> CREATE TABLE TEST66(C1 INT CLUSTER PRIMARY KEY,C2 VARCHAR);
—编辑数据文件
[dmdba@dm dmdata]$ cat test.txt
4|ccc
5|ddd
1|zzz
—编辑控制文件
Vim /dmdata/test.ctl
LOAD DATA
INFILE ‘/dmdata/test.txt’
INTO TABLE test66
FIELDS ‘|’
(
C1,
C2
)
—导入测试(sorted=true)
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’ sorted=true
—导入测试(sorted=false)
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’ sorted=false
—测试结果对比
这次测试的测试数据中,并没有按照列C1进行排序,所以当sorted=ture时,载入报错:不能使用NOSORT选项,数据非有序
7、空值处理
dmfldr 通过设置 NULL_MODE 参数来处理空值:
(1)设置为 TRUE,载入时 NULL 字符串处理为 NULL,载出时空值处理为 NULL 字符串
(2)设置为 FALSE,载入时 NULL 字符串处理为字符串,载出时空值处理为空串
—创建测试表
SQL> CREATE TABLE TEST77(C1 INT,C2 VARCHAR);
—编辑数据文件
[dmdba@dm dmdata]$ cat test.txt
1|aaa
2|NULL
3|null
—编辑控制文件
Vim /dmdata/test.ctl
LOAD DATA
INFILE ‘/dmdata/test.txt’
INTO TABLE test77
FIELDS ‘|’
(
C1,
C2
)
—导入测试(null_mode=true)
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’ null_mode=true
—导入测试(null_mode=false)
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’ null_mode=false
—测试结果对比
8、过滤条件
通过在控制文件中指定WHEN子句,可以在装载过程中对数据进行过滤,符合 field_conditions 条件的数据才会被装载。
—创建测试表
SQL> CREATE TABLE TEST88(C1 INT,C2 INT);
—编辑数据文件
[dmdba@dm dmdata]$ cat test.txt
11
22
98
24
—编辑控制文件
Vim /dmdata/test.ctl
LOAD DATA
INFILE ‘/dmdata/test.txt’
INTO TABLE test88
WHEN c1 !=’2’
(
C1 position (1:1),
C2 position (2:2)
)
—导入测试
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’
—结果查看
9、多表装载
通过在控制文件中指定多个 INTO TABLE 子句,可以将一批数据同时向多个表进行装载。每个INTO TABLE子句中都可以指定WHEN过滤条件、FIELDS子句和列定义子句。
—创建测试表
SQL> CREATE TABLE TEST991(C1 INT,C2 INT);
SQL> CREATE TABLE TEST992(C1 INT,C2 INT);
—编辑数据文件
[dmdba@dm dmdata]$ cat test.txt
1,2
2,3
3,2
4,8
9,1
—编辑控制文件
Vim /dmdata/test.ctl
LOAD DATA
INFILE ‘/dmdata/test.txt’
INTO TABLE test991
WHEN C1 != ‘1’
FIELDS ‘,’
( c1 position (1:1), c2 position (3:3) )
INTO TABLE test992
WHEN (3:3) = ‘2’ AND c1 != ‘3’
FIELDS ‘,’
( c1 position (1:1), c2 position (3:3) )
—导入测试
dmfldr userid=sysdba/dameng123@localhost:5236 control=\’/dmdata/test.ctl\’
—结果查看
dmfldr 使用限制
(1)不支持向临时表、外部表装载数据
(2)不支持向系统表装载数据
(3)不支持向带有位图索引的表装载数据
(4)不支持向带有函数索引的表装载数据
(5)不支持向带有全文索引的表装载数据
(6)不支持向 DCP 代理装载数据
(7)不支持在 DPC 环境下,向带有全局索引的表装载数据
(8)dmfldr 装载时会对约束进行检查,对各种约束的处理机制如下表所示;由于 dmfldr 不处理约束的有效性,都视为有效,故需要用户自行处理约束有效性等相关内容
社区地址:https://eco.dameng.com