DMFLDR工具常用用法
1.功能简介
dmfldr(DM Fast Loader)是DM 提供的快速数据装载命令行工具。用户通过使用dmfldr 工具能够把按照一定格式排序的文本数据以简单、快速、高效的方式载入到DM 数据库中,或把DM 数据库中的数据按照一定格式写入文本文件。
其中,表及表的同义词支持数据导入和导出,视图及视图的同义词仅支持数据导出。
2.系统结构
dmfldr 的系统结构如图所示:
如图所示,dmfldr 实际上除了客户端工具,还包含一个在数据库服务器中的dmfldr功能模块,它们共同完成dmfldr 的各项功能。
当进行数据载入时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件与数据文件,将数据打包发送给服务器端的dmfldr 模块,由服务器完成数据的真正装载工作。并分析服务器返回的消息,必要时根据用户参数指定生成日志文件与错误数据文件。当进行数据导出时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件,将用户要求转换成相应消息发送给服务器端的dmfldr 模块。服务器解析并打包需要导出的数据,发送给dmfldr 客户端,客户端将数据写入指定的数据文件,必要时根据用户参数指定生成日志文件.
3 快速入门
本章简单介绍如何启动dmfldr 和dmfldr 支持的参数简介。通过阅读本章,读者可以了解dmfldr 通过各参数能提供的各项功能,不过要想熟练灵活地使用dmfldr 还需要继续阅读下一章。
3.1 启动dmfldr工具
安装好DM 数据库管理系统后,在安装目录的“bin”子目录下可找到 dmfldr 执行文件。启动操作系统的命令行窗口,进入“dmfldr”所在目录,可以准备启动 dmfldr 工具了。
dmfldr 的使用必须指定必要的参数,否则工具会报错“无效的参数个数”并退出。为dmfldr 指定参数的格式为:
dmfldr keyword=value [keyword=value ...]
比如./dmfldr SYSDBA/SYSDBA CONTROL='/opt/dmdbms/bin/fldr.ctl'
如例子所示,USERID 和CONTROL 是启动dmfldr 必须要指定的参数,且USERID 必须是第一个参数,CONTROL 必须是第二个参数。除了在启动命令行中直接指定dmfldr 参数值外,用户还可以通过设置控制文件中的OPTIONS 选项来指定dmfldr 参数值,也可以在dmfldr.ini 配置文件中指定dmfldr参数值
3.2 dmfldr 参数的介绍
USERID
USERID 用于指定数据库的连接信息。必选参数,且必须位于参数位置的第一个。
语法如下:
SYSDBA/SYSDBA@LOCALHOST:PORT
还有更多参数,参考文档手册。
CONTROL
控制文件的路径,字符串类型。必选参数,且必须位于参数位置的第二个。
控制文件用于指定数据文件中数据的格式,在数据载入时,dmfldr 根据控制文件指定的格式来解析数据文件;导出数据时,dmfldr 也会根据控制文件指定的列分隔符、行分隔符等生成数据文件。控制文件中还可以指定其他的一些dmfldr 参数值。
log
dmfldr 的日志文件路径,字符串类型。默认日志文件名为fldr.log。日志文件记录了dmfldr 运行过程中的工作信息、错误信息以及统计信息。此参数为可选参数
null_str
指定数据文件中NULL 值的表示字符串,字符串类型,默认忽略此参数。若设置了NULL_STR,则此参数值将成为数据文件中NULL 值的唯一表示方式。NULL_STR 区分字符串大小写,并且长度不允许超过128 个字节。此参数为可选参数
badfile
记录错误数据的文件路径,字符串类型。默认的错误文件名为fldr.bad。文件记录的信息为数据文件中存在格式错误的行数据以及转换出错的行数据.
此参数为可选参数,作用于MODE 为IN 的情况下,当MODE 为OUT 时无效。
skip
跳过数据文件起始的逻辑行数,整型数值。默认的跳过起始行数为0 行。如果用户指定了多个文件,且起始文件中的行数不足SKIP 所指定的行数,则dmfldr 工具会扫描下一个文件直至累加的行数等于SKIP 所设置的行数或者所有文件都已扫描结束。在MPP 和分布计算集群DPC 环境下,由于数据分散在各个节点,每个节点返回数据的速度也不一样,无法确定SKIP 的数据,因此SKIP 参数在MPP 和分布计算集群DPC 环境下无效。若在MPP 环境下使用本地连接,则SKIP 参数仍有效。
load
装载的最大行数,整型数值。默认的最大装载行数为数据文件中的所有行数。LOAD 指定的值不包括SKIP 指定的跳过的行数。
在MPP 和分布计算集群DPC 环境下,由于数据分散在各个节点,每个节点返回数据的速度也不一样,无法确定LOAD 的数据,因此LOAD 参数在MPP 和分布计算集群DPC 环境下无效。若在MPP 环境下使用本地连接,则LOAD 参数仍有效。
rows
每次提交的行数,整型数值。默认的提交行数为50000 行。提交行数的值表示提交到服务器的行数,并不一定代表按照数据文件中的数据顺序的行数。用户可以根据实际情况调整每次提交的行数,以达到性能的最佳点。此参数为可选参数,作用于MODE 为IN 且DIRECT 为FALSE 的情况下,其他情况下无效
direct
数据装载方式,布尔值。默认为TRUE。DIRECT 指定了装载的方式,当为TRUE 时,dmfldr 选择快速的载入模式,通过数据的转换和数据的封装直接对B 树进行操作,省去了普通插入方式下各个操作符之间的跳转,提升了装载的效率,但对于约束的检查等由用户保证,dmfldr 将不处理有约束冲突的数据。当为FALSE 时,dmfldr 选择普通的插入方式装载数据,可以保证数据的正确性和约束的有效性,效率比前者要低。此参数为可选参数,作用于MODE 为IN 的情况下,当MODE 为OUT 时无效。
set_identity
设置自增列选项,布尔值。默认为FALSE。如果指定SET_IDENTITY 选项值为TRUE,则dmfldr 将把从数据文件中读取的自增列值作为目标值插入数据库表中,用户应当保证每一行的自增列的值符合自增列的规则。如果SET_IDENTITY 选项值设置为FALSE,则dmfldr 将忽略数据文件中对应自增列的值,服务器将自动生成自增列的值插入每一行的对应列。此参数为可选参数,仅在MODE 为IN、DIRECT 为TRUE 且非DMDPC 环境下有效,DMDPC 环境下暂不支持自增列装载。
sorted
数据是否已经按照聚集索引排序,布尔值。默认为FALSE。如果设置为TRUE,则用户必须保证数据已按照聚集索引排序完成,并且如果表中存在数据,需要插入的数据索引值要比表中数据的索引值大,服务器在做插入操作时顺序进行插入。如果设置为FALSE,则服务器对于每条记录进行定位插入.
此参数为可选参数,作用于MODE 为IN 且DIRECT 为TRUE 的情况下,对于其他情况此参数无效。
index_option
索引的设置选项,整型数值。默认为1。INDEX_OPTION 的可选项有1、2 和3。1 代表服务器装载数据时先不刷新二级索引,而是将新数据按照索引预先排序,在装载完成后,再将排好序的数据插入索引;2 代表服务器在快速装载过程中不刷新二级索引数据,只在装载完成时重建所有二级索引;3 代表服务器使用追加模式来进行二级索引的插入,在数据装载的过程中,同时进行二级索引的插入。
此参数为可选参数,作用于MODE 为IN 且DIRECT 为TRUE 的情况下,对于其他情况此参数无效
errors
最大的容错个数,整型数值。取值范围为[0,4294967295],默认为100。当dmfldr 在装载过程中出现错误的个数超过了ERRORS 所设置的数目,则dmfldr 将当前时间点已成功装载且未提交的所有正确数据提交到服务器,随后结束装载。如果载入过程中不允许出现错误则可以设置ERRORS 为0,如果允许所有的错误出现,则可以设置ERRORS为一个非常大的数。ERRORS 所统计的错误包含在数据转换和数据插入过程中所产生的数据错误。
此参数为可选参数,作用于MODE 为IN 的情况下,当MODE 为OUT 时无效。
character_code
数据文件中数据的编码格式,字符串类型。默认与当前机器编码格式一致。CHARACTER_CODE 的可选项有GBK、GB18080、UTF-8、SINGLE_BYTE 和EUC-KR 五种:GBK 和GB18030 对应中文编码;UTF-8 对应UTF-8 国际编码;SINGLE_BYTE 对应单字节字符编码;EUC-KR 对应韩文字符集。
mode
dmfldr 的装载模式,字符串类型。默认值为IN。MODE 的可选项有IN、OUT ,OUTORA 三种。IN 模式指从数据文件中将数据装载入数据库,这种模式下控制文件的格式对应为数据文件中现有数据的格式;OUT 模式指从数据库中将数据导出到数据文件,这种模式下控制文件所指定的格式为数据存放在数据文件中的格式。需要说明的是在OUT 模式下,如果指定了多个数据文件,则dmfldr 最终只会将数据写入第一个数据文件。OUT 模式下的控制文件与IN 模式下的控制文件格式相同,用户可以通过使用同一个文件进行载入和导出数据。OUTORA 模式表示导出ORACLE 表的数据,此模式下暂不支持带有大字段表的导出。
data
指定数据文件路径,字符串类型。一般情况下数据文件路径在控制文件中指定。如果控制文件中数据文件路径指定为‘*’,那么会使用命令行或 dmfldr.ini 配置文件中指定的DATA 参数来替换‘*’,优先使用命令行中指定的 DATA 参数进行替换。
SQL
用户指定SQL 查询语句,用于导出自定义查询结果数据,仅导出模式有效。自定义SQL 查询语句会将SQL 语句发送到服务器进行分析执行,若发现SQL 语句不是查询语句,dmfldr 将报错返回。SQL 语句可以实现用户的个性化数据导出需要,可以选择需要导出的列,需要过滤的结果。此参数为可选参数,在MODE 为OUT 的情况下有效。SQL 查询语句需要使用双引号括起来。
例如
./dmfldr USERID=SYSDBA/[email protected]:5254 MODE=\'OUT\' SQL="select * from test where c1='b';" data=\'/home/test/yy/test.txt\'
TABLE
指定导入或导出表的表名,可以包含模式名。可选参数。在导出,指定导出SQL 时,该选项失效。
ROW_SEPERATOR
指定行分隔符,分隔符额外指定X 表示十六进制的分隔符,长度应小于128。可选参数
FIELD_SEPERATOR
指定列分隔符,分隔符额外指定X 表示十六进制的分隔符,长度应小于255。可选参数
例如:
./dmfldr USERID=SYSDBA/[email protected]:9999 FIELD_SEPERATOR='|' ROW_SEPERATOR=X '0A' DATA='E:\FLDR\D1.TXT' TABLE="sysdba".\"tyjm\" mode='in'
SINGLE_FILE=true
4.dmfldr 控制文件
控制文件CONTROL 是启动dmfldr 必须要指定的参数,用于指定数据文件中数据的格式。在数据载入时,dmfldr 根据控制文件指定的格式来解析数据文件;导出数据时,dmfldr 也会根据控制文件指定的列分隔符、行分隔符等生成数据文件。
4.1控制文件语法
上面控制文件语法说明:
- dmfldr 在处理数据文件中换行符时windows 默认为0x0D0A(\r\n),非windows 默认为0x0A(\n),用户应该根据现有的数据文件中的换行符做相应的调整。应选项为<row_term_option>,若指定的<value>值为十六进制的字符串值需要指明[X]选项,<value>值不再需要以0x 开头。若没有指明[X]选项,则<value>值为指定的字符串;
- 关于列分隔符,用户应当指定FIELDS 或者coldef_option 中的至少一种。若两者均存在,则以coldef_option 中的设置为准,若分隔符指明[X]选项,则表明此分隔符为十六进制格式的字符串;
- 关于file_option,用来指定单个文件;
- 关于directory_option,用来指定整个文件夹。指定此选项后,dmfldr 会自动扫描指定文件夹下的所有文件,这些文件数据将被导入到服务器;
- 关于LIST 选项,INFILE 使用LIST 选项时,表明实际的数据文件路径存储在INFILE 指定的文件中,该文件可以存储多个实际的数据文件路径,使用逗号或者换行分割;
- 关于APPEND|REPLACE|INSERT 选项,当dmfldr 处于数据装载模式时,INSERT 表示插入方式,向空表插入新记录(如果不是空表则会报错无效的装载模式);APPEND 表示追加方式,为缺省方式,在表中追加新记录;REPLACE 表示替代方式,先清空表再插入新记录。当dmfldr 处于导出数据模式时,dmfldr 会检查导出数据文件是否存在,若不存在则直接创建新文件;若存在,当设置为APPEND 时,以追加的方式写入数据;设置为REPLACE 时,先删除文件再重新创建新文件;设置为其他值时则报错。选项默认值为APPEND;
- 关于OPTIONS 选项,该选项支持命令行参数中除userid,control,help 以外的所有参数的指定,每个参数值对使用空格或者换行分割。对于option 中出现的参数,在dmfldr 的指定执行参数中也出现的,dmfldr 会选择option 中对应参数的值执行
示例一: 一个dmfidr控制文件的例子:
OPTIONS
(
SKIP = 0
ROWS = 50000
DIRECT = TRUE
INDEX_OPTION = 2
)
LOAD DATA
INFILE '/opt/data/test1.txt' STR X '0A'
BADFILE '/opt/data/test1.bad'
INTO TABLE test1
FIELDS '|'
(
F1,
F2 DATE FORMAT 'YYYY-MM-DD',
F3 NULL,
F4 TERMINATED BY WHITESPACE ENCLOSE BY '(',
F5 CONSTANT "test",
F6 "trim()"
)
LOAD DATA
INFILE '/opt/data/test2.txt' STR X '0A'
BADFILE '/opt/data/test2.bad'
INTO TABLE test2
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2,
C3 "sysdate"
)
示例二:导入文件t1.txt内容到test表中
创建表
SQL> CREATE TABLE TEST(C1 INT,C2 INT,C3 DATE);
t1.txt 文件内容
test.ctl
[dmdba@localhost ~]$ dmfldr SYSDBA/SYSDBA cnotallow='/home/dmdba/test.ctl'
使用data参数指定数据文件。用户可以在命令行中直接指定ATA参数,也可以在mfldr.ini 配置文件中指定ATA 参数。如果控制文件中数据文件路径指定为‘*’,那么会使用命令行或mfldr.ini 配置文件中指定的ATA 参数来替换‘*’,优先使用命令行中指定的ATA 参数进行替换。
vi test.ctl
[dmdba@localhost ~]$ more test.ctl
load data
infile *
into table test
fields '|'
(
c1,
c2,
c3)
[dmdba@localhost ~]$ ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/home/dmdba/test.ctl\' data=\'/home/dmdba/test.txt \'
错误数据格式,自丢弃
比如:t1.txt文件
1行被丢弃
查询报错日志
从数据库表导出,如下操作:
[dmdba@localhost ~]$ dmfldr SYSDBA/SYSDBA cnotallow='/home/dmdba/test.ctl' mode='out'
场景三,自增列装载
1.创建一张test表,c1自增长列
SQL> 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');
2.编辑数据文件 test.txt,存放路径为/home/dmdba/test.txt,文件内容如下:
[dmdba@localhost ~]$ more t1.txt
1|tb
2|te
3|te
3.执行dmfldr命令
[dmdba@localhost ~]$ dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/home/dmdba/test.ctl\' direct=true set_identity=false
默认diect 是true,set_identity是false ,可以省略
4.查询数据库,没有按照t1.txt文件字段导入,他是根据表定义自增长生产新的列值。
5.如果把set_identity=true,导入的数据不能按照表中的自增长导入,根据导入的实际列值导入,下图所示
[dmdba@localhost ~]$ dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/home/dmdba/test.ctl\' direct=true set_identity=true
场景四:数据排序
1.创建表,c1列为聚簇主键------聚簇主键列排序好的列
CREATE TABLE TEST(C1 INT CLUSTER PRIMARY KEY,C2 VARCHAR);
2.假如t1.txt文件数据库
3.执行DMFLDR命令,导入失败,如下图:
[dmdba@localhost ~]$ dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/home/dmdba/test.ctl\'
4.修改t1.txt文件内容,如下图
5.执行DMFLDR命令,如下图:
[dmdba@localhost ~]$ dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow=\'/home/dmdba/test.ctl\'
场景五:空值处理
dmfldr 通过设置NULL_MODE 参数来处理空值。
l 设置为TRUE,载入时NULL 字符串处理为NULL,载出时空值处理为NULL 字符串
l 设置为FALSE,载入时NULL 字符串处理为字符串,载出时空值处理为空串
1.创建表
DROP TABLE TEST;
CREATE TABLE TEST(C1 INT,C2 VARCHAR);
2.编辑t1.txt表
1|aaa
2|NULL
3|null
3.执行导入,执行参数null_mode=true
dmfldr userid=SYSDBA/SYSDBA@localhost:5236 cnotallow='/home/dmdba/test.ctl' LOB_DIRECTORY='/home/dmdba/' null_mode=true
4.结果null全部变成NULL值
5.如果导入,null_mode=false时,结果如下
达梦社区网址:https://eco.dameng.com