dmfldr快速装载工具使用
文章目录
- 1概述
- 2使用解析
- 2.1dmfldr命令行参数
- 2.2dmfldr控制文件
- 3使用案例
- 3.1导入.txt文件
- 3.2导入.csv文件
- 3.3导出为.txt文件
- 3.4DM管理工具导入、导出数据
1概述
通过物理和逻辑备份还原我们可以将达梦数据库中的数据从一个库中导出并导入到另一个数据库中,在不少情况下我们需要将一个有特定分隔符的文本文件,如txt、Excel文件中的数据导入到数据库的某个表中,就可以使用dmfldr工具来实现,当然也可以使用DM管理工具在图形化界面下进行操作。
dmfldr可以处理数据量较大的文本文件,在配置dmfldr控制文件后,dmfldr根据指定的内容进行数据解析并发送到服务端导入到表中,也可以按照控制文件配置内容导出某张表的内容并保存到文件中。dmfldr结构示意图如下:
2使用解析
在数据库的安装目录的“bin”子目录下可找到dmfldr执行文件,dmfldr的使用必须指定必要的参数,否则工具会报错“无效的参数个数”并退出。dmfldr指定参数的格式为:
dmfldr keyword=value [keyword=value ...]
不指定参数报错:
2.1dmfldr命令行参数
执行“dmfldr help”可以看到基本的使用参数和其含义:
version: 03134284368-20250728-285229-20149 Pack24
格式: ./dmfldr KEYWORD=value例程: ./dmfldr SYSDBA/SYSDBA CONTROL='/opt/data/fldr.ctl'USERID 必须是命令行中的第一个参数
字符串类型参数必须以引号封闭关键字 说明(默认值)
--------------------------------------------------------------------------------
USERID 用户名/口令格式: {<username>[/<password>] | /}[@<connect_identifier>][<option>] [<os_auth>]参数:<connect_identifier> ::= [<svc_name> | host[:port] | <unixsocket_file>]<option> ::= #{<extend_option>=<value>[,<extend_option>=<value>]...}<os_auth> ::= AS { SYSDBA | SYSSSO | SYSAUDITOR | USERS | AUTO }示例: SYSDBA/SYSDBA@192.168.1.64:5236注意: option参数的{}是为了封装参数之用,书写时需要保留
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 读入文件缓冲区的大小 (10MB),有效值范围1~2048
LOG_SIZE 日志信息缓冲区的大小 (1MB),有效值范围1~100
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/DPC环境,是否只生成单个数据文件(FALSE)
LAN_MODE MPP/DPC环境,是否以内网模式装载数据(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/DPC环境导入数据时有效
PARALLEL 是否开启并行装载(FALSE)
SQL 使用自定义查询语句,仅导出模式有效
SQLFILE 自定义查询语句所在文件,仅导出模式有效
TABLE 导入/出表
ROW_SEPERATOR 行分隔符
FIELD_SEPERATOR 列分隔符
COMMIT_OPTION 提交选项(0), 0:每发送一批数据后提交, 1:发送完所有数据后提交
APPEND_OPTION 追加选项(0), 0: 追加方式, 1: 替代方式, 2: 插入方式
COLNAME_HEADING 是否在导出文件头中打印列名(FALSE)
IGNORE_AIMLESS_DATA 是否忽略无目标数据(FALSE)
LOB_AS_VARCHAR 是否将CLOB作为VARCHAR进行导入导出(FALSE)
LOB_AS_VARCHAR_SIZE 将CLOB作为VARCHAR进行导入导出时, lob数据最大大小(10MB)
LOG_LEVEL 记录错误数据信息级别(3), 0: 不记录 1: 只记录到log文件 2: 只记录到bad文件 3: 记录到log和bad文件 4: 错误仅输出到屏幕
FLDR_INI 配置文件路径,字符串类型
RECONN 自动重连次数(0)
RECONN_TIME 自动重连等待时间(5), 单位(s), 有效值范围(1~10000)
WIDTH 设置列数据宽度
SEDF 被替换的字符列表
SEDT 用于替换的字符列表
ESCAPE 转义符
EXPORT_MODE MPP/DPC环境, 使用sql语句时的导出模式(0), 0: 普通模式 1: 快速模式, LOCAL方式连接
BAD_FILE_MODE 错误数据文件模式(0), 0: 普通模式 1: 纯数据模式
COMPATIBLE_MODE 兼容模式(0), 0: 不做兼容 1: 兼容DB2 2: 兼容MYSQL
PRIORITY_ENCLOSE DB2模式下, enclose优先级最高
OUT_FILE_ROWS 导出模式下, 每个文件数据最大行数(0)
HELP 打印帮助信息
其中USERID是启动dmfldr必须要指定的参数,且USERID必须是第一个参数;MODE是载入模式,表示进行文件导入还是导出文件;CONTROL是指定控制文件的参数;TABLE是指定数据库中的表名;DATA是用来指定要处理的文件名。
一般来说指定这几个参数其实就够了,其他详细大导出导出配置我们可以在dmfldr控制文件里面进行配置。
2.2dmfldr控制文件
除了在启动命令行中直接指定dmfldr参数值外,用户还可以通过CONTROL参数设置控制文件中的OPTIONS选项来指定dmfldr参数值,也可以在dmfldr.ini配置文件中指定dmfldr参数值。
dmfldr参数值的优先选择顺序为:优先为命令行参数,其次为控制文件中指定的参数值,最后为dmfldr.ini配置文件中指定的参数值。如果装载表和数据文件参数在多处进行了指定,优先使用控制文件中的值。
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>][TRAILING NULLCOLS][<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>][<dtype_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) | position(*)
<dtype_option> ::= DATE | CHAR| FLOAT
<fmt_option> ::= FORMAT '<日期格式>|<浮点数格式>'
<term_option> ::= TERMINATED [BY] <wx_option>
<wx_option> ::= WHITESPACE|[X] <delimiter>
<enclosed_option> ::= [OPTIONALLY] ENCLOSE [BY] [X] <delimiter>
<constant_option> ::= CONSTANT "<常量>"
<fun_option> ::= "<函数>"
具体的参数含义可以查看官方文档:
https://eco.dameng.com/document/dm/zh-cn/pm/actual-combat-dmfldr.html
例如下面的控制文件用来导入两个文件到两张数据表中:(#是注释,配置文件中应该删除)
OPTIONS
(SKIP = 0 # 用来设置跳过数据文件起始的逻辑行数,默认的跳过行数为 0 行ROWS = 50000 # 设置每次提交的行数。默认的提交行数为 50000 行。DIRECT = TRUE # 自增列设置,如果SET_IDENTITY为 FALSE(缺省为FALSE),则 dmfldr 将忽略数据文件中对应自增列的值,服务器将根据自增列定义和表中已有数据自动生成自增列的值插入每一行的对应列,否则将使用导入文件中的值INDEX_OPTION = 2 # 代表服务器在快速装载过程中不刷新二级索引数据,只在装载完成时重建所有二级索引。如果在数据载入前,目标表中没有数据或数据量较小,建议 INDEX_OPTION 置为2
)
LOAD DATA # 一个LOAD DATA用来指定一次装载
INFILE '/opt/data/test1.txt' STR X '0A' # 指定数据文件和换行符
BADFILE '/opt/data/test1.bad' # 错误数据输出文件路径
INTO TABLE test1 # 目标表名
FIELDS '|' # 列分隔符为竖线 |
(
F1, # 第1列(自动映射表字段)
F2 DATE FORMAT 'YYYY-MM-DD', # 第2列为日期类型,指定格式如2023-01-01
F3 NULL, # 第3列允许NULL值(空字段自动转NULL)
F4 TERMINATED BY WHITESPACE ENCLOSE BY '(', # 列结束符为空格并且指定封闭符为(),若数据列设置了封闭符,则将跳过封闭符取出数据
F5 CONSTANT "test", # 第5列为常量值"test"
F6 "trim()" # 第6列应用trim函数去除首尾空格
)LOAD DATA
INFILE '/opt/data/test2.txt' STR X '0A'
BADFILE '/opt/data/test2.bad'
INTO TABLE test2
FIELDS '|'
(
C1 TERMINATED BY ' ', # 第1列以空格结束
C2, # 第2列(自动映射)
C3 "sysdate", # 第3列使用系统当前时间
C4 "substr(:C2,1,2)" # 第4列取C2列的前2个字符
)
3使用案例
dmfldr在处理数据文件中换行符时windows默认为0x0D0A(\r\n),非 windows默认为0x0A(\n),用户应该根据现有的数据文件中的换行符做相应的调整。对应选项为<row_term_option>。
本章节中除了第3小节演示的系统环境是Windows,其他章节使用的是Linux操作系统。
3.1导入.txt文件
创建一个.txt文件用来进行导入演示:
vi /temp/dmfldr_in.txt
导入要用到的文件都要进行授权chown -R dmdba:dinstall /temp
文件内容如下:
"C1","C2","C3"
"1","测试数据1","2025-09-14"
"2","测试数据2","2025-09-14"
"3","测试数据3","2025-09-14"
"4","测试数据4","2025-09-14"
"5","测试数据5","2025-09-14"
一共39行,然后创建dmfldr控制文件:
vi /temp/dmfldr_ctrl.ctrl
内容如下:
OPTIONS
(SKIP = 1ROWS = 50000DIRECT = TRUEINDEX_OPTION = 2
)LOAD DATA
INFILE '/temp/dmfldr_in.txt' STR X '0A'
BADFILE '/temp/dmfldr_in.bad'
INTO TABLE TEST.TEST_DMFLDR
FIELDS ','
(
C1 ENCLOSE BY '"',
C2 ENCLOSE BY '"',
C3 DATE FORMAT 'YYYY-MM-DD' ENCLOSE BY '"'
)
现在需要将/temp/dmfldr_in.txt文件导入到TEST.TEST_DMFLDR表中,该表的表结构如下:
CREATE TABLE "TEST"."TEST_DMFLDR"
(
"C1" INT NOT NULL,
"C2" VARCHAR2(200),
"C3" DATE,
NOT CLUSTER PRIMARY KEY("C1")) STORAGE(ON "test", CLUSTERBTR) ;
使用以下命令进行导入:
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmfldr userid=SYSDBA/'"密码"'@localhost:5236 control=\'dmfldr_ctrl.ctrl\'
查看TEST.TEST_DMFLDR表可以看到数据都成功导入了:
3.2导入.csv文件
如果导入的文件是Excel类型的文件则需要先装换位csv再进行导入。用cat命令看一下分隔符:
因为Windows和Linux使用的默认编码不一致,Windows默认使用GBK或者UTF-8 BOM编码,Linux默认使用UTF-8,需要在Windows进行转码,可以用记事本打开这个csv文件另存为UTF-8编码的文件:
然后重新上传就可以看到正常显示中文了:
创建dmfldr控制文件:
vi /temp/dmfldr_csv.ctrl
内容如下:也是导入到TEST.TEST_DMFLDR表,导入前已经将该表清空
OPTIONS
(SKIP = 1ROWS = 50000DIRECT = TRUEINDEX_OPTION = 2
)LOAD DATA
INFILE '/temp/测试dmfldr.csv' STR X '0A'
BADFILE '/temp/测试dmfldr.bad'
INTO TABLE TEST.TEST_DMFLDR
FIELDS ','
(
C1,
C2,
C3 DATE FORMAT 'YYYY-MM-DD'
)
使用以下命令进行导入:
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmfldr userid=SYSDBA/'"密码"'@localhost:5236 control=\'/temp/dmfldr_csv.ctrl\'
查看TEST.TEST_DMFLDR表可以看到数据都成功导入了:
3.3导出为.txt文件
dmfldr除了可以将文本文件导入数据库的表中,也可以将数据库中某张表的数据导出到文本文件中,执行以下命令可将TEST.TEST_DMFLD表中的数据导出为.txt文件,导出的时候默认以“|”进行分隔:
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmfldr userid=SYSDBA/'"密码"'@localhost:5236 MODE=\'OUT\' TABLE=TEST.TEST_DMFLDR DATA=\'/temp/TEST_DMFLDR.txt\'
如果要自定义分隔符,可以指定控制文件:
./dmfldr userid=SYSDBA/'"密码"'@localhost:5236 MODE=\'OUT\' TABLE=TEST.TEST_DMFLDR control=\'/temp/dmfldr_out_ctrl.ctrl\'
# DATA=\'/temp/TEST_DMFLDR.txt\' 不指定了,在控制文件指定
dmfldr_out_ctrl.ctrl文件里面的内容与前面导入txt时候编写的是差不多的只是改一下输出文件,内容如下:
OPTIONS
(SKIP = 0ROWS = 50000DIRECT = TRUEINDEX_OPTION = 2
)LOAD DATA
INFILE '/temp/TEST_DMFLDR.txt' STR X '0A'
BADFILE '/temp/TEST_DMFLDR.bad'
INTO TABLE TEST.TEST_DMFLDR
FIELDS ','
(
C1 ENCLOSE BY '"',
C2 ENCLOSE BY '"',
C3 DATE FORMAT 'YYYY-MM-DD' ENCLOSE BY '"'
)
这样就可以实现导出的字段每列使用逗号分隔并被英文双引号进行包围:
3.4DM管理工具导入、导出数据
如果你有DM管理工具的话可以在图形化界面进行操作。
涉及的表为TEST.TEST_DMFLDR,表结构如下:
CREATE TABLE "TEST"."TEST_DMFLDR"
(
"C1" INT NOT NULL,
"C2" VARCHAR2(200),
"C3" DATE,
NOT CLUSTER PRIMARY KEY("C1")) STORAGE(ON "test", CLUSTERBTR) ;
方法一:导入的数据如果数据量不大的话可以直接在查询结果界面直接导入数据:
select * from TEST.TEST_DMFLDR;
查出结果后点击右下角的“编辑数据”的锁头样式的按钮:
然后复制你要导入的数据(要按该表对应的数据列顺序进行复制),然后在查询结果窗口右击,选择“粘贴”,粘贴上去后点击右下角的“保存修改”按钮进行修改。
最后不要忘记提交事务,接着再查这张表就可以看到对应的数据了:
方法二:在DM管理工具连接该实例后,在模式目录下找到该表,右击此表,在弹出的菜单中选择“导入表数据(F)”然后选择需要导入的文件:
设置基本的文件信息,如列名、导入的表单等信息:
配置列信息:
执行导入,查看导入的状态:
然后我们就可以从该表中查到导入的数据了:
使用DM管理工具也可以导出某个表的数据,我们可以直接在查询结果右击导出当前查询结果为文件,也可以模式下找到该表,然后右击此表选择“导出表数据(X)”,我们可以选择导出的具体文件格式,比如选择txt类型:
指定分隔符设置:
还可以编辑更详细的导出策略:
指定导出的文件信息,如文件目录、文件名:
导出成功后就可以查看到以下内容:
TEST_DMFLDR.txt文件的内容如下:
通过dmfldr快速装载工具可以显示将有规律的文本文件(CSV、TXT文件)中的数据导入到数据库的表中进行数据分析,也可以将表中的数据按一定的分隔符导出为可读的文本文件。实现这些只需要按说明进行控制文件内容的编写即可,如果数据量小或者导出需求比较简单的话,可以使用DM管理工具进行操作。