DM7数据库数据快速加载(dmfldr) 详解
作者:互联网
DM7数据库数据快速加载(dmfldr) 详解
一 概述
1.1 功能
dmfldr(DM Fast Loader)是 DM7 提供的快速数据装载命令行工具。用户通过使用 dmfldr 工具能够把按照一定格式排序的文本数据以简单、快速、高效的方式载入到 DM数据库中,或把 DM 数据库中的数据按照一定格式写入文本文件。
1.2 架构
如图所示,dmfldr 实际上除了客户端工具,还包含一个在 DM7 数据库服务器中的dmfldr 功能模块,它们共同完成 dmfldr 的各项功能。
1、当进行数据载入时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件与数据文件,将数据打包发送给服务器端的 dmfldr 模块,由服务器完成数据的真正装载工作。并分析服务器返回的消息,必要时根据用户参数指定生成日志文件与错误数据文件。
2、当进行数据导出时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件,将用户要求转换成相应消息发送给服务器端的 dmfldr 模块。服务器解析并打包需要导出的数据,发送给 dmfldr 客户端,客户端将数据写入指定的数据文件,必要时根据用户参数指定生成日志文件。
二 dmfldr入门
2.1 启动
安装好 DM7 数据库管理系统后,在安装目录的“bin”子目录下可找到 dmfldr 执行文件。
启动操作系统的命令行窗口,进入“dmfldr”所在目录,如果配置了环境变量,则可以在任何位置启动,可以准备启动 dmfldr 工具了。
dmfldr 的使用必须指定必要的参数,否则工具会报错“无效的参数个数”并退出。为dmfldr 指定参数的格式为:
dmfldr keyword=value [keyword=value ...]
例如:
dmfldr USERID=SYSDBA/SYSDBA CONTROL='c:\fldr.ctl'
如例子所示,USERID 和 CONTROL 是启动 dmfldr 必须要指定的参数,且 USERID 必须是第一个参数,CONTROL 必须是第二个参数。
2.2 dmfldr语法
dmfldr 使用较为灵活,参数较多,用户可以使用“dmfldr help”查看各参数的简单信息。
dmfldr help
格式: DMFLDR KEYWORD=value
例程: DMFLDR SYSDBA/SYSDBA CONTROL='c:\fldr.ctl'
USERID 必须是命令行中的第一个参数
CONTROL 必须是命令行中的第二个参数
字符串类型参数必须以引号封闭
关键字 说明(默认值)
---------------------------------------------------------------------------
USERID 用户名/口令格式:USER/PWD@SERVER:PORT#SSL_PATH@SSL_PWD
CONTROL 控制文件,字符串类型
LOG 日志文件,字符串类型 (dfldr.log),不指定默认放在文件位置
BADFILE 错误数据记录文件,字符串类型 (dfldr.bad)
SKIP 初始忽略逻辑行数 (0)
LOAD 需要装载的行数 (ALL)
ROWS 提交频次 (50000), DIRECT 为 FALSE 有效
DIRECT 是否使用快速方式装载 (TRUE)
SET_IDENTITY 是否插入自增列 (FALSE)
SORTED 数据是否已按照聚集索引排序 (FALSE)
INDEX_OPTION 索引选项 (1)
1 不刷新二级索引,数据按照索引先排序,装载完后再
将排序的数据插入索引
2 不刷新二级索引,数据装载完成后重建所有二级索引
ERRORS 允许的最大数据错误数 (100)
CHARACTER_CODE 字符编码,字符串类型 (GBK, UTF-8, SINGLE_BYTE, EUC-KR)
MODE 装载方式,字符串类型 IN 表示载入,OUT 表示载出,默认为IN;
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
SILENT 是否静默方式装载数据(FALSE)
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)
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 水平分区表 (FALSE)
HELP 打印帮助信息
2.3 控制文件语法
控制文件 CONTROL 是启动 dmfldr 必须要指定的参数,用于指定数据文件中数据的格式。在数据载入时,dmfldr 根据控制文件指定的格式来解析数据文件;导出数据时,dmfldr 也会根据控制文件指定的列分隔符、行分隔符等生成数据文件。
控制文件中还可以指定其他 dmfldr 参数值。
dmfldr 控制文件的语法如下所示:
[OPTIONS(
<id>=<value>
……
)]
LOAD [DATA]
INFILE [LIST] <path_name> [<row_term_option>] [,<path_name>
[<row_term_option>]]
[BADFILE <path_name>]
[APPEND|REPLACE|INSERT]
<into_table_clause>
INTO TABLE [<schema>.]<tablename>
[FIELDS <delimiter>]
[<coldef_option>]
<id> ::=参数
<value> ::=值
<path_name> ::=文件地址
<path_name_list> ::=含文件列表文件地址
<row_term_option> ::=STR [X] <delimiter>
<into_table_clause> ::= <into_table_single>{<into_table_single>}
<into_table_single> ::=INTO TABLE [<schema>.]<tablename>
[WHEN <field_conditions>]
[FIELDS [TERMINATED BY] [X] <delimiter>]
[<enclosed_option>]
[<coldef_option>]
<schema> ::=模式名
<tablename> ::=表名
<field_conditions> ::= <field_condition>{ AND <field_condition>}
< field_condition> ::= [(] <cmp_exp><cmp_ops><cmp_data>[)]
<cmp_exp> ::= <colid> | (p1:p2)
<cmp_ops> ::= = | <> | !=
<cmd_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> ::= "函数名称()"
对于上述控制文件语法,需要说明的是:
1、dmfldr 在处理数据文件中换行符时 windows 默认为 0x0D0A(\r\n),非windows 默认为 0x0A(\n),用户应该根据现有的数据文件中的换行符做相应的调整。对应选项为<row_term_option>,若指定的<value>值为十六进制的字符串值需要指明[X]选项,<value>值不再需要以 0x 开头。若没有指明[X]选项,则<value>值为指定的字符串;
2、关于列分隔符,用户应当指定 FIELDS 或者 coldef_option 中的至少一种。若两者均存在,则以 coldef_option 中的设置为准,若分隔符指明[X]选项,则表明此分隔符为十六进制格式的字符串;
3、关于 LIST 选项,INFILE 使用 LIST 选项时,表明实际的数据文件路径存储在INFILE 指定的文件中,该文件可以存储多个实际的数据文件路径,使用逗号或者换行分割;
4、关于 OPTIONS 选项,该选项支持命令行参数中除 userid,control,help 以外的所有参数的指定,每个参数值对使用空格或者换行分割。对于 option 中出现的参数,在 dmfldr 的指定执行参数中也出现的,dmfldr 会选择 option 中对应参数的值执行;
5、关于 col_def,FILLER 表示跳过处理数据文件中指定列的值;
6、关于 property_option 选项
A、position(p1:p2):从数据文件中每行数据的第 p1 个字节到第 p2 个字节为该列值,包含边界 p1,p2;
B、 position(p1):从数据文件中每行数据的第 p1 个字节开始,到下一个列分
隔符之间的数据为该列值,包含边界 p1;
C、position 选项对大字段数据无效,若对大字段类型指定此选项会报错;
D、NULL:指定的值为 NULL,忽略数据文件中的值;
property_option 参数仅对导入有效;
7、关于 term_option 选项,该选项用来指定数据文件中指定列的结束标志。列的结束标志可以是 WHITESPACE(空格)或者用户自定义的字符串或十六进制串。指定了 term_option 后,该列不需要用 FIELDS 分隔;
8、关于 enclosed_option 选项,此参数指定封闭符,为可选参数,默认不存在封闭符。若在 into_table_clause 和 coldef_option 中均设置了封闭符,则以 coldef_option 中的设置为准,若封闭符前指定[X]选项,则表明此封闭符为十六进制格式的字符串;
9、分隔符或封闭符字符串的长度均不能超过 255 个字节;
10、关于 constant_option 选项,指定 constant 关键字后,数据文件中不需要为该列准备数据,如果指定了,该列数据将作为下一字段数据装载而导致数据混乱。constant 选项对大字段类型无效;
11、关于 fun_option 选项,目前只支持 trim()函数。
三 dmfldr实例
3.1 普通文件(文本文件)
3.1.1 创建测试表
SQL> drop table test;
操作已执行
已用时间: 29.165(毫秒). 执行号:1174.
SQL>
SQL> create table test(c1 int,c2 int,c3 date);
操作已执行
已用时间: 21.497(毫秒). 执行号:1175.
SQL>
3.1.2 创建源数据文件test.txt
[dmdba@dm3 ~]$ cat /home/dmdba/test.txt
1|1 2019-09-22
2|2 2019-09-22
3|3 2019-09-22
[dmdba@dm3 ~]$
3.1.3 创建控制文件test.ctl
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE test
FIELDS '|'
(
c1,
c2 TERMINATED BY ' ',
c3 DATE FORMAT 'yyyy-mm-dd'
)
[dmdba@dm3 ~]$
3.1.4 使用 dmfldr 进行数据载入
[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' log=\'/home/dmdba/dmfldr_test.log\'
dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:Yes
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test.txt
错误文件:fldr.bad
目标表:TEST
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER WHT
C3 yyyy-mm-dd |
行缓冲区数量: 2
任务线程数量: 1
3行记录已提交
目标表:TEST
3 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:3
拒绝的逻辑记录总数:0
用时:10.231(ms)
从日志输出,告诉我们成功导入3行.
3.1.5 查询验证
SQL> select * from test;
行号 c1 c2 c3
---------- ----------- ----------- ----------
1 1 1 2019-09-22
2 2 2 2019-09-22
3 3 3 2019-09-22
已用时间: 10.354(毫秒). 执行号:1178.
SQL>
3.2 大字段数据处理
3.2.1 大字段数据的导出
当 dmfldr 工作在导出模式即 MODE 为 OUT 时,dmfldr 生成大字段对应的数据文件名由 LOB_FILE_NAME 指定,若未指定默认为 dmfldr.lob,文件存放于LOB_DIRECTORY 指定的目录,如果未指定 LOB_DIRECTORY 则存放于指定的导出数据文件同一目录。
3.2.1.1 创建测试表
SQL> drop table test;
操作已执行
已用时间: 29.165(毫秒). 执行号:1174.
SQL>
SQL> create table test(c1 int,c2 blob,c3 clob);
操作已执行
已用时间: 21.497(毫秒). 执行号:1175.
SQL>
3.2.1.2 插入数据
INSERT INTO TEST VALUES(1,0XAB121032DE,'abcdefg');
INSERT INTO TEST VALUES(2,0XAB121032DE,'abcdefg');
COMMIT;
SQL> select * from test;
行号 c1 c2 c3
---------- ----------- ------------ -------
1 1 0xAB121032DE abcdefg
2 2 0xAB121032DE abcdefg
已用时间: 0.489(毫秒). 执行号:1184.
SQL>
3.2.1.3 创建控制文件test.ctl
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE test
FIELDS '|'
(
c1,
c2,
c3
)
[dmdba@dm3 ~]$
3.2.1.4 使用 dmfldr 进行数据导出
[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' lob_directory=\'/home/dmdba\' mode=\'out\' log=\'/home/dmdba/dmfldr_test.log\'
dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT
2 rows is load out
总共导出 2 行数据
用时:199.145(ms)
[dmdba@dm3 ~]$
3.2.1.5 验证
[dmdba@dm3 ~]$ cat test.txt
1|dmfldr.lob:0:5 dmfldr.lob:5:7
2|dmfldr.lob:12:5 dmfldr.lob:17:7
[dmdba@dm3 ~]$
[dmdba@dm3 ~]$ ls
dmfldr_test.log test.ctl 公共的 视频 文档 音乐 dmfldr.lob test.txt 模板 图片 下载 桌面
[dmdba@dm3 ~]$
在这个例子中,指定了 LOB_DIRECTORY,而没有指定 LOB_FILE_NAME,导出的大字段数据文件将存放在 LOB_DIRECTORY 指定的/opt/data 目录,文件名为dmfldr.lob。
3.2.2 DIRECT为TRUE时大字段数据的载入
当 MODE 为 IN 且 DIRECT 为 TRUE 时,此时数据载入若涉及到大字段对象,需要用户指定大字段数据文件。若 CLIENT_LOB 为 TRUE,LOB_DIRECTORY 应指定大字段数据文件所在的客户端本地目录;若 CLIENT_LOB 为 FALSE,用户必须先把相关文件传送到 DM服务器所在主库,然后使用 LOB_DIRECTORY 指明存放目录
大字段数据文件在数据文件中指定,可以是任意格式的文件。在数据文件中,大字段以“文件名:起始偏移:长度”的形式记录在数据文件中。指定的文件名无效时,dmfldr 会报错,装载失败。对于 CLOB 类型字段,当指定的偏移、长度范围内带有不完整字符时,dmfldr 将装载失败。
3.2.2.1 创建测试表
SQL> drop table test;
操作已执行
已用时间: 29.165(毫秒). 执行号:1174.
SQL>
SQL> create table test(c1 int,c2 blob,c3 clob);
操作已执行
已用时间: 21.497(毫秒). 执行号:1175.
SQL>
3.2.2.2 创建源数据文件test.txt
[dmdba@dm3 ~]$ cat /home/dmdba/test.txt
1|testblob.txt:0:1|testclob.txt:0:1
2|testblob.txt:1:2|testclob.txt:1:2
3|testblob.txt:2:3|testclob.txt:2:3
[dmdba@dm3 ~]$
其中testblob.txt、testclob.txt 为文本文件,长度大于 3 字节,存放路径
为/home/dmdba。
3.2.2.3 创建控制文件test.ctl
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE test
FIELDS '|'
(
c1,
c2,
c3
)
[dmdba@dm3 ~]$
3.2.2.4 使用 dmfldr 进行数据载入
[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' lob_directory=\'/home/dmdba\' log=\'/home/dmdba/dmfldr_test.log\'
dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:Yes
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test.txt
错误文件:fldr.bad
目标表:TEST
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER |
C3 CHARACTER |
行缓冲区数量: 2
任务线程数量: 1
3行记录已提交
目标表:TEST
3 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:3
拒绝的逻辑记录总数:3
用时:37.195(ms)
[dmdba@dm3 ~]$
从日志输出,告诉我们成功导入3行.
3.2.2.5 查询验证
SQL> select * from test;
行号 c1 c2 c3
---------- ----------- ----------- ----------
1 1 1 2019-09-22
2 2 2 2019-09-22
3 3 3 2019-09-22
已用时间: 10.354(毫秒). 执行号:1178.
SQL>
3.2.3 DIRECT为FALSE时大字段数据的载入
当 MODE 为 IN 且 DIRECT 为 FALSE 时,数据文件中大字段列数据即字段内容。BLOB_TYPE 参数指定 BLOB 列内容为十六进制或者字符串:
l BLOB_TYPE 为 HEX_CHAR 时,数据文件中 BLOB 列当作为十六进制内容;
l BLOB_TYPE 为 HEX 时,数据文件中 BLOB 列为字符串形式内容,导入后会转换为十六进制。
BLOB_TYPE 参数只对 DIRECT 为 FALSE 时有效,默认为 HEX_CHAR。
3.2.3.1 创建测试表
SQL> drop table test;
操作已执行
已用时间: 29.165(毫秒). 执行号:1174.
SQL>
SQL> create table test(c1 int,c2 blob,c3 clob);
操作已执行
已用时间: 21.497(毫秒). 执行号:1175.
SQL>
3.2.3.2 创建源数据文件test.txt
[dmdba@dm3 ~]$ cat /home/dmdba/test.txt
1|0x12d3c8a7|abcdefg
2|0x12a4cbac|hijlkmn
3|0x22d3c8b3|adefhjd
[dmdba@dm3 ~]$
3.2.3.3 创建控制文件test.ctl
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE test
FIELDS '|'
(
c1,
c2,
c3
)
[dmdba@dm3 ~]$
3.2.3.4 使用 dmfldr 进行数据载入
[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' direct=false blob_type=\'hex_char\' log=\'/home/dmdba/dmfldr_test.log\'
dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:No
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test.txt
错误文件:fldr.bad
目标表:TEST
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER |
C3 CHARACTER |
3 rows processed.
目标表:TEST
3 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:3
拒绝的逻辑记录总数:0
用时:1364.220(ms)
从日志输出,告诉我们成功导入3行.
3.2.3.5 查询验证
SQL> select * from test;
行号 c1 c2 c3
---------- ----------- ---------- -------
1 1 0x12D3C8A7 abcdefg
2 2 0x12A4CBAC hijlkmn
3 3 0x22D3C8B3 adefhjd
已用时间: 25.011(毫秒). 执行号:1198.
SQL>
对于blog_type为hex的情形,读者可以自行测试,方法与上面相同。
四 特殊应用
4.1 文本文件第一行为列名
SKIP 参数用来设置跳过数据文件起始的逻辑行数,int数值。默认的跳过起始行数为0 行。
继续使用之前的test.txt文件,修改文件如下:
[dmdba@dm3 ~]$ cat /home/dmdba/test.txt
col1 col2 col3
1|1 2019-09-22
2|2 2019-09-22
3|3 2019-09-22
[dmdba@dm3 ~]$
对于此类文件的导入,需要设置跳过文本文件的第一行,设置方法有两种:
1、通过控制文件
创建控制文件test.ctl:
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
OPTIONS
(
SKIP = 1
)
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE test
FIELDS '|'
(
c1,
c2 TERMINATED BY ' ',
c3 DATE FORMAT 'yyyy-mm-dd'
)
[dmdba@dm3 ~]$
2、在导入时直接指定skip参数
dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' log=\'/home/dmdba/dmfldr_test.log\' skip=1
我们这里选择第一种方式:
执行数据导入:
[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' log=\'/home/dmdba/dmfldr_test.log\'
dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:Yes
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test.txt
错误文件:fldr.bad
目标表:TEST
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER WHT
C3 yyyy-mm-dd |
行缓冲区数量: 2
任务线程数量: 1
3行记录已提交
目标表:TEST
3 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:3
拒绝的逻辑记录总数:0
用时:10.231(ms)
从日志输出,告诉我们成功导入3行.
验证:
SQL> select * from test;
行号 c1 c2 c3
---------- ----------- ----------- ----------
1 1 1 2019-09-22
2 2 2 2019-09-22
3 3 3 2019-09-22
已用时间: 0.721(毫秒). 执行号:1203.
SQL>
4.2 最后一行格式不正确而无法导入
dmfldr 使用的数据文件都是文本格式的,其中的列值都是以字符串的方式保存在数据文件中。要想将这些数据载入数据库表中,需要将字符串转换成数据库表各列对应的数据类型。dmfldr 支持所有 DM 数据库支持的列定义类型,包括字符串、数值、时间日期、时间
日期间隔、大字段类型等。
若数据文件的编码方式与 DM 数据库服务器的编码方式不一样,dmfldr 还需要进行字符编码的转换。dmfldr 支持 UTF8 和 GBK 编码之间的相互转换。
数据类型和编码转换工作由 dmfldr 客户端进行,在这个过程中如果出现错误,dmfldr 会跳过该行继续后面的工作,并记录错误行到 BADFILE 指定的文件。
4.2.1 创建测试表
SQL> drop table test;
操作已执行
已用时间: 29.165(毫秒). 执行号:1174.
SQL>
SQL> create table test(c1 int,c2 int,c3 date);
操作已执行
已用时间: 21.497(毫秒). 执行号:1175.
SQL>
4.2.2 创建源数据文件test.txt
[dmdba@dm3 ~]$ cat /home/dmdba/test.txt
1|1 2019-09-22
2|2 2019-09-22
3|3 2019-09-22
4|4 yyyy-mm-dd
[dmdba@dm3 ~]$
4.2.3 创建控制文件test.ctl
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE test
FIELDS '|'
(
c1,
c2 TERMINATED BY ' ',
c3 DATE FORMAT 'yyyy-mm-dd'
)
[dmdba@dm3 ~]$
4.2.4 使用 dmfldr 进行数据载入
[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' log=\'/home/dmdba/dmfldr_test.log\' badfile=\'/home/dmdba/test.bad\'
dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT
dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:1
允许错误数:100
是否直接加载:Yes
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
数据文件共1个:
/home/dmdba/test.txt
错误文件:/home/dmdba/test.bad
目标表:TEST
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER WHT
C3 yyyy-mm-dd |
行缓冲区数量: 2
任务线程数量: 1
2行记录已提交
目标表:TEST
2 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,1行 没有加载。
跳过的逻辑记录总数:1
读取的逻辑记录总数:3
拒绝的逻辑记录总数:1
用时:18.103(ms)
[dmdba@dm3 ~]$
从日志输出,告诉我们成功导入3行,跳过1行.
4.2.5 查询验证
SQL> select * from test;
行号 c1 c2 c3
---------- ----------- ----------- ----------
1 1 1 2019-09-22
2 2 2 2019-09-22
3 3 3 2019-09-22
已用时间: 10.354(毫秒). 执行号:1178.
SQL>
4.3 多表装载
通过在控制文件中指定多个 INTO TABLE 子句,可以将一批数据同时向多个表进行装载。每个 INTO TABLE 子句中都可以指定 WHEN 过滤条件、FIELDS 子句和列定义子句。对于多表装载的使用需注意以下几点:
l 每个 INTO TABLE 子句的目标表必须是不同的表;
l 多表装载时不支持直接装载分区表子表;
对于第二个及其之后的 INTO TABLE 子句,在其 coldef_option 中,必须为第一列指定 POSITION 选项;
4.3.1 创建测试表
SQL> drop table test1;
SQL> drop table test2;
SQL> create table test1(c1 int,c2 int);
操作已执行
已用时间: 11.497(毫秒). 执行号:1209.
SQL> create table test2(c1 int,c2 int);
操作已执行
已用时间: 12.779(毫秒). 执行号:1210.
SQL>
4.3.2 创建源数据文件test.txt
[dmdba@dm3 ~]$ cat /home/dmdba/test.txt
1,2
2,3
3,2
4,8
9,1
[dmdba@dm3 ~]$
4.3.3 创建控制文件test.ctl
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE test1
WHEN C1 != '1'
FIELDS ','
(
c1 position (1:1),
c2
)
INTO TABLE test2
WHEN (3:3) = '2' AND c1 != '3'
FIELDS ','
(
c1 position (1:1),
c2
)
[dmdba@dm3 ~]$
4.3.4 使用 dmfldr 进行数据载入
[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' log=\'/home/dmdba/dmfldr_test.log\' badfile=\'/home/dmdba/test.bad\'
dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT
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
目标表:TEST1
列名 包装数据类型 终止
C1 CHARACTER ,
C2 CHARACTER ,
行缓冲区数量: 2
任务线程数量: 1
数据文件共1个:
/home/dmdba/test.txt
错误文件:/home/dmdba/test.bad
目标表:TEST2
列名 包装数据类型 终止
C1 CHARACTER ,
C2 CHARACTER ,
行缓冲区数量: 2
任务线程数量: 1
1行记录已提交
4行记录已提交
目标表:TEST1
4 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:5
拒绝的逻辑记录总数:0
用时:21.305(ms)
目标表:TEST2
1 行加载成功。
由于数据格式错误,0行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:5
拒绝的逻辑记录总数:0
用时:21.305(ms)
从日志输出,告诉我们成功导入两个表的数据.
4.3.5 查询验证
SELECT * FROM TEST1;
行号 C1 C2
---------- ----------- -----------
1 2 3
2 3 2
3 4 8
4 9 1
SELECT * FROM TEST2;
行号 C1 C2
---------- ----------- -----------
1 1 2
4.4 控制文件中导入表的三种模式
以下面的控制文件为例:
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE test
FIELDS '|'
(
c1,
c2 TERMINATED BY ' ',
c3 DATE FORMAT 'yyyy-mm-dd'
)
控制文件中导入表的模式有三种:append,insert,replace,这个与oracle的sqlloader类似,默认为append方式,所以上面的控制语句也可以写为:
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
LOAD DATA
INFILE '/home/dmdba/test.txt'
APPEND INTO TABLE test
FIELDS '|'
(
c1,
c2 TERMINATED BY ' ',
c3 DATE FORMAT 'yyyy-mm-dd'
)
其它模式与此类似,不再举例。
4.5 其它注意事项
对于控制文件中的OPTION部分的内容,也可以在dmfldr命令行下直接指定,以日志文件log为例:
dmfldr 的日志文件路径由 LOG 参数设置,默认日志文件名为 fldr.log。文件记录了装载过程中的装载信息和错误信息以及统计信息。用户也可以通过设置控制文件中的OPTION 选项来指定日志路径。如果参数及 OPTION 中同时指定了日志路径则其将以OPTION 中指定的路径为最终路径。
控制文件中关于 OPTIONS 选项,该选项支持命令行参数中除 userid,control,help 以外的所有参数的指定,每个参数值对使用空格或者换行分割。对于 option 中出现的参数,在 dmfldr 的指定执行参数中也出现的,dmfldr 会选择 option 中对应参数的值执行;
有如下的控制文件:
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
OPTIONS
(
LOG = '/tmp/dmfldr.log'
)
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE test
FIELDS '|'
(
c1,
c2 TERMINATED BY ' ',
c3 DATE FORMAT 'yyyy-mm-dd'
)
[dmdba@dm3 ~]$
执行数据载入时也指定log选项:
dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' log=\'/home/dmdba/dmfldr_test.log\' badfile=\'/home/dmdba/test.bad\'
此时日志的生成以控制文件中OPTIONS中指定的路径为准!!!
标签:dmdba,数据文件,dm3,dmfldr,DM7,test,home,详解 来源: https://blog.51cto.com/semiter/2440075