玩转dmfldr利器


DM技术交流QQ群:940124259

1. 基础概念

dmfldr(DM Fast Loader)是达梦提供的快速数据装载命令行工具,类似于Oracle的sqlldr。
我们可以通过使用dmfldr工具能够把按照一定格式排序的文本数据以简单、快速、高效的方式装载到数据库中,又或者可以把达梦数据库中的数据按照一定格式写入(导出到)文本文件。

适用场景:
对实时性要求不高的数据分析(决策分析)系统进行大量数据的快速导入。

在这里插入图片描述

从上图可知,dmfldr功能涉及客户端dmfldr工具和服务器端dmfldr功能模块的协作,以共同实现dmfldr各项功能。

数据载入处理流程:

  1. 用户录入预期的数据载入指令,回车提交dmfldr命令与参数到dmfldr客户端;
  2. dmfldr客户端接收用户提交的命令与参数,分析控制文件与数据文件;
  3. dmfldr客户端按控制文件指定的方式成功解析数据文件内容后,将数据打包发送给服务器端的dmfldr模块;
  4. 服务器端接收到数据进行数据快速装载入库,并返回相应的消息到客户端;
  5. 根据服务器反馈的消息和dmfldr执行参数生成日志文件和错误数据文件。

数据导出处理流程:

  1. 用户录入预期的数据导出指令,回车提交dmfldr命令与参数到dmfldr客户端;
  2. dmfldr客户端接收用户提交的命令与参数,分析控制文件,发送数据导出请求的消息给服务器端的dmfldr模块;
  3. 服务器成功解析消息并打包需要导出的数据,发送给dmfldr客户端;
  4. 客户端将得到的数据写入到指定的数据文件,在必要时生成日志文件;

服务器端对错误数据处理机制:

  1. dmfldr客户端将载入的数据进行数据转换和编码转换后,将转换后正确的数据发往DM服务器的dmfldr模块。
  2. dmfldr客户端每次向服务器端发送一批数据,在服务器端插入数据的过程中,由于目的表上可能存在约束等原因, 导致某些数据无法插入成功,此时服务器端会将这一批数据全部回滚,并将这批数据全部记为错误数据,但服务器端插入时的错误数据并不会记录到BADFILE 中。
  3. ERRORS参数所统计的错误包含在数据转换和数据插入过程中所产生的数据错误,因此当服务器端插入数据记录的错误数据数加上客户端数据转换时的错误数据数超过ERRORS参数的指定值时,dmfldr 服务器会停止插入数据。

2. 用法介绍

dmfldr命令行参数选项全览

[dmdba@dmdb ~]$ dmfldr help
open fail! path:./libcrypto.so
Format:    ./dmfldr   KEYWORD=value

Example:   ./dmfldr   SYSDBA/SYSDBA CONTROL='/opt/data/fldr.ctl'

USERID     should be the first parameter   必需参数,且是命令中的第一个参数。
CONTROL    should be the second parameter  必需参数,且是命令中的第二个参数。

String type parameter should be quoted

Keyword             Explanation(default)
--------------------------------------------------------------------------------
USERID              USER/PWD FORMAT:{<username>[/<password>][*<MPP_TYPE>][@<connect_identifier>]} 数据库连接信息(账户密码、数据库主机和端口等)
or/[:port] AS <SYSDBA|SYSSSO|SYSAUDITOR|USERS|AUTO>
                    <connect_identifier> :{[<server>][:<port>][?{UDP|TCP|IPC|RDMA|UNIXSOCKET}][#<sslpath>@<sslpwd>]}
                    <server>: If INET_TYPE is UNIXSOCKET, then <server> must be unixsocket file path name. For example, /data/sdb/DAMENG/foo.sock.
CONTROL             Control file, string type  控制文件,字符串类型
LOG                 Log file, string type (fldr.log)   日志文件,字符串类型,在不指定日志文件参数情况下默认文件名fldr.log
BADFILE             For record error data, string type (fldr.bad) 错误的数据记录存放文件(不满足格式解析和处理的数据记录)。
SKIP                Skiped rows first (0) 路过数据文件前多少行记录,默认值是不跳过。
LOAD                Rows need to be loaded (ALL) 装载数据记录最大行数。
ROWS                Commit frequency (50000) DIRECT为FALSE有效,多少行提交一次。默认50000数据行提交一次。
DIRECT              Whether to use fast loader (TRUE) 快速装载开关。默认是开启的。
SET_IDENTITY        Where to insert identity column (FALSE) 自增列源读取插入开关。保证自增列的值是来自源数据的。
SORTED              Whether the data is sorted by cluster index (FALSE) 数据是否已按照聚集索引排序。
INDEX_OPTION        Index option (1)
                    1 Do not flash the second level index,data sorted 不刷新二级索引,数据按照索引先排序,装载完后再将排序的数据插入索引。
                    by index first, insert the data to index after loading
                    2 Do not flash the second level index, rebuild all second  不刷新二级索引,数据装载完成后重建所有二级索引。
                    level index after loading
                    3 flash the second level index, insert the data to index data loading 刷新二级索引, 数据装载的同时将数据插入二级索引
ERRORS              The max error count allowed (100) 允许的最大数据错误条数。
CHARACTER_CODE      Character code, string type (GBK, UTF-8, SINGLE_BYTE, EUC-KR) 字符编码,字符串类型。
MODE                Load mode,string type, IN for load in, OUT for load out, OUTORA for load out ORACLE (IN)  装载方式,字符串类型 IN 表示载入,OUT表示载出,
CLIENT_LOB          Client lob directory (FALSE)   大字段目录是否在本地。
LOB_DIRECTORY       Directory for put lob data 大字段数据文件存放目录。
LOB_FILE_NAME       Name of lob file, only valid in out mode (dmfldr.lob) 大字段数据文件名称,仅对导出模式有效。
BUFFER_NODE_SIZE    Read buffer size (10), range 1~2048  读入文件缓冲区的大小,默认值10。
READ_ROWS           Max rows one task node can process (100000),  max 2^26-10000 工作线程一次最大处理的行数。
NULL_MODE           NULL string whether to be NULL when load in 载入时 NULL 字符串是否处理为 NULL
                    Empty string whether to be NULL when load out (FALSE)
NULL_STR            String that been load in as a null value  载入时视为NULL值处理的字符串。
SEND_NODE_NUMBER    Send ode number when running (20), value range 16~65535  运行时发送节点的个数。
TASK_THREAD_NUMBER  Thread number processing data, same as the number of processer 处理用户数据的线程数目,默认与处理器核数量相同。
                    cores in default,value range 1~128
BLDR_NUM            server BLDR count (64), value range 1~1024 服务器BLDR数目。
BDTA_SIZE           Size of bdta (5000), range 100~10000  bdta的大小。
COMPRESS_FLAG       Whether compress bdta (FALSE)  是否压缩bdta。
MPP_CLIENT          In mpp environment, client distribute (TRUE) MPP 环境,是否本地分发。
SINGLE_FILE         Whether generate only one datafile (FALSE)  MPP 环境,是否只生成单个数据文件。
LAN_MODE            In mpp environment, whether to load data using local area network (FALSE) MPP 环境,是否以内网模式装载数据。
UNREP_CHAR_MODE     Unrepresentable characters option(0),for option(0) to use the replacement char  非法字符处理选项(0),为 0 时表示跳过该数据行,为 1 时表示使用(*)替换错误字节。
SILENT              Suppress messages during run (FALSE) 静默运行。
BLOB_TYPE           BLOB data type,string type HEX or HEX_CHAR (HEX_CHAR)  BLOB 类型字段数据值的实际类型,字符串类型 (HEX_CHAR)。HEX 表示值为十六进制,HEX_CHAR 表示值为十六进制字符类型
                    only valid in direct=false mode
OCI_DIRECTORY       Directory for OCI  OCI动态库所在的目录。
DATA                Path to data file  指定数据文件路径。
ENABLE_CLASS_TYPE   The CLASS type is allowed (FALSE) 允许用户导入CLASS类型数据。
FLUSH_FLAG          Flush data to disk immediately (FALSE) 提交时是否立即刷盘。
IGNORE_BATCH_ERRORS Whether to ignore error data while loading (FALSE) 是否忽略错误数据继续导入。
SINGLE_HLDR_HP      Whether to use a single hldr for loading huge horizontal partition table (TRUE) 是否使用单个HLDR装载HUGE水平分区表。
EP                  MPP sites list which data will be send to  指定需要发送数据的站点序号列表,仅向 MPP 环境导入数据时有效。
PARALLEL            Do parallel load(FALSE)   是否并行加载。
SQL                 Use user-defined SQL query for data export 自定义SQL查询数据导出。
HELP                Show this help info
[dmdba@dmdb ~]$ 

控制文件语法格式:

[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>]
                                [<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>][<fmt_option>][<term_option>]
                         [<enclosed_option>][<constant_option>][<fun_option>]
<col_id> ::=列名
<property_option> ::=<position_option> | NULL
<position_option> ::=position(p1:p2) | position(p1)
<fmt_option> ::=DATE FORMAT '<时间日期格式串>'
<term_option> ::= TERMINATED [BY] <wx_option>
<wx_option> ::= WHITESPACE|[X] <delimiter>
<enclosed_option> ::= [OPTIONALLY] ENCLOSE [BY] [X] <delimiter>
<constant_option> ::= CONSTANT "<常量>"
<fun_option> ::= "函数名称()"

小贴士:

  1. 在处理数据文件中的换行符时,应该注意不同操作系统环境下产生的换行符。(windows下默认是\r\n 编码0x0D0A,Linux下默认是\n 编码0x0A)
    <row_term_option>选项用于指定行分隔符,如果为十六进制的字符串需指明前缀X,并不再需要以0x开头。
    如果没有指明X十六进制格式符选项,则即为指定字符串内容含义。

  2. 列分隔符由FILEDS或<coldef_option>其中一种指定。若两者均存在,则以coldef_option 中的设置为准。

  3. <directory_option>表示指定整个文件夹,dmfldr会自动扫描指定文件夹下的所有文件,这些文件数据将被导入到服务器。

  4. 关于<file_option>,用来指定单个文件。

  5. LIST选项表示实际的数据文件路径存储在INFILE指定的文件中,该文件可以存储多个实际的数据文件路径,使用逗号或者换行分割。

  6. 关于 APPEND|REPLACE|INSERT 选项, 当dmfldr处于数据装载模式时:
    INSERT表示插入方式,向空表插入新记录(如果不是空表则会报错无效的装载模式);
    APPEND 表示追加方式,为缺省方式,在表中追加新记录;
    REPLACE 表示替代方式,先清空表再插入新记录。 当dmfldr 处于导出数据模式时: dmfldr会检查导出数据文件是否存在,若不存在则直接创建新文件;
    若存在,当设置为APPEND(默认值)时,以追加的方式写入数据;设置为REPLACE 时,先删除文件再重新创建新文件;设置为其他值时则报错。

  7. OPTIONS选项支持除userid,control,help以外的所有参数指定,每个参数值对使用空格或换行符分割。控制文件中的OPTIONS参数值优先于命令行参数值。

  8. <col_def>选项中的FILTER表示跳过处理数据文件中指定列的值。

  9. <col_def>选项中<property_option>,仅对导入有效,且对大字段数据无效,若对大字段类型指定此选项会报错。各种组值情况如下:
    position(p1:p2) 从数据文件的每行数据的第p1个字节到第p2个字节为该列值,包含边界p1,p2。
    position(p1) 从数据文件的每行数据的第p1个字节开始,到下一个列分隔符之间的数据为该列值,包含边界p1。
    NULL 指定的值为NULL,忽略数据文件中的值。

  10. <term_option>表示列结束标志符。它可以是空格(WHITESPACE)或自定义字符串或十六进制串。指定term_option,该列不需要再用FIELDS分隔。

  11. <enclosed_option>表示封闭符,默认不存在封闭符。
    若在<into_table_clause>和<coldef_option>中均设置封闭符,则以<coldef_option>的设置为准;
    若封闭符前指定[X]选项,则表明此封闭符为十六进制格式的字符串。

  12. <ep_option>用于指定数据将要发送的目的站点,仅适用于MPP环境。

  13. <fun_option>目前只支持trim()和 replace(colname, srcStr,destStr)函数。
    trim()函数用于去除列数据的前后空格;
    replace()函数用于将colname列名指定的列数据中的srcStr替换为destStr,
    其中srcStr和destStr参数可使用chr(int)函数将数字转换成字符串,要求chr()的参数和返回值均不超过4个字节。

  14. <constant_option>对大字段类型无效,它表示该列数据将作为下一字段数据装载,容易导致数据混乱。

  15. <field_condition>表示条件过滤,在装载过程中对数据进行过滤,符合field_conditions 条件的数据才会被装载。

特别注意:DIRECT参数
dmfldr快速的载入模式,通过数据的转换和数据的封装直接对B树进行操作,省去普通插入方式下各个操作符之间的跳转,提升装载的效率,但对于约束的检查等由用户保证,dmfldr 将不处理有约束冲突的数据。
当为FALSE 时,dmfldr 选择普通的插入方式装载数据,可以保证数据的正确性和约束的有效性,效率比前者要低。


3. 实战案例

以下十余个示例,均来自本帅小宝项目实战经验,也是大家比较常用的操作,使用过程难免遇到各种问题,比如:参数理解没吃透,系统命令行解析参数扣脑壳,未按预想结果等等。对于MPP和守护主备场景,本篇文章忽略,待今后展开此类装载问题的讲解。

3.1 导出JOB表成数据文件job.dat

在这里插入图片描述

# 控制文件:job.ctl
OPTIONS (
 MODE='OUT'
 CHARACTER_CODE='UTF-8'
 LOG='/dmdata/data/FLDR/job.log'
)
LOAD DATA
INFILE '/dmdata/data/FLDR/job.dat'
REPLACE
INTO TABLE dmhr.job
FIELDS '|'
(
JOB_ID,
JOB_TITLE OPTIONALLY ENCLOSE BY '"',
MIN_SALARY,
MAX_SALARY
)
# dmfldr导出数据表job
[dmdba@dmdb FLDR]$ dmfldr SYSDBA/SYSDBA CONTROL=\'/dmdata/data/FLDR/job.ctl\'
dmfldr V8
16 rows is load out
Load finish 16 rows,
time:1345.057(ms)

# 注意:dmfldr命令参数要求是字符串类型,即传入dmfldr装载模块,需转义字符引号。
# 检查导出的数据文件写入格式
[dmdba@dmdb FLDR]$ file -i job.dat
job.dat: text/plain; charset=utf-8
[dmdba@dmdb FLDR]$

在这里插入图片描述

3.2 装载数据:dmfldr参数选项DATA指定数据文件

-- 建装载目标表:
drop table if exists sysdba.job2;
create table job2 as select job_id,job_title from dmhr.job where 1<>1; -- 复制表结构

在这里插入图片描述

# 控制文件:job2.ctl
LOAD DATA
INFILE * STR X '0A'
REPLACE
INTO TABLE sysdba.job2
FIELDS '|'
(
JOB_ID,
JOB_TITLE OPTIONALLY ENCLOSE BY '"'
)

在这里插入图片描述

## 装载数据到job2表:
[dmdba@dmdb FLDR]$ od -c -tx1 job.dat
0000000   1   1   |   " 346 200 273 347 273 217 347 220 206   "   |   8
         31  31  7c  22  e6  80  bb  e7  bb  8f  e7  90  86  22  7c  38
0000020   0   0   0   |   5   0   0   0   0  \n   1   2   |   " 346 200
         30  30  30  7c  35  30  30  30  30  0a  31  32  7c  22  e6  80
0000040 273 347 273 217 347 220 206 345 212 251 347 220 206   "   |   5
         bb  e7  bb  8f  e7  90  86  e5  8a  a9  e7  90  86  22  7c  35
0000060   0   0   0   |   2   0   0   0   0  \n   1   3   |   " 347 247
         30  30  30  7c  32  30  30  30  30  0a  31  33  7c  22  e7  a7
0000100 230 344 271 246   "   |   3   0   0   0   |   6   0   0   0  \n
.......................


[dmdba@dmdb FLDR]$ dmfldr SYSDBA/SYSDBA CONTROL=\'/dmdata/data/FLDR/job2.ctl\' DATA=\'/dmdata/data/FLDR/job.dat\' CHARACTER_CODE=\'UTF-8\' LOG=\'/dmdata/data/FLDR/job2.log\'
dmfldr V8
dmfldr:

Copyright (c) 2011, 2015, Dameng.  All rights reserved.

Control file:

Loaded rows: All

Rows per commit to server: 50000

Rows to skip: 0

Errors count allowed: 100

Whether to load direct: Yes

Whether to insert identity column: No

Whether data is sorted by cluster index: No

Character sets:UTF-8

Data file counts: 1
/dmdata/data/FLDR/job.dat

Error file :fldr.bad

Dest table :SYSDBA.JOB2

Column Name                                                                                                                      Packed data type     End
JOB_ID                                                                                                                           CHARACTER            |
JOB_TITLE                                                                                                                        CHARACTER            |

row buffer number is: 4
task thread number is: 4

16 rows committed

Dest table :SYSDBA.JOB2
16 Rows loaded success.
Due to data format error, 0 rows abandon.
Due to data error, 0 rows not loaded.

Skip logic record counts: 0
Read logic record counts: 16
Refuse logic record counts: 0

The total time used: 23.990(ms)

[dmdba@dmdb FLDR]$ ll
total 20
-rw-r--r-- 1 dmdba dinstall  121 Jun 16 18:57 job2.ctl
-rw-r--r-- 1 dmdba dinstall 1257 Jun 16 18:59 job2.log
-rw-r--r-- 1 dmdba dinstall  237 Jun 16 18:31 job.ctl
-rw-r--r-- 1 dmdba dinstall  493 Jun 16 18:33 job.dat
-rw-r--r-- 1 dmdba dinstall   69 Jun 16 18:33 job.log
[dmdba@dmdb FLDR]$

在这里插入图片描述

3.3 装载数据:控制文件中指定数据文件路径,带过滤条件

知识特别提示:

对于条件过滤的使用需注意以下几点:
1. 判断条件中的操作符'仅支持比较相等和不相等',即=!=<>这三个比较操作符;
2. 目前仅支持使用 AND 连接多个过滤条件;
3. BLANKS和WHITESPACE表示若干个空格;
4. 判断条件若使用(p1:p2)作为比较表达式,其意义与在 POSTION 子句中的意义相同,
   表示从该行指定位置获取数据进行比较,起始位置和结束位置表示的都是'字节位置',包含边界 p1,p2;
5. 如果判断条件中使用colid作为比较表达式,该列必须在INTO表的coldef_option中进行说明;
6. 如果判断条件中使用colid作为比较表达式,判断条件中使用的列仅用于过滤,并没有对应表中的某个实际列,
    应在col_def中指明FILLER属性表示装载时跳过该列;
7. 如果判断条件中比较数据是字符常量值,其长度小于比较表达式长度,则在其之后补充空格;
  如果判断条件中比较数据是二进制串常量,其长度小于比较表达式长度,则在之后补充0
-- 建装载目标表:
drop table if exists sysdba.job3;
# 控制文件:job3.ctl
LOAD DATA
INFILE '/dmdata/data/FLDR/job.dat' STR X '0A'
REPLACE
INTO TABLE sysdba.job3
WHEN (1:1) = '3'
FIELDS '|'
(
JOB_ID,
JOB_TITLE OPTIONALLY ENCLOSE BY '"'
)
# 装载数据:job3
[dmdba@dmdb FLDR]$  dmfldr SYSDBA/SYSDBA CONTROL=\'/dmdata/data/FLDR/job3.ctl\' CHARACTER_CODE=\'UTF-8\' LOG=\'/dmdata/data/FLDR/job3.log\' SILENT=true
dmfldr V8
dmfldr:

Copyright (c) 2011, 2015, Dameng.  All rights reserved.

Control file:

Loaded rows: All

Rows per commit to server: 50000

Rows to skip: 0

Errors count allowed: 100

Whether to load direct: Yes

Whether to insert identity column: No

Whether data is sorted by cluster index: No

Character sets:UTF-8

Dest table :SYSDBA.JOB3
3 Rows loaded success.
Due to data format error, 0 rows abandon.
Due to data error, 0 rows not loaded.

Skip logic record counts: 0
Read logic record counts: 16
Refuse logic record counts: 0

The total time used: 106.680(ms)

在这里插入图片描述

3.4 多个数据文件装载到同一张表,综合应用

# 数据汇总文件:person.txt
/dmdata/data/FLDR/person_1.dat
/dmdata/data/FLDR/person_2.dat
/dmdata/data/FLDR/person_3.dat

# 数据文件1:person_1.dat
11|"张三"|2020-11-24||18 70
12|"李四"|2020-11-20||30 70
13|"王五"|2020-11-09||22 50

# 数据文件2:person_2.dat
21|"张三2"|2021-04-01||18 60 cn
22|"李四2"|2021-02-10||30   (50) cn
23|"王五2"|2021-01-24||22 50 en

# 数据文件3:person_3.dat
31|"张三3"|2021-03-24||18  (70) en-us
32|"李四3"|2021-03-24||30    (70) en-uk
33|"王五4"|2021-05-24||22 (50) fr-fr
-- 建表person
drop table if exists person;
create table person(
    id int identity(1,1) primary key, 
    name varchar(30) not null, 
    join_date date,
    gender varchar(10), 
    age int check(age between 1 and 150), 
    description varchar(255) default '大王来巡山',
    cons_value varchar(20)
);

数据装载需求:

数据文件第一列插入id字段,第二列插入name字段,第三列插入join_date字段,第四列插入gender字段且去除左右空格且只加载男的数据行, 第五列插入age字段,description字段留空,cons_value字段插入固定常量值hello。

# 控制文件person.ctl
OPTIONS (
  CHARACTER_CODE='UTF-8'
  MODE='IN'
  DIRECT=TRUE
  INDEX_OPTION=1
  SET_IDENTITY=TRUE
  LOG='/dmdata/data/FLDR/person.log'  
)
LOAD DATA
INFILE LIST '/dmdata/data/FLDR/person.txt' STR X '0A'
BADFILE '/dmdata/data/FLDR/person.bad'
INTO TABLE sysdba.person
WHEN gender = '男'
FIELDS '|'
(
  id,
  name enclose by '"',
  join_date data format 'YYYY-MM-DD',
  gender "trim()",
  age terminated by whitespace,
  description NULL,
  cons_value constant "hello"
)
# 数据装载:
[dmdba@dmdb FLDR]$ nl person_*.dat
     1  11|"张三"|2020-11-24||18 70
     2  12|"李四"|2020-11-20||30 70
     3  13|"王五"|2020-11-09||22 50
     4  21|"张三2"|2021-04-01||18 60 cn
     5  22|"李四2"|2021-02-10||30   (50) cn
     6  23|"王五2"|2021-01-24||22 50 en
     7  31|"张三3"|2021-03-24||18  (70) en-us
     8  32|"李四3"|2021-03-24||30    (70) en-uk
     9  33|"王五4"|2021-05-24||22 (50) fr-fr
[dmdba@dmdb FLDR]$ man cat
[dmdba@dmdb FLDR]$  dmfldr SYSDBA/SYSDBA CONTROL=\'/dmdata/data/FLDR/person.ctl\'
dmfldr V8
Control file syntax error, line 18: data

[dmdba@dmdb FLDR]$ vim person.ctl
[dmdba@dmdb FLDR]$  dmfldr SYSDBA/SYSDBA CONTROL=\'/dmdata/data/FLDR/person.ctl\'
dmfldr V8
dmfldr:

Copyright (c) 2011, 2015, Dameng.  All rights reserved.

Control file:

Loaded rows: All

Rows per commit to server: 50000

Rows to skip: 0

Errors count allowed: 100

Whether to load direct: Yes

Whether to insert identity column: Yes

Whether data is sorted by cluster index: No

Character sets:UTF-8

Data file counts: 3
/dmdata/data/FLDR/person_1.dat
/dmdata/data/FLDR/person_2.dat
/dmdata/data/FLDR/person_3.dat

Error file :/dmdata/data/FLDR/person.bad
Dest table :SYSDBA.PERSON

Column Name                                                                                                                      Packed data type     End
ID                                                                                                                               CHARACTER            |
NAME                                                                                                                             CHARACTER            |
JOIN_DATE                                                                                                                        YYYY-MM-DD           |
GENDER                                                                                                                           CHARACTER            |
AGE                                                                                                                              CHARACTER            WHT
DESCRIPTION                                                                                                                      CHARACTER            |
CONS_VALUE                                                                                                                       CHARACTER            |

row buffer number is: 4
task thread number is: 4

3 rows committed
4 rows committed
6 rows committed

Dest table :SYSDBA.PERSON
6 Rows loaded success.
Due to data format error, 0 rows abandon.
Due to data error, 0 rows not loaded.

Skip logic record counts: 0
Read logic record counts: 9
Refuse logic record counts: 0

The total time used: 31.266(ms)

在这里插入图片描述

3.5 多表装载

在控制文件中指定多个 INTO TABLE 子句,可以将一批数据同时向多个表进行装载。
每个INTO TABLE 子句中都可以指定WHEN过滤条件、FIELDS 子句和列定义子句。

特别提示

1.每个INTO TABLE子句的目标表必须是不同的表;
2.多表装载时不支持直接装载分区表子表;
3.对于第二个及其之后的 INTO TABLE 子句,在其coldef_option中,必须为第一列指定 POSITION 选项。

-- 建表
drop table if exists sysdba.job4;
create table job4 as select job_id,job_title from dmhr.job where 1<>1; -- 复制表结构

drop table if exists sysdba.job5;
create table job5 as select job_id,job_title from dmhr.job where 1<>1; -- 复制表结构

drop table if exists sysdba.job6;
create table job6 as select min_salary,max_salary from dmhr.job where 1<>1; -- 复制表结构
## 数据文件:job.dat  utf-8 编码
[root@dmdb FLDR]# cat job.dat
11|总经理|8000|50000
12|总经理助理|5000|20000
13|秘书|3000|6000
21|行政部经理|5000|10000
22|文员|2500|5000
31|开发部经理|8000|20000
32|项目经理|6000|20000
33|开发工程师|6000|15000
41|市场部经理|5000|20000
42|市场专员|3000|6000
51|技术支持部经理|7000|18000
52|技术支持工程师|4000|12000
61|测试部经理|8000|20000
62|测试工程师|4000|10000
71|人力资源部经理|6000|12000
72|招聘专员|2500|6000
[root@dmdb FLDR]#
[root@dmdb FLDR]# file -i job.dat
job.dat: text/plain; charset=utf-8
## 控制文件:job_multi.ctl
[dmdba@dmdb FLDR]$ cat job_multi.ctl
OPTIONS (
  CHARACTER_CODE='UTF-8'
  LOG='/dmdata/data/FLDR/job_multi.log'
)
LOAD DATA
INFILE '/dmdata/data/FLDR/job.dat'
BADFILE '/dmdata/data/FLDR/job.bad'
REPLACE 
INTO TABLE sysdba.job6
FIELDS '|'
(
    a filler,
    b filler,
    min_salary,
    max_salary
)

INTO TABLE sysdba.job5
WHEN (1:1) = '5'
FIELDS '|'
(
    job_id position(1:2),
    job_title position(4)
)

INTO TABLE sysdba.job4
WHEN (1:1) = '4'
FIELDS '|'
(
    job_id position(1:2),
    job_title position(4)
)

####### 该操作心得 ######
1. 忽略数据文件中数据列的内容使用filler关键字,可以跳过错位的表字段。
2. 多个INTO子句,第二个开始的第一列必要使用position关键字定位数据列内容,有可能后面的数据列也要继续使用position关键字定位。
## 装载数据
[dmdba@dmdb FLDR]$ dmfldr SYSDBA/SYSDBA CONTROL=\'/dmdata/data/FLDR/job_multi.ctl\'
dmfldr V8
dmfldr:

Copyright (c) 2011, 2015, Dameng.  All rights reserved.

Control file:

Loaded rows: All

Rows per commit to server: 50000

Rows to skip: 0

Errors count allowed: 100

Whether to load direct: Yes

Whether to insert identity column: No

Whether data is sorted by cluster index: No

Character sets:UTF-8



Data file counts: 1
/dmdata/data/FLDR/job.dat

Error file :/dmdata/data/FLDR/job.bad

Dest table :SYSDBA.JOB6

Column Name                                                                                                                      Packed data type     End
A                                                                                                                                CHARACTER            |
B                                                                                                                                CHARACTER            |
MIN_SALARY                                                                                                                       CHARACTER            |
MAX_SALARY                                                                                                                       CHARACTER            |

row buffer number is: 4
task thread number is: 4


Data file counts: 1
/dmdata/data/FLDR/job.dat

Error file :/dmdata/data/FLDR/job.bad

Dest table :SYSDBA.JOB5

Column Name                                                                                                                      Packed data type     End
JOB_ID                                                                                                                           CHARACTER            |
JOB_TITLE                                                                                                                        CHARACTER            |

row buffer number is: 4
task thread number is: 4


Data file counts: 1
/dmdata/data/FLDR/job.dat

Error file :/dmdata/data/FLDR/job.bad

Dest table :SYSDBA.JOB4

Column Name                                                                                                                      Packed data type     End
JOB_ID                                                                                                                           CHARACTER            |
JOB_TITLE                                                                                                                        CHARACTER            |

row buffer number is: 4
task thread number is: 4

16 rows committed
2 rows committed
2 rows committed

Dest table :SYSDBA.JOB6
16 Rows loaded success.
Due to data format error, 0 rows abandon.
Due to data error, 0 rows not loaded.

Skip logic record counts: 0
Read logic record counts: 16
Refuse logic record counts: 0

The total time used: 72.837(ms)


Dest table :SYSDBA.JOB5
2 Rows loaded success.
Due to data format error, 0 rows abandon.
Due to data error, 0 rows not loaded.

Skip logic record counts: 0
Read logic record counts: 16
Refuse logic record counts: 0

The total time used: 72.837(ms)


Dest table :SYSDBA.JOB4
2 Rows loaded success.
Due to data format error, 0 rows abandon.
Due to data error, 0 rows not loaded.

Skip logic record counts: 0
Read logic record counts: 16
Refuse logic record counts: 0

The total time used: 72.837(ms)
Segmentation fault (core dumped)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.6 大字段数据导出

特别提示:

  1. dmfldr支持对达梦数据库的大字段类型数据的载入和导出。
  2. 达梦数据库支持的大字段数据类型有TEXT、LONGVARCHAR、IMAGE、LONGVARBINARY、BLOB 以及 CLOB。
  3. 当dmfldr处于导出模式,即MODE为OUT时,dmfldr导出的大字段会放在一个单独文件中,其包含大字段的数据文件名由LOB_FILE_NAME指定。
    LOB_FILE_NAME参数默认文件名为dmfldr.lob,文件存放于LOB_DIRECTORY 指定的目录。
    如果未指定LOB_DIRECTORY,则存放于指定导出数据文件的同一目录中。
-- 建表t_lob
drop table if exists sysdba.t_lob;
create table t_lob (id int, name varchar(20), cb clob);

declare
  v_ch varchar :='';
  v_name varchar(20) assign '';
begin
  for i in 1..10 loop
     set v_ch = REPLICATE(i,1000);
     v_name := dbms_random.string('U',10);
     execute immediate 'insert into sysdba.t_lob(id,name,cb) values(?,?,?);' using i,v_name,v_ch;    
  end loop;
  commit;
end;
/

在这里插入图片描述

# 控制文件:t_lob.ctl
OPTIONS (
   CHARACTER_CODE='UTF-8'
   MODE='OUT'
   LOG='/dmdata/data/FLDR/t_lob.log' 
   LOB_DIRECTORY='/dmdata/data/FLDR'
   LOB_FILE_NAME='t_lob.lob'
   SILENT=TRUE
)
LOAD DATA
INFILE '/dmdata/data/FLDR/t_lob.dat'
REPLACE INTO TABLE sysdba.t_lob
FIELDS '|'
# 大字段数据导出:
[dmdba@dmdb FLDR]$ dmfldr SYSDBA/SYSDBA CONTROL=\'/dmdata/data/FLDR/t_lob.ctl\'
dmfldr V8
10 rows is load out
Load finish 10 rows,
time:322.216(ms)

[dmdba@dmdb FLDR]$ cat t_lob.dat
1|DRUVADSIUG|t_lob.lob:11000:1000
2|VEJOWJBMQE|t_lob.lob:12000:1000
3|QFESXURTRY|t_lob.lob:13000:1000
4|QVQLRRPLAK|t_lob.lob:14000:1000
5|RWPBMMKNYB|t_lob.lob:15000:1000
6|SQHWJFSCAK|t_lob.lob:16000:1000
7|BQHSCYKRKK|t_lob.lob:17000:1000
8|DDISEUFPIF|t_lob.lob:18000:1000
9|QCVYYGERIE|t_lob.lob:19000:1000
10|DJVKCXKNQV|t_lob.lob:20000:2000

在这里插入图片描述

3.7 快速装载:大字段数据导入

特别提示:

  1. DIRECT=TRUE & MODE=IN,数据装载中涉及大字段对象需手工指定大字段数据文件。
  2. CLIENT_LOB=TRUE,LOB_DIRECTORY表示大字段数据文件所在的客户端本地目录。
  3. CLIENT_LOB=FALSE,须先把相关文件传送到达梦数据库服务器所在主库,再使用LOB_DIRECTORY指明存放目录。
  4. 大字段数据文件在数据文件中指定,可以是任意格式的文件。 在数据文件中,大字段以“文件名:起始偏移:长度”的形式记录在数据文件中。 指定的文件名无效时,dmfldr会报错,装载失败。
  5. 对于CLOB类型字段,当指定的偏移、长度范围内带有不完整字符时,dmfldr将装载失败。
# 数据文件:t_lob.dat
# 大字段数据文件:t_lob.lob
-- 建表:
drop table if exists sysdba.t_lob2;
create table t_lob2 (id int identity(101,1), name varchar(20), cc clob);
# 控制文件:t_lob2.ctl
OPTIONS (
   CHARACTER_CODE='UTF-8'
   DIRECT=TRUE
   MODE='IN'
   LOG='/dmdata/data/FLDR/t_lob2.log' 
   CLIENT_LOB=TRUE
   LOB_DIRECTORY='/dmdata/data/FLDR'
   LOB_FILE_NAME='t_lob.lob'
   SET_IDENTITY=FALSE
   SILENT=TRUE
)
LOAD DATA
INFILE '/dmdata/data/FLDR/t_lob.dat'
BADFILE '/dmdata/data/FLDR/t_lob2.bad'
REPLACE INTO TABLE sysdba.t_lob2
FIELDS '|'
(
   id,
   name filler,
   cc 
)
# 数据装载大字段:
[dmdba@dmdb FLDR]$ dmfldr SYSDBA/SYSDBA CONTROL=\'/dmdata/data/FLDR/t_lob2.ctl\'
dmfldr V8
dmfldr:

Copyright (c) 2011, 2015, Dameng.  All rights reserved.

Control file:

Loaded rows: All

Rows per commit to server: 50000

Rows to skip: 0

Errors count allowed: 100

Whether to load direct: Yes

Whether to insert identity column: No

Whether data is sorted by cluster index: No

Character sets:UTF-8

Dest table :SYSDBA.T_LOB2
10 Rows loaded success.
Due to data format error, 0 rows abandon.
Due to data error, 0 rows not loaded.

Skip logic record counts: 0
Read logic record counts: 10
Refuse logic record counts: 0

The total time used: 29.304(ms)

在这里插入图片描述

3.8 普通装载:大字段数据导入,空值处理

特别提示:

  1. MODE=IN 且 DIRECT=FALSE,BLOB_TYPE参数才有效,数据文件中大字段列数据,即字段内容。
  2. BLOB_TYPE=HEX_CHAR (默认值),数据文件中 BLOB 列当作为十六进制内容; BLOB_TYPE=HEX,数据文件中BLOB列为字符串形式内容,导入后会转换为十六进制。
  3. NULL_MODE=TRUE, 载入时NULL 字符串处理为NULL,载出时空值处理为NULL字符串. NULL_MODE=FALSE,载入时 NULL 字符串处理为字符串,载出时空值处理为空串.
# 数据文件:t_lob3.dat

ID	NAME	JOIN	CC	BB
1|Well Smith|202106182040|abcdefg|XX
2|Scott Jim|202106182040|hijlkmn|32
3|Tony Ja|202006182040|adefhjd|33
4|Tom Jason|202106182045|123456789|34
5|Rianledo Lee|20210618204010|98765431|35
6|null|202106182041|yyyyyyyyy|36
7|NuLL|202106182058|zzzzzzzzz|36
-- 建表
drop table if exists sysdba.t_lob31;
create table t_lob31 (id int not null, name varchar(20), join datetime, cc clob, bb blob);

drop table if exists sysdba.t_lob32;
create table t_lob32 (id int not null, name varchar(20), join datetime, cc clob, bb blob);
# 控制文件:t_lob31.ctl   blob数据列内容视作HEX_CHAR
OPTIONS (
   MODE='IN'
   SKIP=1
   DIRECT=FALSE   
   CHARACTER_CODE='UTF-8'
   BLOB_TYPE='HEX_CHAR'
   NULL_MODE=TRUE
   SILENT=TRUE
   LOG='/dmdata/data/FLDR/t_lob31.log'    
)
LOAD DATA
INFILE '/dmdata/data/FLDR/t_lob3.dat'
BADFILE '/dmdata/data/FLDR/t_lob31.bad'
REPLACE INTO TABLE sysdba.t_lob31
FIELDS '|'
(
    id,
    name "REPLACE(:REPLACE,'J','X')",
    join date format 'YYYYMMDDHH24MISS',
    cc,
    bb
)

## 函数名称必须大写,repalce中第一参数列名须用冒号打头。
## replace函数目前只是支持,但起不到目标替换作用。
# 控制文件:t_lob32.ctl   blob数据列内容视作HEX
OPTIONS (
   MODE='IN'
   SKIP=1
   DIRECT=FALSE   
   CHARACTER_CODE='UTF-8'
   BLOB_TYPE='HEX'
   NULL_MODE=FALSE
   SILENT=TRUE
   LOG='/dmdata/data/FLDR/t_lob32.log'    
)
LOAD DATA
INFILE '/dmdata/data/FLDR/t_lob3.dat'
BADFILE '/dmdata/data/FLDR/t_lob32.bad'
REPLACE INTO TABLE sysdba.t_lob32
FIELDS '|'
(
    id,
    name NULL,
    join date format 'YYYYMMDDHH24MISS',
    cc,
    bb
)
# 数据装载1:
[dmdba@dmdb FLDR]$ dmfldr SYSDBA/SYSDBA CONTROL=\'/dmdata/data/FLDR/t_lob31.ctl\'
dmfldr V8
dmfldr:

Copyright (c) 2011, 2015, Dameng.  All rights reserved.

Control file:

Loaded rows: All

Rows per commit to server: 50000

Rows to skip: 1

Errors count allowed: 100

Whether to load direct: No

Whether to insert identity column: No

Whether data is sorted by cluster index: No

Character sets:UTF-8


6 rows processed.

Dest table :SYSDBA.T_LOB31
6 Rows loaded success.
Due to data format error, 0 rows abandon.
Due to data error, 1 rows not loaded.

Skip logic record counts: 1
Read logic record counts: 7
Refuse logic record counts: 1

The total time used: 12.193(ms)

在这里插入图片描述

# 数据装载2:
[dmdba@dmdb FLDR]$ dmfldr SYSDBA/SYSDBA CONTROL=\'/dmdata/data/FLDR/t_lob32.ctl\'
dmfldr V8
dmfldr:

Copyright (c) 2011, 2015, Dameng.  All rights reserved.

Control file:

Loaded rows: All

Rows per commit to server: 50000

Rows to skip: 1

Errors count allowed: 100

Whether to load direct: No

Whether to insert identity column: No

Whether data is sorted by cluster index: No

Character sets:UTF-8

7 rows processed.

Dest table :SYSDBA.T_LOB32
7 Rows loaded success.
Due to data format error, 0 rows abandon.
Due to data error, 0 rows not loaded.

Skip logic record counts: 1
Read logic record counts: 7
Refuse logic record counts: 0

在这里插入图片描述

-- 区分空值NULL和字符串NULL
select 't_lob31',id,ifnull(name,'NULL_VALUE') from "SYSDBA"."T_LOB31"
union all
select 't_lob32',id,ifnull(name,'NULL_VALUE') from "SYSDBA"."T_LOB32";

在这里插入图片描述

3.9 关于某数据列(聚集索引)排序装载

特别提示:

  1. SORTED参数作用驱于已经按聚集索引排序的数据列,默认为 FALSE。
  2. SORTED=TRUE,须保证数据已按聚集索引排序完成,且表中存在数据,
    插入时,数据文件中的索引值要比表中数据的索引值大,服务器在做插入操作时顺序进行插入。
    若数据并未按照索引排序,则 dmfldr 会报错,装载失败。
  3. SORTED=FALSE,则服务器对于每条记录进行定位插入。
  4. 此参数SORTED仅在MODE为IN且DIRECT为TRUE 的情况下有效,对于其他情况此参数无效。
  5. 在数据量大且确定数据已按照聚集索引排序完成的情况下,将SORTED参数设置为TRUE,可以提升装载性能。
# 数据文件:sort.dat
1,aaaa,99
2,bbbb,97
3,cccc,98
4,dddd,100
5,eeee,96
6,ffff,93
7,gggg,102
8,hhhh,80
# 控制文件:sort.ctl
OPTIONS (
    CHARACTER_CODE='UTF-8'
    MODE='IN'   
    DIRECT=TRUE
    SORTED=TRUE
    SILENT=TRUE
    LOAD=3
    FLUSH_FLAG=TRUE
    IGNORE_BATCH_ERRORS=TRUE
)
LOAD DATA
INFILE '/dmdata/data/FLDR/t_sort.dat'
BADFILE '/dmdata/data/FLDR/t_sort.bad'
APPEND INTO TABLE sysdba.t_sort
FIELDS ','


# FLUSH_FLAG 提交时是否立即刷盘  
# IGNORE_BATCH_ERRORS 是否忽略错误数据继续导入
# LOAD 设置装载的最大行数,不包括SKIP指定的跳过的行数。
-- 建表t_sort
drop table if exists sysdba.t_sort;
create  table sysdba.t_sort
(
  c1 int        ,
  c2 varchar(20),
  c3 int        ,
  cluster primary key (c1)
);

insert 
into sysdba.t_sort(c1,c2,c3) 
values (1,'aaaaxx',100),(2,'bbbb',97);

commit;
select * from sysdba.t_sort;

在这里插入图片描述
开始进行数据装载1:原表已存在c1=1,2的数据,直接使用sorted参数会报错,一是唯一索引值重复,二是装载的数据有序且须比原表数值大。

[dmdba@dmdb FLDR]$ dmfldr SYSDBA/SYSDBA CONTROL=\'/dmdata/data/FLDR/t_sort.ctl\' LOG=\'/dmdata/data/FLDR/t_sort.log\'
dmfldr V8
dmfldr:

Copyright (c) 2011, 2015, Dameng.  All rights reserved.

Control file:

Loaded rows: 3

Rows per commit to server: 50000

Rows to skip: 0

Errors count allowed: 100

Whether to load direct: Yes

Whether to insert identity column: No

Whether data is sorted by cluster index: Yes

Character sets:UTF-8

Dest table :SYSDBA.T_SORT
0 Rows loaded success.
Due to data format error, 0 rows abandon.
Due to data error, 3 rows not loaded.  ###由于load限定只装载3条记录,此处提示未装载成功,可查看日志文件。

Skip logic record counts: 0
Read logic record counts: 3
Refuse logic record counts: 3

The total time used: 20.409(ms)

[dmdba@dmdb FLDR]$
[dmdba@dmdb FLDR]$ cat t_sort.log
dmfldr: 2021-06-19 10:01:02  dmfldr:

Copyright (c) 2011, 2015, Dameng.  All rights reserved.

Control file:

Loaded rows: 3

Rows per commit to server: 50000

Rows to skip: 0

Errors count allowed: 100

Whether to load direct: Yes

Whether to insert identity column: No

Whether data is sorted by cluster index: Yes

Character sets:UTF-8


dmfldr: 2021-06-19 10:01:02
Data file counts: 1
/dmdata/data/FLDR/t_sort.dat

Error file :/dmdata/data/FLDR/t_sort.bad

Dest table :SYSDBA.T_SORT

Column Name                                                                                                                      Packed data type     End
C1                                                                                                                               CHARACTER            ,
C2                                                                                                                               CHARACTER            ,
C3                                                                                                                               CHARACTER            ,


dmfldr: 2021-06-19 10:01:02  can not use nosort option, rows are not sorted 
 ## 原因是未使用nosort项,插入的数据未排序。导致最终数据装载失败。
dmfldr: 2021-06-19 10:01:02
Dest table :SYSDBA.T_SORT
0 Rows loaded success.
Due to data format error, 0 rows abandon.
Due to data error, 3 rows not loaded.

Skip logic record counts: 0
Read logic record counts: 3
Refuse logic record counts: 3

The total time used: 20.409(ms)

[dmdba@dmdb FLDR]$

开始进行数据装载2:跳过前三行数据记录进行装载,且保证c1列数值有序和比原表存在数值大。

[dmdba@dmdb FLDR]$ dmfldr SYSDBA/SYSDBA CONTROL=\'/dmdata/data/FLDR/t_sort.ctl\' LOG=\'/dmdata/data/FLDR/t_sort.log\' SKIP=3
dmfldr V8
dmfldr:

Copyright (c) 2011, 2015, Dameng.  All rights reserved.

Control file:

Loaded rows: 3

Rows per commit to server: 50000

Rows to skip: 3

Errors count allowed: 100

Whether to load direct: Yes

Whether to insert identity column: No

Whether data is sorted by cluster index: Yes

Character sets:UTF-8

Dest table :SYSDBA.T_SORT
3 Rows loaded success.  ## 成功装载3条数据记录
Due to data format error, 0 rows abandon.
Due to data error, 0 rows not loaded.

Skip logic record counts: 3
Read logic record counts: 3
Refuse logic record counts: 0

The total time used: 24.957(ms)

[dmdba@dmdb FLDR]$

在这里插入图片描述

3.10 SQL查询导出

某些情况下,通过SQL查询筛选表中一部分数据记录导出到文本数据文件,此时利用dmfldr参数SQL很好解决该问题。

注意:SQL参数只能针对OUT模式生效,并且它的内容属于字符串类型,应该使用单引号括起来。

-- 数据准备
create table fstest (c1 VARCHAR(20), c2 int);
insert into fstest values('数学', 90), ('语文', 99), ('英语', 100);
commit;
select * from fstest;

在这里插入图片描述

实现需求
利用dmfldr工具从fstest表中筛选C2>=99的表记录导出到fstest.txt文件进行保存。

-- 实现方式1:OPTIONS大法
-- 1.1 控制文件:fstest.ctl
OPTIONS
(
  CHARACTER_CODE='UTF-8'
  MODE='OUT'
  SQL='SELECT * FROM SYSDBA.FSTEST WHERE C2>=99'

)

LOAD DATA
INFILE  '/home/dmdba/fstest.txt'
INSERT
INTO TABLE SYSDBA.FSTEST
FIELDS  '|

-- 1.2 执行dmfldr
[dmdba@dm120 ~]$ dmfldr SYSDBA/SYSDBA control=\'/home/dmdba/fstest.ctl\'
dmfldr V8
2 rows is load out
Load finish 2 rows, 
time:229.676(ms)

#=============================================================
-- 实现方式2:参数大法
-- 2.1 控制文件:fstest.ctl
OPTIONS
(
  CHARACTER_CODE='UTF-8'
  MODE='OUT'
)

LOAD DATA
INFILE  '/home/dmdba/fstest.txt'
INSERT
INTO TABLE SYSDBA.FSTEST
FIELDS  '|

-- 2.2 执行dmfldr结果
[dmdba@dm120 ~]$ dmfldr sysdba/SYSDBA control=\'/home/dmdba/fstest.ctl\' sql="'select * from sysdba.fstest where c2>=99'"
dmfldr V8
2 rows is load out
Load finish 2 rows, 
time:255.713(ms)

在这里插入图片描述

3.11 高效的数据装载

高效装载无非就是指支持多线程多并发,加大数据缓存,批量发送数据,索引更新处理。

### 提升dmfldr 性能的相关参数:
1. BUFFER_NODE_SIZE  设置读取文件缓冲区页大小。
      值越大,缓冲区的页越大,每次读取的数据就越多,每次发送到服务器的数据也就越多,效率越高。
      但其大小受dmfldr客户端内存大小限制。

2. READ_ROWS   限制处理的行数。
      在某些情况下,BUFFER_NODE_SIZE读入的数据行数很大,而后续操作处理不了这么大的行数,此时可以用 READ_ROWS限制行数。
      dmfldr取 READ_ROWS和BUFFER_NODE_SIZE中较小的值作为一次处理的行数。

3. SEND_NODE_NUMBER   指定dmfldr在数据载入时发送节点的个数,默认由系统计算一个初始值。
      若在数据载入时发现发送节点不够用,系统会动态增加分配。
      在系统内存足够的情况下,可以适当设大SEND_NODE_NUMBER 值,提升 dmfldr 载入性能。

4. TASK_THREAD_NUMBER    指定dmfldr在数据载入时处理用户数据的线程数目。
      默认情况下,dmfldr 将该参数值设为系统 CPU 的个数,但当CPU个数大于 8 时,默认值都被置为8。
      在 dmfldr客户端所在机器CPU大于8 环境中,提高TASK_THREAD_NUMBER 值可以提升 dmfldr 装载性能。

5. BLDR_NUM  水平分区表装载时,指定服务器 BLDR 的最大个数,默认为 64。
      服务器的 BLDR 保存水平分区子表相关信息,BLDR_NUM 的设置也就指定了服务器能同时载入的水平分区子表的个数。
      若BLDR_NUM设置太大,当水平分区子表数过多时,可能会导致服务器内存不足。
      当载入时实际需要的 BLDR 个数超出 BLDR_NUM 设置时,会淘汰指定子表的BLDR,并替换为新的子表BLDR。

6. BDTA_SIZE  BDTA(Batch Data)的大小,默认为 5000。
      BDTA代表 DM 数据库批量数据处理机制中一个批量,在内存、CPU 允许的条件下,增大 BDTA_SIZE 能加快装载速度;
      在网络是装载性能瓶颈时,增大 BDTA_SIZE 影响不大。

7. INDEX_OPTION 索引的设置选项,默认为 11 --> 代表服务器装载数据时先不刷新二级索引,而是将新数据按照索引预先排序,在装载完成后,再将排好序的数据插入索引。
                  如果在数据载入前,目标表中已有较多数据,建议INDEX_OPTION 置为 12 --> 代表服务器在快速装载过程中不刷新二级索引数据,只在装载完成时重建所有二级索引。
                  如果在数据载入前,目标表中没有数据或数据量较小,建议 INDEX_OPTION 置为 23 --> 代表服务器使用追加模式来进行二级索引的插入,在数据装载的过程中, 同时进行二级索引的插入,
                  当原有数据量远大于插入数据量时, 建议 INDEX_OPTION 置为 38. PARALLEL 载入数据时,是否开启并行模式。
   开启并行参数后,可以运行多个用户同时向同一张表装载数据,此模式可以充分利用客户端的数据处理能力,
   服务器接收到各个客户端发送过来的数据后,再进行统一的数据处理和刷盘。
若存在以下情况,并行参数不可开启:
 >. 装载表存在二级索引;
 >. 装载表没有自定义的聚集索引;
 >. 装载表开启了逻辑日志或者高级日志;
 >. 装载表为列存储表(HUGE 表)

4. dmfldr使用限制

在这里插入图片描述

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值