一、工具介绍
dmfldr(DM Fast Loader),是 DM 提供的数据导入导出工具。用户通过 dmfldr 工具,能够把按照一定格式排序的文本数据,以简单、快速、高效的方式载入到 DM 数据库中,或把 DM 数据库中的数据按照一定格式写入文本文件。
关于该工具使用,达梦官网有详细介绍,不过只有linux版本示例,未补充Windows版本使用方法,在此提供基于Windows操作系统的dmfldr工具使用方法介绍。
二、工具架构
如上图所示,dmfldr实际上除了客户端工具,还包含一个在数据库服务器中的dmfldr功能模块,它们共同完成dmfldr的各项功能;
dmfldr 客户端接收用户提交的命令与参数,分析控制文件与数据文件,将数据打包发送给服务器端的 dmfldr 模块,由服务器完成数据的真正装载工作。并分析服务器返回的消息,必要时根据用户参数指定生成日志文件与错误数据文件。
三、工具使用
dmfldr工具,保存在数据库安装目录的bin目录下。dmfldr 的使用必须指定必要的参数,否则工具会报错“无效的参数个数”并退出,使用前,可以执行命令查看工具使用说明。
在当前示例中,我的数据库安装在F盘的DM目录下,需要查看命令帮助,cd到工具所在目录,执行命令:
dmfldr.ext help
F:\DM7\bin>dmfldr.exe help
格式: dmfldr.exe KEYWORD=value
例程: dmfldr.exe SYSDBA/SYSDBA CONTROL='c:\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 不刷新二级索引,数据装载完成后重建所有二级索引
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环境导入数据时有效
HELP 打印帮助信息
F:\DM7\bin>
由上图可以得知,dmfldr工具的使用格式为:dmfldr.exe KEYWORD=value
其中,KEYWORD=value 即为当个option选项,和linux上执行命令,传入多个参数使用方法没有本质区别。
四、数据导入测试
按照工具架构可以得知,如果需要数据导入,我们需要有目的表,其次是导入源数据文件(数据格式需要和目的库表一致),再次还需要一个ctl控制文件(类似于linux的各种服务的配置文件)
首先,我们创建一个测试用的目的库表,尽量格式简单:
CREATE TABLE level(C1 INT,C2 INT,C3 DATE);
总共1个语句正依次执行...
[执行语句1]:
CREATE TABLE level(C1 INT,C2 INT,C3 DATE);
执行成功, 执行耗时26毫秒. 执行号:1,927
影响了0条记录
1条语句执行成功
该表总共三个字段,前两个字段数据类型为int数值类型,最后一个为date日期类型。
然后手动创建源数据文件data.txt,内容如下:
1 1|2015-11-06
test
2 2|2015-11-05
qqqqqqqqqqqqqqq
3 3|2015-11_04
总计5行数据,其中第2行test,和第4行qqqqqqqqqqqqqqq明显不符合目的表的表结构,剩余3行均符合要求。
然后我们创建相应的控制文件test.ctl
LOAD DATA
INFILE 'F:\data.txt'
INTO TABLE level
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2,
C3 DATE FORMAT 'yyyy-mm-dd'
)
执行导入数据命令:
F:\DM7\bin>start dmfldr.exe userid=SYSDBA/SYSDBA@localhost:5236 control='F:\test.ctl'
数据库里确认结果:
select * from level;
由上面可以发现,除了故意设置的两行错误数据,正确格式的3行数据均导入成功。
五、工具导入相关问题
以上面导入数据为例,如果有的时候,我们的源数据文件,存在暂未被发现错误数据,导入数据后发现和预期数据量对不上,该如何处理呢?
这就正好涉及到上面导入数据的示例,第2行第4行数据未被导入,是否有记录可以查询?答案是肯定的:
dmfldr在使用的时候,会自动创建工具使用的日志fldr.log和fldr.bad(也可以传参指定文件路径)
fldr.log:记录整个操作过程,包括读取数据导入数据等等
fldr.bad:记录导入异常的数据
这两个文件,默认均存放于数据库安装目录的bin目录下面
由上面操作,我们可以打开日志看下里面具体记录的内容,是否和任务一致:
首先是fldr.log,内容如下:
dmfldr: 2021-09-30 09:23:36 dmfldr:
Copyright (c) 2011, 2015, Dameng. All rights reserved.
控制文件:
加载行数:全部
每次提交服务器行数:50000
跳过行数:0
允许错误数:100
是否直接加载:Yes
是否插入自增列:No
数据是否已按照聚集索引排序:No
字符集:GBK
dmfldr: 2021-09-30 09:23:36
数据文件共1个:
F:\data.txt
错误文件:fldr.bad
目标表:LEVEL
列名 包装数据类型 终止
C1 CHARACTER WHT
C2 CHARACTER |
C3 yyyy-mm-dd |
行缓冲区数量: 4
任务线程数量: 4
dmfldr: 2021-09-30 09:23:36 数据文件少列
dmfldr: 2021-09-30 09:23:36 数据文件少列
dmfldr: 2021-09-30 09:23:36
目标表:LEVEL
3 行加载成功。
由于数据格式错误,2行 丢弃。
由于数据错误,0行 没有加载。
跳过的逻辑记录总数:0
读取的逻辑记录总数:5
拒绝的逻辑记录总数:0
用时:57.225(ms)
从日志可以看到,具体操作时间,以及使用该工具时设置的一些参数,其次就是目标表,再次就是读取源数据文件的记录数,总计插入成功多少,丢弃多少。
然后我们可以查看fldr.bad文件,确认异常数据,记录是否一致:
dmfldr: 2021-09-30 09:23:36 LEVEL test
dmfldr: 2021-09-30 09:23:36 LEVEL qqqqqqqqqqqqqqq
由此可以看出,具体操作时间,以及目的表名称,再次就是异常数据,和我们源数据文件第2行第4行的完全对得上。
关于dmfldr工具的使用,以及具体参数设置,配置文件设置,详细可参考达梦官网文档达梦数据库 - 新一代大型通用关系型数据库 | 达梦云适配中心