在达梦数据库中,有几种常用的数据迁移工具。1.DTS 2.DEXP 3.DMETL 4.DMHS 5.DMFLDR
在进行数据迁移时,需根据不同情况选择不同的迁移工具。dmfldr适合数据量特别巨大的情况,且性能相比其他工具更好,但是功能性方面较差。本文主要介绍如何使用dmfldr快速装载工具进行DM数据库中表数据的快速载入和导出。
dmfldr(DM Fast Loader)是DM提供的快速数据装载命令行工具。用户通过使用dmfldr工具能够把按照一定格式排序的文本数据以简单、快速、高效的方式载入到DM数据库中,或把DM数据库中的数据按照一定格式写入文本文件。
dmfldr的系统结构如下图所示。
如图所示,dmfldr实际上除了客户端工具,还包含一个在数据库服务器中的dmfldr功能模块,它们共同完成dmfldr的各项功能。
安装好 DM7 数据库管理系统后,在安装目录的“bin”子目录下可找到 dmfldr 执行文件。
启动操作系统的命令行窗口,进入“dmfldr”所在目录,如果配置了环境变量,则可以在任何位置启动,可以准备启动 dmfldr 工具了。
dmfldr 的使用必须指定必要的参数,否则工具会报错“无效的参数个数”并退出。为dmfldr指定参数的格式为:
dmfldrkeyword=value [keyword=value ...]
例如:
dmfldr USERID=SYSDBA/SYSDBACONTROL='c:\fldr.ctl'
如例子所示,USERID 和CONTROL 是启动 dmfldr 必须要指定的参数,且 USERID 必须是第一个参数,CONTROL 必须是第二个参数。
dmfldr 使用较为灵活,参数较多,用户可以使用“dmfldr help”查看各参数的简单信息。
dmfldr help
格式: DMFLDR KEYWORD=value
例程: DMFLDR SYSDBA/SYSDBACONTROL='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 不刷新二级索引,数据装载完成后重建所有二级索引
3 刷新二级索引, 数据装载的同时将数据插入二级索引
ERRORS 允许的最大数据错误数 (100)
CHARACTER_CODE 字符编码,字符串类型 (GBK, GB18030,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水平分区表 (FALSE)
EP 指定需要发送数据的站点序号列表,仅向MPP环境导入数据时有效
HELP 打印帮助信息
控制文件CONTROL是启动dmfldr必须要指定的参数,用于指定数据文件中数据的格式。在数据载入时,dmfldr根据控制文件指定的格式来解析数据文件;导出数据时,dmfldr也会根据控制文件指定的列分隔符、行分隔符等生成数据文件。
控制文件中还可以指定其他dmfldr参数值。
dmfldr控制文件的语法如下所示:
[OPTIONS(
=
……
)]
LOAD [DATA]
INFILE < | >
[BADFILE ]
[APPEND|REPLACE|INSERT]
::=参数
::=值
::= [LIST] [] [, []]
::= DIRECTORY []
::=文件地址
::=STR [X]
::= {}
::=INTO TABLE [.]
[EP ]
[WHEN ]
[FIELDS [TERMINATED BY] [X] ]
[]
[]
::=模式名
::=表名
::=()
::=整型数字列表,以逗号分隔
::= { AND }
::= [(] [)]
::= | (p1:p2)
::= = | <> | !=
::= [X] '<字符串常量>' | BLANKS | WHITESPACE
::='<字符串常量>'
::=({ ,})
::= [FILLER][][][][][][]
::=列名
::= | NULL
::=position(p1:p2) | position(p1)
::=DATE FORMAT '<时间日期格式串>'
::= TERMINATED [BY]
::= WHITESPACE|[X]
::= [OPTIONALLY] ENCLOSE [BY] [X]
::= CONSTANT "<常量>"
::= "函数名称()"
对于上述控制文件语法,需要说明的是:
可以在控制文件的LOAD节点中指定数据文件。
例如:
1) 建表TEST
DROP TABLE TEST;
CREATE TABLE TEST(C1 INT,C2 INT,C3 DATE);
2) 编辑数据文件test.txt,存放路径为/opt/data/test.txt,文件内容如下
1 1|2015-11-06
2 2|2015-11-05
3 3|2015-11_04
3) 编辑控制文件test.ctrl,存放路径为/opt/data/test.ctrl,内容如下:
LOAD DATA
INFILE '/opt/data/test.txt'
INTO TABLE test
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2,
C3 DATE FORMAT 'yyyy-mm-dd'
)
4) 使用dmfldr进行数据载入
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/opt/data/test.ctrl\'
也可以使用DATA参数指定dmfldr的数据文件,数据文件路径的优先选择顺序为先控制文件,后参数选项。如果控制文件中数据文件路径指定为‘*’,在命令行通过DATA参数指定数据文件路径,DATA所指定的文件路径会替换‘*’。
例如:
1) 建表TEST
DROP TABLE TEST;
CREATE TABLE TEST(C1 INT,C2 INT,C3 DATE);
2) 编辑数据文件test.txt,存放路径为/opt/data/test.txt,文件内容如下
1 1|2015-11-06
2 2|2015-11-05
3 3|2015-11_04
3) 编辑控制文件test.ctrl,存放路径为/opt/data/test.ctrl,内容如下:
LOAD DATA
INFILE *
INTO TABLE test
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2,
C3 DATE FORMAT 'yyyy-mm-dd'
)
4) 使用dmfldr进行数据载入
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/opt/data/test.ctrl\' data=\'/opt/data/test.txt \'
1.在使用dmfldr时根据系统和数据的具体情况对一些参数进行调整,可以获得更好的性能,这些参数包括:BUFFER_NODE_SIZE 、READ_ROWS、SEND_NODE_NUMBER、TASK_THREAD_NUMBER、BLDR_NUM、BDTA_SIZE、INDEX_OPTION,在实际使用时比较常用的有READ_ROWS 、BUFFER_NODE_SIZE、BDTA_SIZE三个参数。
2.在使用dmfldr导数据的过程中,对于导入失败的数据,dmfldr会记录到指定的bad文件,导入失败的数据可在bad文件中查看。
3.编码问题,在进行导入导出时,可使用参数CHARACTER_CODE指定纯文本文件的编码,特别是在导入数据的时候,建议先确认文件的编码,例如通过命令file -i a.txt 的方式查看文件编码,然后指定文件的编码再进行导入操作。对于导入失败的数据可在第2点中说到的bad文件中查看,如果是编码问题可尝试转换编码的方式解决。
4.关于控制文件中INFILE参数也可以写成如下形式
LOAD DATA
INFILE '/home/dmdba/test1_*.txt'
INTO TABLE test
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2,
C3 DATE FORMAT 'yyyy-mm-dd'
)
即当一张表有多个纯文本文件时,可以一次性读取该目录下该所有属于该表的纯文本文件。
5.控制文件中的参数FIELDS 可以指定自定义的分隔符,例如’|‘,’+‘,'|+|',’,‘等等,由Oracle等数据库导出来的纯文本文件可以完美导入达梦数据库中。
6.dmfldr支持多表装载,通过在控制文件中指定多个INTO TABLE子句,可以将一批数据同时向多个表进行装载。每个INTO TABLE子句中都可以指定WHEN过滤条件、FIELDS子句和列定义子句。
对于多表装载的使用需注意以下几点:
例如:
1) 建表TEST1、TEST2
DROP TABLE TEST1;
DROP TABLE TEST2;
CREATE TABLE TEST1(C1 INT,C2 INT);
CREATE TABLE TEST2(C1 INT,C2 INT);
2) 编辑数据文件test.txt,存放路径为/opt/data/test.txt,文件内容如下
1,2
2,3
3,2
4,8
9,1
3) 编辑控制文件test.ctrl,存放路径为/opt/data/test.ctrl,内容如下:
LOAD DATA
INFILE '/opt/data/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
)
4) 使用dmfldr进行数据载入
./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/opt/data/test.ctrl\'
5) 查看表TEST1和TEST2的数据如下
SELECT * FROM TEST1;
行号 C1 C2
---------- ----------- -----------
1 2 3
2 3 2
3 4 8
4 9 1
SELECT * FROM TEST2;
更多详细使用信息请参考达梦数据库官方文档--dmfldr使用手册。欢迎访问达梦数据库官网下载开发版体验,点这里直达下载地址。