概述
dmfldr(DM Fast Loader)是DM提供的快速装载数据的命令行工具,能够将安装一定格式排序的文本数据以简单、快速、高效的方式装载到达梦数据库中,或者将达梦数据库中的数据安装一定格式导出到文本文件。
类似Oracle SqlLoader工具。
dmfldr简单使用
查看dmfldr工具的参数选项
dmfldr工具在$DM_HOME/bin目录下。
执行dmfldr help即可查看dmfldr的相关参数以及使用方法。
[dmdba@localhost bin]$ ./dmfldr help
格式: ./dmfldr KEYWORD=value
例程: ./dmfldr SYSDBA/SYSDBA CONTROL='/opt/data/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, 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水平分区表 (TRUE)
EP 指定需要发送数据的站点序号列表,仅向MPP环境导入数据时有效
PARALLEL 是否开启并行装载(FALSE)
SQL 使用自定义查询语句,仅导出模式有效
HELP 打印帮助信息
需要注意的是:USERID和CONTROL参数为必选参数,且USERID必须是命令行中的第一个参数CONTROL 必须是命令行中的第二个参数。其余参数均为可选参数且指定时无顺序要求。
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> ::= "函数名称()"
需要注意的是:控制文件中的OPTIONS选项设置的参数优先级要高于在外面命令行指定的参数选项。
简单测试
本次测试环境为Centos 7,DM8
基础测试
---创建测试表TEST01
create table TEST01(C1 INT,C2 INT,C3 DATE);
---创建数据文件test01.txt
1 1,2021-01-25
2 2,2021-01-26
3 3,2021-01-27
4 4,aaaa-bb-cc
---创建控制文件test01.ctl
OPTIONS
(
SKIP = 0
ROWS = 50000
DIRECT = TRUE
INDEX_OPTION = 2
)
LOAD DATA
INFILE '/home/dmdba/test01.txt'
BADFILE '/home/dmdba/test01.bad'
INTO TABLE test01
FIELDS ','
(C1 TERMINATED BY ' ', #此处制定了C1列以空格为分隔符,而不是FIELDS指定的“,”
C2,
C3 DATE FORMAT 'YYYY-MM-DD' #指定C3列的数据类型格式
)
---使用dmfldr装载数据到数据库
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/home/dmdba/test01.ctl\'
dmfldr V8
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:Yes
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test01.txt
错误文件:/home/dmdba/test01.bad
目标表:TEST01
列名 包装数据类型 终止
C1 CHARACTER WHT
C2 CHARACTER ,
C3 YYYY-MM-DD ,
行缓冲区数量: 2
任务线程数量: 2
3行记录已提交
目标表:TEST01
3 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,1行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:4
拒绝的逻辑记录总数:1
用时:7.702(ms)
通过上面执行的日志信息,我们可以发现有1行数据加载失败,可以通过控制文件中指定的错误输出文件badfile查看具体内容:
[dmdba@localhost bin]$ cat /home/dmdba/test01.bad
dmfldr: 2021-01-25 16:44:26 SYSDBA->TEST01 4 4,aaaa-bb-cc
通过日志可以发现错误的数据为第4行数据,由于TEST01表的C3列数据类型为date类型格式为"yyyy-mm-dd",而数据文件中根据分隔符插入C3列的值为"aaaa-bb-cc"与C3列的数据类型不匹配,所以报错。
另外,在上面的测试中,control的参数值加了“\” 反斜杠进行转义,如果不进行转义则会报如下错误:
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control='/home/dmdba/test01.ctl'
dmfldr V8
控制文件输入参数出错,请确认以符号'作为首尾字符
大字段数据处理
dmfldr 支持对 DM 数据库的大字段类型数据的载入和导出, DM 数据库支持的大字段数据类型有 TEXT、 LONGVARCHAR、 IMAGE、 LONGVARBINARY、 BLOB 以及 CLOB。
导出大字段数据
---创建测试表并插入数据
create table test02(c1 int,c2 blob,c3 clob);
INSERT INTO TEST02 VALUES(1,0XAB121032DE,'abcdefg');
INSERT INTO TEST02 VALUES(2,0XAB121032DE,'abcdefg');
COMMIT;
---编辑控制文件test02.ctl
OPTIONS
(
SKIP = 0
DIRECT = TRUE
INDEX_OPTION = 2
)
LOAD DATA
INFILE '/home/dmdba/test02.txt'
BADFILE '/home/dmdba/test02.bad'
INTO TABLE test02
FIELDS '|'
(C1,
C2,
C3
)
---执行导出
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/home/dmdba/test02.ctl\' LOB_DIRECTORY=\'/home/dmdba\' LOB_FILE_NAME=\'test02.lob\' MODE=\'OUT\'
dmfldr V8
2 rows is load out
总共导出 2 行数据
用时:933.233(ms)
---查看导出文件
[dmdba@localhost bin]$ ls /home/dmdba/test02.lob
/home/dmdba/test02.lob
导入大字段数据1(DIRECT=TRUE)
当 MODE 为 IN 且 DIRECT 为 TRUE 时, 此时数据载入若涉及到大字段对象,需要用户指定大字段数据文件。若 CLIENT_LOB 为 TRUE, LOB_DIRECTORY 应指定大字段数据文件所在的客户端本地目录;若 CLIENT_LOB 为 FALSE, 用户必须先把相关文件传送到 DM服务器所在主库,然后使用 LOB_DIRECTORY 指明存放目录。在数据文件中,大字段以“文件名:起始偏移:长度”的形式记录在数据文件中。指定的文件名无效时, dmfldr 会报错,装载失败。 对于 CLOB 类型字段, 当指定的偏移 、长度范围内带有不完整字符时,dmfldr 将装载失败 。
---创建测试表TEST03
create table test03(c1 int,c2 blob,c3 clob);
----创建数据文件test03.txt
[dmdba@localhost bin]$ cat /home/dmdba/test03.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
---创建testblob.txt、testclob.txt文件,长度大于30字节,存放目录为/home/dmdba
[dmdba@localhost bin]$ ls -l /home/dmdba/testblob.txt
-rw-r--r-- 1 dmdba dinstall 278 Jan 25 17:55 /home/dmdba/testblob.txt
[dmdba@localhost bin]$ ls -l /home/dmdba/testclob.txt
-rw-r--r-- 1 dmdba dinstall 181 Jan 25 17:55 /home/dmdba/testclob.txt
---编辑控制文件test03.ctl,存放路径/home/dmdba
[dmdba@localhost bin]$ cat /home/dmdba/test03.ctl
OPTIONS
(
SKIP = 0
DIRECT = TRUE
INDEX_OPTION = 2
)
LOAD DATA
INFILE '/home/dmdba/test03.txt'
BADFILE '/home/dmdba/test03.bad'
INTO TABLE test03
FIELDS '|'
(C1,
C2,
C3
)
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/home/dmdba/test03.ctl\' LOB_DIRECTORY=\'/home/dmdba\'
dmfldr V8
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:Yes
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test03.txt
错误文件:/home/dmdba/test03.bad
目标表:TEST03
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER |
C3 CHARACTER |
行缓冲区数量: 2
任务线程数量: 2
3行记录已提交
目标表:TEST03
3 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:3
拒绝的逻辑记录总数:0
用时:5.099(ms)
---执行装载
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/home/dmdba/test03.ctl\' LOB_DIRECTORY=\'/home/dmdba\'
dmfldr V8
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:Yes
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test03.txt
错误文件:/home/dmdba/test03.bad
目标表:TEST03
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER |
C3 CHARACTER |
行缓冲区数量: 2
任务线程数量: 2
无效的大字段数据长度
0行记录已提交
目标表:TEST03
0 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,3行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:3
拒绝的逻辑记录总数:3
用时:4.064(ms)
---查询数据
SQL> select *from test03;
行号 c1 c2 c3
---------- ----------- -------------------------------------------------------------- ------------------------------
1 1 0x61616161626262626262 qazwsxedcr
2 2 0x6363656565656565657777777777777774747474 fvtgbyhnujmikolpqwer
3 3 0x77777777777774747474646464646464646C6A6C6A6C6A6C616A736C666A mikolpqwertyuiopqazwsxedcrfvtg
在导入时,如果testblob.txt、testclob.txt的长度小于数据文件test03.txt中偏移量的长度,则导入时会报错**“无效的大字段数据长度”**。
导入大字段数据2(DIRECT=FALSE)
当 MODE 为 IN 且 DIRECT 为 FALSE 时, 数据文件中大字段列数据即字段内容。
BLOB_TYPE 参数指定 BLOB 列内容为十六进制或者字符串:
(1)BLOB_TYPE 为 HEX_CHAR 时,数据文件中 BLOB 列当作为十六进制内容;
(2)BLOB_TYPE 为 HEX 时,数据文件中 BLOB 列为字符串形式内容,导入后会转换为十六进制;
BLOB_TYPE 参数只对 DIRECT 为 FALSE 时有效,默认为 HEX_CHAR。
---创建测试表TEST04
create table test04(c1 int,c2 blob,c3 clob);
---创建数据文件test04.txt,存放路径为/home/dmdba,内容如下:
1|0x12d3c8a7|abcdefg
2|0x12a4cbac|hijlkmn
3|0x22d3c8b3|adefhjd
---创建控制文件test04.ctl,存放路径为/home/dmdba,内容如下:
OPTIONS
(
SKIP = 0
DIRECT = FALSE
INDEX_OPTION = 2
)
LOAD DATA
INFILE '/home/dmdba/test04.txt'
BADFILE '/home/dmdba/test04.bad'
INTO TABLE test04
FIELDS '|'
(C1,
C2,
C3
)
---装载数据
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/home/dmdba/test04.ctl\' blob_type=\'hex_char\'
dmfldr V8
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:No
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test04.txt
错误文件:/home/dmdba/test04.bad
目标表:TEST04
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER |
C3 CHARACTER |
3 rows processed.
目标表:TEST04
3 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:3
拒绝的逻辑记录总数:0
用时:26.079(ms)
---查询数据
SQL> select *from test04;
行号 c1 c2 c3
---------- ----------- ---------- -------
1 1 0x12D3C8A7 abcdefg
2 2 0x12A4CBAC hijlkmn
3 3 0x22D3C8B3 adefhjd
---创建测试表test04_1
create table test04_1(c1 int,c2 blob,c3 clob);
---数据文件同上,控制文件如下
OPTIONS
(
SKIP = 0
DIRECT = FALSE
INDEX_OPTION = 2
)
LOAD DATA
INFILE '/home/dmdba/test04.txt'
BADFILE '/home/dmdba/test04.bad'
INTO TABLE test04_1
FIELDS '|'
(C1,
C2,
C3
)
---装载数据
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/home/dmdba/test04.ctl\' blob_type=\'hex\'
dmfldr V8
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:No
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test04.txt
错误文件:/home/dmdba/test04.bad
目标表:TEST04_1
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER |
C3 CHARACTER |
3 rows processed.
目标表:TEST04_1
3 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:3
拒绝的逻辑记录总数:0
用时:2.976(ms)
---查询数据
SQL> select *from test04_1;
行号 c1 c2 c3
---------- ----------- ---------------------- -------
1 1 0x30783132643363386137 abcdefg
2 2 0x30783132613463626163 hijlkmn
3 3 0x30783232643363386233 adefhjd
自增列装载
自增列是比较特殊的列,为了保证数据库中自增列列值的正确性,用户在进行数据载入时需要特别注意。
当 DIRECT 参数为 FALSE 时, dmfldr 将把从数据文件中读取的自增列值作为目标值插入数据库表中,用户应当保证每一行的自增列的值符合自增列的规则,否则将造成数据混乱。
当 DIRECT 参数为 TRUE 时, dmfldr 提供了 SET_IDENTITY 参数(默认为 FALSE)对数据载入时自增列的处理进行设置:
(1)如果指定 SET_IDENTITY 选项值为 TRUE,则 dmfldr 将把从数据文件中读取的自增列值作为目标值插入数据库表中,用户应当保证每一行的自增列的值符合自增列的规则,否则将造成数据混乱;
(2)如果 SET_IDENTITY 选项值设置为 FALSE,则 dmfldr 将忽略数据文件中对应自增列的值,服务器将根据自增列定义和表中已有数据自动生成自增列的值插入每一行的对应列。
DIRECT=TRUE,SET_IDENTITY=FALSE
---(1)创建测试表
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;
---查询
SQL> select *from test;
行号 C1 C2
---------- ----------- ---
1 1 AAA
2 2 BBB
---(2)编辑数据文件test.txt,存放路径/home/dmdba,内容如下:
2|aaa
3|bbb
4|ccc
---(3)编辑控制文件test.ctl,存放路径/home/dmdba,内容如下:
OPTIONS
(
SKIP = 0
ROWS = 50000
INDEX_OPTION = 2
)
LOAD DATA
INFILE '/home/dmdba/test.txt'
BADFILE '/home/dmdba/test.bad'
INTO TABLE test
FIELDS '|'
(C1,
C2
)
---(4)装载数据(DIRECT=TRUE SET_IDENTITY=FALSE)
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/home/dmdba/test.ctl\' DIRECT=TRUE SET_IDENTITY=FALSE
dmfldr V8
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:Yes
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test.txt
错误文件:/home/dmdba/test.bad
目标表:TEST
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER |
行缓冲区数量: 2
任务线程数量: 2
3行记录已提交
目标表:TEST
3 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:3
拒绝的逻辑记录总数:0
用时:4.079(ms)
---查询数据
SQL> select * from test;
行号 C1 C2
---------- ----------- ---
1 1 AAA
2 2 BBB
3 3 aaa
4 4 bbb
5 5 ccc
DIRECT=TRUE,SET_IDENTITY=TRUE
重复上面(1)(2)(3)步骤;
(4)装载数据DIRECT=TRUE,SET_IDENTITY=TRUE
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/home/dmdba/test.ctl\' DIRECT=TRUE SET_IDENTITY=TRUE
dmfldr V8
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:Yes
是否插入自增列:Yes
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test.txt
错误文件:/home/dmdba/test.bad
目标表:TEST
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER |
行缓冲区数量: 2
任务线程数量: 2
3行记录已提交
目标表:TEST
3 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:3
拒绝的逻辑记录总数:0
用时:3.930(ms)
(5)查询数据
SQL> select * from test;
行号 C1 C2
---------- ----------- ---
1 1 AAA
2 2 BBB
3 2 aaa
4 3 bbb
5 4 ccc
在表中有自增列的情况下装载时,dmfldr参数direct=false效果与direct=true set_identity=true相同,都是将把从dmfldr数据文件中读取的自增列值作为目标值插入数据库表中,这种情况需要保证每一行的自增列的值符合自增列的规则,否则将造成数据混乱。
空值处理
dmfldr 通过设置 NULL_MODE 参数来处理空值。设置为TRUE,载入时NULL字符串处理为NULL,载出时空值处理为NULL字符串;设置为FALSE,载入时NULL字符串处理为字符串,载出时空值处理为空串。
导入NULL_MODE=TRUE
(1)创建测试表TEST
drop table test;
create table test(c1 int,c2 varchar(20));
(2)编辑数据文件test.txt,存放路径/home/dmdba,内容如下:
1|aaa
2|NULL
3|null
(3)编辑控制文件test.ctl,存放路径/home/dmdba,内容如下:
OPTIONS
(
SKIP = 0
ROWS = 50000
INDEX_OPTION = 2
)
LOAD DATA
INFILE '/home/dmdba/test.txt'
BADFILE '/home/dmdba/test.bad'
INTO TABLE test
FIELDS '|'
(C1,
C2
)
(4)装载数据 null_mode=true
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/home/dmdba/test.ctl\' null_mode=true
dmfldr V8
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:Yes
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test.txt
错误文件:/home/dmdba/test.bad
目标表:TEST
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER |
行缓冲区数量: 2
任务线程数量: 2
3行记录已提交
目标表:TEST
3 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:3
拒绝的逻辑记录总数:0
用时:3.950(ms)
(5)查看数据
SQL> select * from test;
行号 c1 c2
---------- ----------- ----
1 1 aaa
2 2 NULL
3 3 NULL
SQL> select c1 ,ifnull(c2,'null value') from test;
行号 c1 ifnull(c2,'nullvalue')
---------- ----------- ----------------------
1 1 aaa
2 2 null value
3 3 null value
导入NULL_MODE=FALSE
执行上面(1)(2)(3)步骤;
(4)装载数据 null_mode=false
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/home/dmdba/test.ctl\' null_mode=false
dmfldr V8
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:Yes
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test.txt
错误文件:/home/dmdba/test.bad
目标表:TEST
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER |
行缓冲区数量: 2
任务线程数量: 2
3行记录已提交
目标表:TEST
3 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:3
拒绝的逻辑记录总数:0
用时:3.152(ms)
(5)查询数据
SQL> select *from test;
行号 c1 c2
---------- ----------- ----
1 1 aaa
2 2 NULL
3 3 null
SQL> select c1 ,ifnull(c2,'null value') from test;
行号 c1 ifnull(c2,'nullvalue')
---------- ----------- ----------------------
1 1 aaa
2 2 NULL
3 3 null
可以看到当设置null_mode=false时,装载数据时"NULL"、“null"会被作为"NULL”、"null"两个字符串插入到表中;
导出NULL_MODE=TRUE
执行"导入NULL_MODE=TRUE"的所有步骤,然后修改控制文件内容如下:
OPTIONS
(
SKIP = 0
ROWS = 50000
INDEX_OPTION = 2
)
LOAD DATA
INFILE '/home/dmdba/test_nt.txt'
BADFILE '/home/dmdba/test.bad'
INTO TABLE test
FIELDS '|'
(C1,
C2
)
(4)执行导出 NULL_MODE=TRUE
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/home/dmdba/test.ctl\' null_mode=TRUE mode=\'out\'
dmfldr V8
3 rows is load out
总共导出 3 行数据
用时:131.980(ms)
(5)查看导出文件内容
[dmdba@localhost bin]$ cat /home/dmdba/test_nt.txt
1|aaa
2|NULL
3|NULL
可以看到导出值为NULL字符串。
导出NULL_MODE=FALSE
执行"导入NULL_MODE=TRUE"的所有步骤,然后修改控制文件内容如下:
OPTIONS
(
SKIP = 0
ROWS = 50000
INDEX_OPTION = 2
)
LOAD DATA
INFILE '/home/dmdba/test_nf.txt'
BADFILE '/home/dmdba/test.bad'
INTO TABLE test
FIELDS '|'
(C1,
C2
)
(4)执行导出 NULL_MODE=FALSE
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/home/dmdba/test.ctl\' null_mode=FALSE mode=\'out\'
dmfldr V8
3 rows is load out
总共导出 3 行数据
用时:123.234(ms)
(5)查看导出文件内容
[dmdba@localhost bin]$ cat /home/dmdba/test_nf.txt
1|aaa
2|
3|
可以看到,设置null_mode=false,导出文件内容值为空字符串。
dmfldr使用限制
(1)不支持向临时表、外部表装载数据
(2)不支持向系统表装载数据
(3)不支持向带有位图索引的表装载数据
(4)不支持向带有函数索引的表装载数据
(5)不支持向带有全文索引的表装载数据
(6)不支持向 DCP 代理装载数据
(7)dmfldr装载时,对约束进行检查,对各种约束的处理机制如下表所示:
约束 | 数据不满足时 | 数据是否插入 | 约束是否有效 |
---|---|---|---|
非空约束(NOT NULL) | 报错 | 不插入 | 有效 |
唯一约束(UNIQUE,PRIMARY KEY) | 报错 | 插入 | 失效 |
引用约束(FOREIGN KEY) | 不报错 | 插入 | 有效 |
CHECK约束(CHECK) | 不报错 | 插入 | 有效 |
聚集索引(CLUSTER PRIMARY KEY) | 报错 | 不插入 | 有效 |
更多资讯请上达梦技术社区了解:https://eco.dameng.com