dmfldr(DM Fast Loader)是DM提供的快速装载数据的命令行工具,能够将安装一定格式排序的文本数据以简单、快速、高效的方式装载到达梦数据库中,或者将达梦数据库中的数据安装一定格式导出到文本文件。
类似Oracle SqlLoader工具。
查看dmfldr工具的参数选项
dmfldr工具在$DM_HOME/bin目录下。
执行dmfldr help即可查看dmfldr的相关参数以及使用方法。
需要注意的是:USERID和CONTROL参数为必选参数,且USERID必须是命令行中的第一个参数CONTROL 必须是命令行中的第二个参数。其余参数均为可选参数且指定时无顺序要求。
dmfldr控制文件
用于指定数据文件中数据的格式。在数据载入时, dmfldr 根据控制文件指定的格式来解析数据文件;导出数据时,dmfldr 也会根据控制文件指定的列分隔符、行分隔符等生成数据文件。
控制文件语法如下:
需要注意的是:控制文件中的OPTIONS选项设置的参数优先级要高于在外面命令行指定的参数选项。
简单测试
本次测试环境为Centos 7,DM8
基础测试
通过上面执行的日志信息,我们可以发现有1行数据加载失败,可以通过控制文件中指定的错误输出文件badfile查看具体内容:
通过日志可以发现错误的数据为第4行数据,由于TEST01表的C3列数据类型为date类型格式为"yyyy-mm-dd",而数据文件中根据分隔符插入C3列的值为"aaaa-bb-cc"与C3列的数据类型不匹配,所以报错。
另外,在上面的测试中,control的参数值加了“” 反斜杠进行转义,如果不进行转义则会报如下错误:
大字段数据处理
dmfldr 支持对 DM 数据库的大字段类型数据的载入和导出, DM 数据库支持的大字段数据类型有 TEXT、 LONGVARCHAR、 IMAGE、 LONGVARBINARY、 BLOB 以及 CLOB。
导出大字段数据
导入大字段数据1(DIRECT=TRUE)
当 MODE 为 IN 且 DIRECT 为 TRUE 时, 此时数据载入若涉及到大字段对象,需要用户指定大字段数据文件。若 CLIENT_LOB 为 TRUE, LOB_DIRECTORY 应指定大字段数据文件所在的客户端本地目录;若 CLIENT_LOB 为 FALSE, 用户必须先把相关文件传送到 DM服务器所在主库,然后使用 LOB_DIRECTORY 指明存放目录。在数据文件中,大字段以“文件名:起始偏移:长度”的形式记录在数据文件中。指定的文件名无效时, dmfldr 会报错,装载失败。 对于 CLOB 类型字段, 当指定的偏移 、长度范围内带有不完整字符时,dmfldr 将装载失败 。
在导入时,如果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。
自增列装载
自增列是比较特殊的列,为了保证数据库中自增列列值的正确性,用户在进行数据载入时需要特别注意。
当 DIRECT 参数为 FALSE 时, dmfldr 将把从数据文件中读取的自增列值作为目标值插入数据库表中,用户应当保证每一行的自增列的值符合自增列的规则,否则将造成数据混乱。
当 DIRECT 参数为 TRUE 时, dmfldr 提供了 SET_IDENTITY 参数(默认为 FALSE)对数据载入时自增列的处理进行设置:
(1)如果指定 SET_IDENTITY 选项值为 TRUE,则 dmfldr 将把从数据文件中读取的自增列值作为目标值插入数据库表中,用户应当保证每一行的自增列的值符合自增列的规则,否则将造成数据混乱;
(2)如果 SET_IDENTITY 选项值设置为 FALSE,则 dmfldr 将忽略数据文件中对应自增列的值,服务器将根据自增列定义和表中已有数据自动生成自增列的值插入每一行的对应列。
DIRECT=TRUE,SET_IDENTITY=FALSE
DIRECT=TRUE,SET_IDENTITY=TRUE
在表中有自增列的情况下装载时,dmfldr参数direct=false效果与direct=true set_identity=true相同,都是将把从dmfldr数据文件中读取的自增列值作为目标值插入数据库表中,这种情况需要保证每一行的自增列的值符合自增列的规则,否则将造成数据混乱。
空值处理
dmfldr 通过设置 NULL_MODE 参数来处理空值。设置为TRUE,载入时NULL字符串处理为NULL,载出时空值处理为NULL字符串;设置为FALSE,载入时NULL字符串处理为字符串,载出时空值处理为空串。
导入NULL_MODE=TRUE
导入NULL_MODE=FALSE
可以看到当设置null_mode=false时,装载数据时"NULL"、“null"会被作为"NULL”、"null"两个字符串插入到表中;
导出NULL_MODE=TRUE
可以看到导出值为NULL字符串。
导出NULL_MODE=FALSE
可以看到,设置null_mode=false,导出文件内容值为空字符串。
(1)不支持向临时表、外部表装载数据
(2)不支持向系统表装载数据
(3)不支持向带有位图索引的表装载数据
(4)不支持向带有函数索引的表装载数据
(5)不支持向带有全文索引的表装载数据
(6)不支持向 DCP 代理装载数据
(7)dmfldr装载时,对约束进行检查,对各种约束的处理机制如下表所示: