达梦快速装载工具学习
DM数据库快速装载工具有两种,分别应用于不同场景,在软硬件资源充分的情况下,可以直接使用dmfldr来进行操作,资源不足的时候,可以通过在不同机器上部署dmldrp和dmldrc来进行数据的装载和导出。
dmfldr(DM Fast Loader)包含dmfldr客户端和dmfldr模块两部分。dmfldr客户端实现初始化快速装载环境、读取数据、打包数据和发送数据功能。
dmfldr功能模块嵌入在数据库服务器中,实现装载功能。两者相互协作,共同完成dmfldr的各项功能。
dmfldr客户端负责接收用户提交的参数和命令,分析控制文件和数据文件,将相应信息发送到服务端,由服务端对数据库进行相应的导出导入工作。
数据的导入导出,需要对服务器的硬件有这很大的要求,当服务器资源不足时,dmfldr的性能会收到很大影响。因此为了应对资源不足的情况,DM提供了轻量型的装载工具dmldrc和dmldrp:dmldrc为轻量级快速装载工具的客户端,负责初始化快速装载环境和读取数据;dmldrp为轻量级快速装载工具的服务器,负责打包数据和发送数据。两种工具可以部署在不同的服务器上,相互配合完成数据的导出导入,以此方式可以在资源不足的环境完成相应工作。
在需要时,可以部署多个dmldrc同时进行数据的装载和读取,dmldrp会对每一个dmldrc分配一个专属子进程,专门负责该dmldrc读取的数据。多个dmldrc相互独立,互不影响。
disql wang/xxxxx
create table t_fldr (c1 int,c2 int,c3 varchar(20),c4 date);
通过图形化工具生成一千条数据。
设计规则
调整任务规则
总览
执行
浏览数据
vi \~/t\_fldr.ctl
OPTIONS
(
SKIP = 0
ROWS = 50000
DIRECT = TRUE
INDEX\_OPTION = 1
)
Load data
infile '/home/dmdba/t\_fldr.txt'
into table t\_fldr
fields '|'
(
C1 ,
C2 ,
C3 ,
C4
)
dmfldr userid=wang/Wangyang123\@localhost:5236 control=\\'/home/dmdba/t\_fldr.ctl\\' mode=\\'out\\'
清空表数据
Truncate table t\_fldr ;
dmfldr userid=wang/Wangyang123\@localhost:5236 control=\\'/home/dmdba/t\_fldr.ctl\\' mode=\\'in\\';
disql wang/xxxxxx -E "Create table t\_lob (c1 int,c2 blob,c3 clob); "
通过工具生成数据
浏览数据
dmfldr支持对DM数据库的大字段类型数据的载入和导出,DM数据库支持的大字段数据类型有TEXT、LONGVARCHAR、IMAGE、LONGVARBINARY、BLOB以及CLOB。
编写控制文件
vi \~/t\_lob.ctl
OPTIONS
(
SKIP = 0
ROWS = 50000
DIRECT = TRUE
INDEX\_OPTION = 1
)
Load data
infile '/home/dmdba/t\_lob.txt'
into table t\_lob
fields '|'
(
C1 ,
C2 ,
C3
)
dmfldr wang/Wangyang123 control=\\'/home/dmdba/t\_lob.ctl\\' LOB\_DIRECTORY=\\'/home/dmdba/lob\\' mode=\\'out\\'
大字段类型导出文件有两个,一个是t_lob.txt,一个是默认的大字段数据文件dmfldr.lob
清空表数据
查看控制文件
当前client_lob=false
\[dmdba\@localhost \~]\$ cat t\_lob.ctl
OPTIONS
(
SKIP = 0
ROWS = 50000
DIRECT = TRUE
INDEX\_OPTION = 1
)
Load data
infile '/home/dmdba/t\_lob.txt'
into table t\_lob
fields '|'
(
C1 ,
C2 ,
C3
)
执行数据导入
./dmfldr userid=wang/Wangyang123 control=\\'/home/dmdba/t\_lob.ctl\\' LOB\_DIRECTORY=\\'/home/dmdba\\' CLIENT\_LOB=FALSE
数据导入成功。
当DIRECT参数为FALSE时,dmfldr将把从数据文件中读取的自增列值作为目标值插入数据库表中,用户应当保证每一行的自增列的值符合自增列的规则,否则将造成数据混乱。 当DIRECT参数为TRUE时,dmfldr提供了SET_IDENTITY参数(缺省为FALSE)对数据载入时自增列的处理进行设置:
如果指定SET_IDENTITY选项值为TRUE,则dmfldr将把从数据文件中读取的自增列值作为目标值插入数据库表中,用户应当保证每一行的自增列的值符合自增列的规则,否则将造成数据混乱;
如果SET_IDENTITY选项值设置为FALSE,则dmfldr将忽略数据文件中对应自增列的值,服务器将根据自增列定义和表中已有数据自动生成自增列的值插入每一行的对应列。
Create table test(c1 int identity(1,1),c2 varchar(20));
查看数据
[dmdba\@localhost \~]\$ cat test.ctl
OPTIONS
(
SKIP = 0
ROWS = 50000
DIRECT = TRUE
INDEX\_OPTION = 1
)
Load data
infile '/home/dmdba/test.txt'
into table test
fields '|'
(
C1 ,
C2
)
dmfldr userid=wang/Wangyang123 control=\\'/home/dmdba/test.ctl\\' LOB\_DIRECTORY=\\'/home/dmdba\\' CLIENT\_LOB=FALSE mode=\\'out\\'
disql wang/Wangyang123 -E 'truncate table test;'
disql wang/Wangyang123 -E 'select count(\*) from test;'
修改某一条自增值为相同值
dmfldr userid=wang/Wangyang123 control=\\'/home/dmdba/test.ctl\\' LOB\_DIRECTORY=\\'/home/dmdba\\' CLIENT\_LOB=FALSE mode=\\'in\\' set\_identity=true
查看数据
disql wang/Wangyang123 -E 'select \* from test limit 10 ;'
当set_identity=true时,导入的数据不会变动,按照真实数据进行导入。
再次清空
dmfldr userid=wang/Wangyang123 control=\\'/home/dmdba/test.ctl\\' LOB\_DIRECTORY=\\'/home/dmdba\\' CLIENT\_LOB=FALSE mode=\\'in\\' set\_identity=false
disql wang/Wangyang123 -E 'select \* from test limit 10 ;'
基于C1的定义和已有数据,重复的编号自动修复,自动插入了合适的值
通过在控制文件中指定WHEN <field_conditions>子句,可以在装载过程中对数据进行过滤,符合field_conditions条件的数据才会被装载。
对于条件过滤的使用需注意以下几点:
判断条件中的操作符仅支持比较相等和不相等,即=、!=和<>这三个比较操作符;
目前仅支持使用AND连接多个过滤条件;
BLANKS和WHITESPACE表示若干个空格;
判断条件若使用(p1:p2)作为比较表达式,其意义与在POSTION子句中的意义相同,表示从该行指定位置获取数据进行比较,起始位置和结束位置表示的都是字节位置,包含边界p1,p2;
如果判断条件中使用colid作为比较表达式,该列必须在INTO表的coldef_option中进行说明;
如果判断条件中使用colid作为比较表达式,判断条件中使用的列仅用于过滤,并没有对应表中的某个实际列,应在col_def中指明FILLER属性表示装载时跳过该列;
如果判断条件中比较数据是字符常量值,其长度小于比较表达式长度,则在其之后补充空格;如果判断条件中比较数据是二进制串常量,其长度小于比较表达式长度,则在之后补充0。
[dmdba\@localhost \~]\$ disql
disql V8
用户名\:wang
密码:
服务器\[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 6.092(ms)
SQL> DROP TABLE TEST;
操作已执行
已用时间: 34.783(毫秒). 执行号:22301.
SQL> CREATE TABLE TEST(C1 INT,C2 INT);
操作已执行
已用时间: 4.785(毫秒). 执行号:22302.
SQL> quit
\[dmdba\@localhost \~]\$
vi test.txt
12
23
32
48
91
[dmdba\@localhost \~]\$ vi test.txt
[dmdba\@localhost \~]\$ cat test.
cat: test.: 没有那个文件或目录
\[dmdba\@localhost \~]\$ cat test.txt
12
23
32
48
91
存放路径为/home/dmdba/test.ctl,内容如下:
vi test.ctl
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE test
WHEN C1 != '2'
( C1 position (1:1),
C2 position (2:2)
)
./dmfldr wang/Wangyang123\@localhost:5236 control=\\'/home/dmdba/test.ctl\\'
[dmdba\@localhost \~]\$ dmfldr wang/Wangyang123\@localhost:5236 control=\\'/home/dmdba/test.ctl\\'
dmfldr V8
控制文件:
加载行数: 全部
每次提交服务器行数: 50000
跳过行数: 0
允许错误数: 100
是否直接加载: Yes
是否插入自增列: No
数据是否已按照聚集索引排序: No
字符集: UTF-8
数据文件共1个:
/home/dmdba/test.txt
错误文件: fldr.bad
目标表: TEST
列名 包装数据类型 终止
C1 CHARACTER |
C2 CHARACTER |
行缓冲区数量: 2
任务线程数量: 2
4 行记录已提交
目标表: TEST
load success.
4 行加载成功。
0 行由于数据错误没有加载。
0 行由于数据格式错误被丢弃。
跳过的逻辑记录总数: 0
读取的逻辑记录总数: 6
拒绝的逻辑记录总数: 0
10.127(ms)已使用
[dmdba\@localhost \~]\$
[dmdba\@localhost \~]\$
[dmdba\@localhost \~]\$ disql wang/Wangyang123 -E 'select \* from test ;';
服务器\[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.010(ms)
disql V8
C1 C2
----------- -----------
1 2
3 2
4 8
9 1
[dmdba\@localhost \~]\$
通过在控制文件中指定多个INTO TABLE子句,可以将一批数据同时向多个表进行装载。每个INTO TABLE子句中都可以指定WHEN过滤条件、FIELDS子句和列定义子句。
对于多表装载的使用需注意以下几点:
对于第二个及其之后的INTO TABLE子句,在其coldef_option中,必须为所有列指定POSITION选项;
在INTO TABLE子句的目标表中,如果目标表各不相同,则一个批次就可以完成装载完成(不管含有多少表,只需扫描一次数据文件即可);如果含有重复的目标表,则相同的表需要分批次导入(每当遇到相同的表时,就需要再扫描一遍源文件。N个重复的表,就需要扫描N次源文件)。基于条件或者通过文件,将一批数据分类后装载到多个表中,可以添加条件或不添加条件过滤。
基于条件可以做到表拆分操作。
BUFFER_NODE_SIZE设置读取文件缓冲区页大小,值越大,缓冲区的页越大,每次读取的数据就越多,每次发送到服务器的数据也就越多,效率越高。但其大小受dmfldr客户端内存大小限制。
在某些情况下,BUFFER_NODE_SIZE读入的数据行数很大,而后续操作处理不了这么大的行数,此时可以用READ_ROWS来限制处理的行数。dmfldr取READ_ROWS和BUFFER_NODE_SIZE中较小的值作为一次处理的行数。
指定dmfldr在数据载入时发送节点的个数,默认由系统计算一个初始值。取值范围为16~65535。若在数据载入时发现发送节点不够用,系统会动态增加分配。在系统内存足够的情况下,可以适当设大SEND_NODE_NUMBER值,提升dmfldr载入性能
指定dmfldr在数据载入时处理用户数据的线程数目。默认情况下,dmfldr将该参数值设为系统CPU的个数,但当CPU个数大于8时,缺省值都被置为8。在dmfldr客户端所在机器CPU大于8环境中,提高TASK_THREAD_NUMBER值可以提升dmfldr装载性能。
水平分区表装载时,指定服务器BLDR的最大个数,缺省为64。
服务器的BLDR保存水平分区子表相关信息,BLDR_NUM的设置也就指定了服务器能同时载入的水平分区子表的个数。若BLDR_NUM设置太大,当水平分区子表数过多时,可能会导致服务器内存不足。当载入时实际需要的BLDR个数超出BLDR_NUM设置时,会淘汰指定子表的BLDR,并替换为新的子表BLDR。
BDTA(Batch Data)的大小,缺省为5000。
BDTA代表DM数据库批量数据处理机制中一个批量,在内存、CPU允许的条件下,增大BDTA_SIZE能加快装载速度;在网络是装载性能瓶颈时,增大BDTA_SIZE影响不大。
索引的设置选项,缺省为1。INDEX_OPTION的可选项有1、2和3。
1代表服务器装载数据时先不刷新二级索引,而是将新数据按照索引预先排序,在装载完成后,再将排好序的数据插入索引。如果在数据载入前,目标表中已有较多数据,建议INDEX_OPTION置为1。
2代表服务器在快速装载过程中不刷新二级索引数据,只在装载完成时重建所有二级索引。如果在数据载入前,目标表中没有数据或数据量较小,建议INDEX_OPTION置为2。
3代表服务器使用追加模式来进行二级索引的插入,在数据装载的过程中,同时进行二级索引的插入,若未禁用全局索引,则在非DPC环境下,全局索引可通过设置INDEX_OPTION为3进行插入。当原有数据量远大于插入数据量时,建议INDEX_OPTION置为3。
dmfldr的使用存在以下一些限制:
不支持向临时表、外部表装载数据
不支持向系统表装载数据
不支持向带有位图索引的表装载数据
不支持向带有全文索引的表装载数据
不支持向DCP代理装载数据
不支持在DPC环境下,向带有全局索引的表装载数据
仅支持在index_option=2的情况下向带有函数索引的表装载数据
对象表暂不支持快速装载
dmfldr装载时会对约束进行检查,对各种约束的处理机制如下表所示;由于dmfldr不处理约束的有效性,都视为有效,故需要用户自行处理约束有效性等相关内容
dmldrp是服务端工具,位置在$DM_HOME/bin下,此工具仅用于服务端开启相应端口,命令为
dmldrp port=8336
dmldrc是客户端工具,用于连接服务端,从客户端将相应的数据通过网络传输到服务端进行导入,读取和加载数据在客户端完成,降低了服务端的压力,一个服务端可以服务多个客户端。
相关参数介绍:
[dmdba\@localhost bin]\$ dmldrc help
version: 03134284368-20250430-272000-20149 Pack1
格式: ./dmldrc KEYWORD=value
例程: ./dmldrc SYSDBA/SYSDBA 192.168.0.1:8336
USERID 必须是命令行中的第一个参数
SERVER 必须是命令行中的第二个参数
字符串类型参数必须以引号封闭
关键字 说明(默认值)
--------------------------------------------------------------------------------
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参数的{}是为了封装参数之用,书写时需要保留
SERVER dmldrp的IP地址和端口号。不需要指定参数名,直接指定host\[:port]
CONTROL 控制文件,字符串类型
LOG 日志文件,字符串类型 (fldr.log)
BADFILE 错误数据记录文件,字符串类型 (fldr.bad)
SKIP 初始忽略逻辑行数 (0)
LOAD 需要装载的行数 (ALL)
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)
OCI\_DIRECTORY OCI动态库所在的目录
DATA 指定数据文件路径
ENABLE\_CLASS\_TYPE 允许用户导入CLASS类型数据 (FALSE)
FLUSH\_FLAG 提交时是否立即刷盘 (FALSE)
SINGLE\_HLDR\_HP 是否使用单个HLDR装载HUGE水平分区表 (TRUE)
EP 指定需要发送数据的站点序号列表,仅向MPP/DPC环境导入数据时有效
PARALLEL 是否开启并行装载(FALSE)
SQL 使用自定义查询语句,仅导出模式有效
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文件
FLDR\_INI 配置文件路径,字符串类型
RECONN 自动重连次数(0)
RECONN\_TIME 自动重连等待时间(5), 单位(s), 有效值范围(1\~10000)
PLOG ldrp日志文件,字符串类型 (ldrp.log)
COMPATIBLE\_MODE 兼容模式(0), 0: 不做兼容, 1: 兼容DB2, 2: 兼容MYSQL
PRIORITY\_ENCLOSE DB2模式下, enclose优先级最高
HELP 打印帮助信息
主要参数:
USERID 用户名/口令
SERVER dmldrp的IP地址和端口
CONTROL 控制文件,字符串类型
LOG 日志文件,字符串类型 (fldr.log)
BADFILE 错误数据记录文件,字符串类型 (fldr.bad)
MODE 装载方式,仅支持装载IN
RECONN 自动重连次数(0)
RECONN\_TIME 自动重连等待时间(5), 单位(s), 有效值范围(1\~10000)
PLOG ldrp日志文件,字符串类型 (ldrp.log)
数据准备
创建表
Drop table if exists TEST\_LDRCP;
Create table TEST\_LDRCP(C1 INT,C2 INT,C3 DATE);
编辑数据文件test.txt,存放路径为/home/dmdba/TEST_LDRCP.txt,文件内容如下:
1 1|2015-11-06
2 2|2015-11-05
3 3|2015-11\_04
编辑控制文件test.ctl,存放路径为/home/dmdba/TEST_LDRCP.ctl,内容如下:
LOAD DATA
INFILE '/home/dmdba/TEST\_LDRCP.txt'
INTO TABLE TEST\_LDRCP
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2,
C3 DATE FORMAT 'yyyy-mm-dd'
)
使用dmldrp和dmldrc完成快速装载。
启动dmldrp服务器。
dmldrp port=9999
使用dmldrc进行数据载入。
dmldrc userid=wang/Wangyang123\@localhost:5236 localhost:9999 control=\\'/home/dmdba/TEST\_LDRCP.ctl\\' MODE=\\'IN\\'
服务端显示
达梦快速装载工具dmfldr可以通过命令行、参数文件、控制文件三种方式对数据库的数据表进行快速导出导入,支持普通表和大字段表,但是不支持临时表和外部表,以及一些系统表或者具有特殊约束的表。
通常情况下,由于参数较多,使用控制文件来对导出参数进行整合处理会比较方便实用,还可以对每个列进行拆分过滤处理等。
大字段表可以通过参数设置,将数据转换为字符串或者十六进制内容。
控制文件重要参数:
Infile 指定文件位置
Badfile 指定报错文件位置
[APPEND|REPLACE|INSERT] 指定导入模式,追加,覆盖,插入
file_option[directory_option] 指定文件或者自动扫描文件路径
position(p1:p2) 基于字段进行拆分,起始点是1,包含边界,单位是字节
NULL_STR 控制处理方式
Rows 每次提交的行数,性能参数
Direct 装载方式,性能参数,在导入的时候有效,导出无效。
SET_IDENTITY 指定自增列的处理方式
INDEX_OPTION 索引的处理方式
Mode 选择导出还是导入,不添加此参数默认是导入
BLOB_TYPE 指定blob类型是十六进制还是十六进制字符串
此工具只能用于快速装载,主要用于资源不足的情况下,将数据加兹安客户端和服务端分离,从而降低数据库服务器的压力。主要用法和dmfldr基本类似,数据通过dmldrp的端口进行传输。服务验证通过dmldrc来进行验证。
文章
阅读量
获赞