溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

DM7數(shù)據(jù)庫數(shù)據(jù)快速加載(dmfldr) 詳解

發(fā)布時間:2020-05-30 21:50:38 來源:網(wǎng)絡(luò) 閱讀:954 作者:semiter 欄目:數(shù)據(jù)庫

DM7數(shù)據(jù)庫數(shù)據(jù)快速加載(dmfldr) 詳解

一 概述

1.1 功能

dmfldr(DM Fast Loader)是 DM7 提供的快速數(shù)據(jù)裝載命令行工具。用戶通過使用 dmfldr 工具能夠把按照一定格式排序的文本數(shù)據(jù)以簡單、快速、高效的方式載入到 DM數(shù)據(jù)庫中,或把 DM 數(shù)據(jù)庫中的數(shù)據(jù)按照一定格式寫入文本文件。

1.2 架構(gòu)

DM7數(shù)據(jù)庫數(shù)據(jù)快速加載(dmfldr) 詳解

如圖所示,dmfldr 實際上除了客戶端工具,還包含一個在 DM7 數(shù)據(jù)庫服務(wù)器中的dmfldr 功能模塊,它們共同完成 dmfldr 的各項功能。

1、當(dāng)進(jìn)行數(shù)據(jù)載入時,dmfldr 客戶端接收用戶提交的命令與參數(shù),分析控制文件與數(shù)據(jù)文件,將數(shù)據(jù)打包發(fā)送給服務(wù)器端的 dmfldr 模塊,由服務(wù)器完成數(shù)據(jù)的真正裝載工作。并分析服務(wù)器返回的消息,必要時根據(jù)用戶參數(shù)指定生成日志文件與錯誤數(shù)據(jù)文件。

2、當(dāng)進(jìn)行數(shù)據(jù)導(dǎo)出時,dmfldr 客戶端接收用戶提交的命令與參數(shù),分析控制文件,將用戶要求轉(zhuǎn)換成相應(yīng)消息發(fā)送給服務(wù)器端的 dmfldr 模塊。服務(wù)器解析并打包需要導(dǎo)出的數(shù)據(jù),發(fā)送給 dmfldr 客戶端,客戶端將數(shù)據(jù)寫入指定的數(shù)據(jù)文件,必要時根據(jù)用戶參數(shù)指定生成日志文件。

二 dmfldr入門

2.1 啟動

安裝好 DM7 數(shù)據(jù)庫管理系統(tǒng)后,在安裝目錄的“bin”子目錄下可找到 dmfldr 執(zhí)行文件。

啟動操作系統(tǒng)的命令行窗口,進(jìn)入“dmfldr”所在目錄,如果配置了環(huán)境變量,則可以在任何位置啟動,可以準(zhǔn)備啟動 dmfldr 工具了。

dmfldr 的使用必須指定必要的參數(shù),否則工具會報錯“無效的參數(shù)個數(shù)”并退出。為dmfldr 指定參數(shù)的格式為:

dmfldr keyword=value [keyword=value ...]

例如:

dmfldr USERID=SYSDBA/SYSDBA CONTROL='c:\fldr.ctl'

如例子所示,USERID 和 CONTROL 是啟動 dmfldr 必須要指定的參數(shù),且 USERID 必須是第一個參數(shù),CONTROL 必須是第二個參數(shù)

2.2 dmfldr語法

dmfldr 使用較為靈活,參數(shù)較多,用戶可以使用“dmfldr help”查看各參數(shù)的簡單信息。

dmfldr help

格式: DMFLDR KEYWORD=value

例程: DMFLDR SYSDBA/SYSDBA CONTROL='c:\fldr.ctl'

USERID 必須是命令行中的第一個參數(shù)

CONTROL 必須是命令行中的第二個參數(shù)

?

字符串類型參數(shù)必須以引號封閉

關(guān)鍵字 說明(默認(rèn)值)

---------------------------------------------------------------------------

USERID 用戶名/口令格式:USER/PWD@SERVER:PORT#SSL_PATH@SSL_PWD

CONTROL 控制文件,字符串類型

LOG 日志文件,字符串類型 (dfldr.log),不指定默認(rèn)放在文件位置

BADFILE 錯誤數(shù)據(jù)記錄文件,字符串類型 (dfldr.bad)

SKIP 初始忽略邏輯行數(shù) (0)

LOAD 需要裝載的行數(shù) (ALL)

ROWS 提交頻次 (50000), DIRECT 為 FALSE 有效

DIRECT 是否使用快速方式裝載 (TRUE)

SET_IDENTITY 是否插入自增列 (FALSE)

SORTED 數(shù)據(jù)是否已按照聚集索引排序 (FALSE)

INDEX_OPTION 索引選項 (1)

1 不刷新二級索引,數(shù)據(jù)按照索引先排序,裝載完后再

將排序的數(shù)據(jù)插入索引

2 不刷新二級索引,數(shù)據(jù)裝載完成后重建所有二級索引

ERRORS 允許的最大數(shù)據(jù)錯誤數(shù) (100)

CHARACTER_CODE 字符編碼,字符串類型 (GBK, UTF-8, SINGLE_BYTE, EUC-KR)

MODE 裝載方式,字符串類型 IN 表示載入,OUT 表示載出,默認(rèn)為IN;

OUTORA 表示載出 ORACLE (IN)

CLIENT_LOB 大字段目錄是否在本地 (FALSE)

LOB_DIRECTORY 大字段數(shù)據(jù)文件存放目錄

LOB_FILE_NAME 大字段數(shù)據(jù)文件名稱,僅導(dǎo)出有效 (dmfldr.lob)

BUFFER_NODE_SIZE 讀入文件緩沖區(qū)的大小 (10),有效值范圍 1~2048

READ_ROWS 工作線程一次最大處理的行數(shù) (100000),最大支持 2^26-10000

SILENT 是否靜默方式裝載數(shù)據(jù)(FALSE)

NULL_MODE 載入時 NULL 字符串是否處理為 NULL

載出時空值是否處理為 NULL 字符串 (FALSE)

NULL_STR 載入時視為 NULL 值處理的字符串

SEND_NODE_NUMBER 運行時發(fā)送節(jié)點的個數(shù) (20),有效值范圍 16~65535

TASK_THREAD_NUMBER 處理用戶數(shù)據(jù)的線程數(shù)目,默認(rèn)與處理器核數(shù)量相同,有效值范圍 1~128

BLDR_NUM 服務(wù)器 BLDR 數(shù)目 (64),有效值范圍 1~1024

BDTA_SIZE bdta 的大小 (5000),有效值范圍 100~10000

COMPRESS_FLAG 是否壓縮 bdta (FALSE)

MPP_CLIENT mpp 環(huán)境,是否本地分發(fā) (TRUE)

BLOB_TYPE BLOB 類型字段數(shù)據(jù)值的實際類型,字符串類型 (HEX_CHAR)

HEX 表示值為十六進(jìn)制,HEX_CHAR 表示值為十六進(jìn)制字符類型

僅在 direct=FALSE 有效

OCI_DIRECTORY OCI 動態(tài)庫所在的目錄

DATA 指定數(shù)據(jù)文件路徑

ENABLE_CLASS_TYPE 允許用戶導(dǎo)入 CLASS 類型數(shù)據(jù) (FALSE)

FLUSH_FLAG 提交時是否立即刷盤 (FALSE)

IGNORE_BATCH_ERRORS 是否忽略錯誤數(shù)據(jù)繼續(xù)導(dǎo)入 (FALSE)

SINGLE_HLDR_HP 是否使用單個 HLDR 裝載 HUGE 水平分區(qū)表 (FALSE)

HELP 打印幫助信息

2.3 ?控制文件語法

控制文件 CONTROL 是啟動 dmfldr 必須要指定的參數(shù),用于指定數(shù)據(jù)文件中數(shù)據(jù)的格式。在數(shù)據(jù)載入時,dmfldr 根據(jù)控制文件指定的格式來解析數(shù)據(jù)文件;導(dǎo)出數(shù)據(jù)時,dmfldr 也會根據(jù)控制文件指定的列分隔符、行分隔符等生成數(shù)據(jù)文件。

控制文件中還可以指定其他 dmfldr 參數(shù)值。

dmfldr 控制文件的語法如下所示:

[OPTIONS(

<id>=<value>

……

)]

LOAD [DATA]

INFILE [LIST] <path_name> [<row_term_option>] [,<path_name>

[<row_term_option>]]

[BADFILE <path_name>]

[APPEND|REPLACE|INSERT]

<into_table_clause>

INTO TABLE [<schema>.]<tablename>

[FIELDS <delimiter>]

[<coldef_option>]

<id> ::=參數(shù)

<value> ::=

<path_name> ::=文件地址

<path_name_list> ::=含文件列表文件地址

<row_term_option> ::=STR [X] <delimiter>

<into_table_clause> ::= <into_table_single>{<into_table_single>}

<into_table_single> ::=INTO TABLE [<schema>.]<tablename>

[WHEN <field_conditions>]

[FIELDS [TERMINATED BY] [X] <delimiter>]

[<enclosed_option>]

[<coldef_option>]

<schema> ::=模式名

<tablename> ::=表名

<field_conditions> ::= <field_condition>{ AND <field_condition>}

< field_condition> ::= [(] <cmp_exp><cmp_ops><cmp_data>[)]

<cmp_exp> ::= <colid> | (p1:p2)

<cmp_ops> ::= = | <> | !=

<cmd_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> ::= "函數(shù)名稱()"

對于上述控制文件語法,需要說明的是:

? 1、dmfldr 在處理數(shù)據(jù)文件中換行符時 windows 默認(rèn)為 0x0D0A(\r\n),非windows 默認(rèn)為 0x0A(\n),用戶應(yīng)該根據(jù)現(xiàn)有的數(shù)據(jù)文件中的換行符做相應(yīng)的調(diào)整。對應(yīng)選項為<row_term_option>,若指定的<value>值為十六進(jìn)制的字符串值需要指明[X]選項,<value>值不再需要以 0x 開頭。若沒有指明[X]選項,則<value>值為指定的字符串;

? 2、關(guān)于列分隔符,用戶應(yīng)當(dāng)指定 FIELDS 或者 coldef_option 中的至少一種。若兩者均存在,則以 coldef_option 中的設(shè)置為準(zhǔn),若分隔符指明[X]選項,則表明此分隔符為十六進(jìn)制格式的字符串;

? 3、關(guān)于 LIST 選項,INFILE 使用 LIST 選項時,表明實際的數(shù)據(jù)文件路徑存儲在INFILE 指定的文件中,該文件可以存儲多個實際的數(shù)據(jù)文件路徑,使用逗號或者換行分割;

? 4、關(guān)于 OPTIONS 選項,該選項支持命令行參數(shù)中除 userid,control,help 以外的所有參數(shù)的指定,每個參數(shù)值對使用空格或者換行分割。對于 option 中出現(xiàn)的參數(shù),在 dmfldr 的指定執(zhí)行參數(shù)中也出現(xiàn)的,dmfldr 會選擇 option 中對應(yīng)參數(shù)的值執(zhí)行;

? 5、關(guān)于 col_def,F(xiàn)ILLER 表示跳過處理數(shù)據(jù)文件中指定列的值;

? 6、關(guān)于 property_option 選項

? A、position(p1:p2):從數(shù)據(jù)文件中每行數(shù)據(jù)的第 p1 個字節(jié)到第 p2 個字節(jié)為該列值,包含邊界 p1,p2;

? B、 position(p1):從數(shù)據(jù)文件中每行數(shù)據(jù)的第 p1 個字節(jié)開始,到下一個列分

隔符之間的數(shù)據(jù)為該列值,包含邊界 p1;

? C、position 選項對大字段數(shù)據(jù)無效,若對大字段類型指定此選項會報錯;

? D、NULL:指定的值為 NULL,忽略數(shù)據(jù)文件中的值;

property_option 參數(shù)僅對導(dǎo)入有效;

? 7、關(guān)于 term_option 選項,該選項用來指定數(shù)據(jù)文件中指定列的結(jié)束標(biāo)志。列的結(jié)束標(biāo)志可以是 WHITESPACE(空格)或者用戶自定義的字符串或十六進(jìn)制串。指定了 term_option 后,該列不需要用 FIELDS 分隔;

? 8、關(guān)于 enclosed_option 選項,此參數(shù)指定封閉符,為可選參數(shù),默認(rèn)不存在封閉符。若在 into_table_clause 和 coldef_option 中均設(shè)置了封閉符,則以 coldef_option 中的設(shè)置為準(zhǔn),若封閉符前指定[X]選項,則表明此封閉符為十六進(jìn)制格式的字符串;

? 9、分隔符或封閉符字符串的長度均不能超過 255 個字節(jié);

? 10、關(guān)于 constant_option 選項,指定 constant 關(guān)鍵字后,數(shù)據(jù)文件中不需要為該列準(zhǔn)備數(shù)據(jù),如果指定了,該列數(shù)據(jù)將作為下一字段數(shù)據(jù)裝載而導(dǎo)致數(shù)據(jù)混亂。constant 選項對大字段類型無效;

? 11、關(guān)于 fun_option 選項,目前只支持 trim()函數(shù)。

三 dmfldr實例

3.1 普通文件(文本文件)

3.1.1 創(chuàng)建測試表

SQL> drop table test;

操作已執(zhí)行

已用時間: 29.165(毫秒). 執(zhí)行號:1174.

SQL>

?

SQL> create table test(c1 int,c2 int,c3 date);

操作已執(zhí)行

已用時間: 21.497(毫秒). 執(zhí)行號:1175.

SQL>

3.1.2 創(chuàng)建源數(shù)據(jù)文件test.txt

[dmdba@dm3 ~]$ cat /home/dmdba/test.txt

1|1 2019-09-22

2|2 2019-09-22

3|3 2019-09-22

[dmdba@dm3 ~]$

3.1.3 創(chuàng)建控制文件test.ctl

[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl

LOAD DATA

INFILE '/home/dmdba/test.txt'

INTO TABLE test

FIELDS '|'

(

c1,

c2 TERMINATED BY ' ',

c3 DATE FORMAT 'yyyy-mm-dd'

)

[dmdba@dm3 ~]$

3.1.4 使用 dmfldr 進(jìn)行數(shù)據(jù)載入

[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' log=\'/home/dmdba/dmfldr_test.log\'

dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT

dmfldr:

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

控制文件:

加載行數(shù):全部

每次提交服務(wù)器行數(shù):50000

跳過行數(shù):0

允許錯誤數(shù):100

是否直接加載:Yes

是否插入自增列:No

數(shù)據(jù)是否已按照聚集索引排序:No

字符集:GBK

?

數(shù)據(jù)文件共1個:

/home/dmdba/test.txt

錯誤文件:fldr.bad

目標(biāo)表:TEST

列名???? 包裝數(shù)據(jù)類型?? 終止

C1?????? CHARACTER?????? |

C2?????? CHARACTER?????? WHT

C3?????? yyyy-mm-dd????? |

行緩沖區(qū)數(shù)量: 2

任務(wù)線程數(shù)量: 1

?

3行記錄已提交

?

目標(biāo)表:TEST

3 行加載成功。

由于數(shù)據(jù)格式錯誤,0行 丟棄。

由于數(shù)據(jù)錯誤,0行 沒有加載。

?

跳過的邏輯記錄總數(shù):0

讀取的邏輯記錄總數(shù):3

拒絕的邏輯記錄總數(shù):0

?

用時:10.231(ms)

從日志輸出,告訴我們成功導(dǎo)入3行.

3.1.5 查詢驗證

SQL> select * from test;

?

行號???? c1????????? c2????????? c3

---------- ----------- ----------- ----------

1????????? 1?????????? 1?????????? 2019-09-22

2????????? 2?????????? 2?????????? 2019-09-22

3????????? 3?????????? 3?????????? 2019-09-22

?

已用時間: 10.354(毫秒). 執(zhí)行號:1178.

SQL>

3.2 大字段數(shù)據(jù)處理

3.2.1 大字段數(shù)據(jù)的導(dǎo)出

當(dāng) dmfldr 工作在導(dǎo)出模式即 MODE 為 OUT 時,dmfldr 生成大字段對應(yīng)的數(shù)據(jù)文件名由 LOB_FILE_NAME 指定,若未指定默認(rèn)為 dmfldr.lob,文件存放于LOB_DIRECTORY 指定的目錄,如果未指定 LOB_DIRECTORY 則存放于指定的導(dǎo)出數(shù)據(jù)文件同一目錄。

3.2.1.1 創(chuàng)建測試表

SQL> drop table test;

操作已執(zhí)行

已用時間: 29.165(毫秒). 執(zhí)行號:1174.

SQL>

?

SQL> create table test(c1 int,c2 blob,c3 clob);

操作已執(zhí)行

已用時間: 21.497(毫秒). 執(zhí)行號:1175.

SQL>

3.2.1.2 插入數(shù)據(jù)

INSERT INTO TEST VALUES(1,0XAB121032DE,'abcdefg');

INSERT INTO TEST VALUES(2,0XAB121032DE,'abcdefg');

COMMIT;

SQL> select * from test;

行號???? c1????????? c2?????????? c3

---------- ----------- ------------ -------

1????????? 1?????????? 0xAB121032DE abcdefg

2????????? 2?????????? 0xAB121032DE abcdefg

已用時間: 0.489(毫秒). 執(zhí)行號:1184.

SQL>

3.2.1.3 創(chuàng)建控制文件test.ctl

[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl

LOAD DATA

INFILE '/home/dmdba/test.txt'

INTO TABLE test

FIELDS '|'

(

c1,

c2,

c3

)

[dmdba@dm3 ~]$

3.2.1.4 使用 dmfldr 進(jìn)行數(shù)據(jù)導(dǎo)出

[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' lob_directory=\'/home/dmdba\' mode=\'out\' log=\'/home/dmdba/dmfldr_test.log\'

dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT

2 rows is load out

總共導(dǎo)出 2 行數(shù)據(jù)

用時:199.145(ms)

?

[dmdba@dm3 ~]$

3.2.1.5 驗證

[dmdba@dm3 ~]$ cat test.txt

1|dmfldr.lob:0:5 dmfldr.lob:5:7

2|dmfldr.lob:12:5 dmfldr.lob:17:7

[dmdba@dm3 ~]$

[dmdba@dm3 ~]$ ls

dmfldr_test.log??? test.ctl? 公共的? 視頻? 文檔? 音樂? dmfldr.lob?????????????????????????????????? test.txt? 模板??? 圖片? 下載? 桌面

[dmdba@dm3 ~]$

?

在這個例子中,指定了 LOB_DIRECTORY,而沒有指定 LOB_FILE_NAME,導(dǎo)出的大字段數(shù)據(jù)文件將存放在 LOB_DIRECTORY 指定的/opt/data 目錄,文件名為dmfldr.lob。

?

3.2.2 DIRECT為TRUE時大字段數(shù)據(jù)的載入

當(dāng) MODE 為 IN 且 DIRECT 為 TRUE 時,此時數(shù)據(jù)載入若涉及到大字段對象,需要用戶指定大字段數(shù)據(jù)文件。若 CLIENT_LOB 為 TRUE,LOB_DIRECTORY 應(yīng)指定大字段數(shù)據(jù)文件所在的客戶端本地目錄;若 CLIENT_LOB 為 FALSE,用戶必須先把相關(guān)文件傳送到 DM服務(wù)器所在主庫,然后使用 LOB_DIRECTORY 指明存放目錄

大字段數(shù)據(jù)文件在數(shù)據(jù)文件中指定,可以是任意格式的文件。在數(shù)據(jù)文件中,大字段以“文件名:起始偏移:長度”的形式記錄在數(shù)據(jù)文件中。指定的文件名無效時,dmfldr 會報錯,裝載失敗。對于 CLOB 類型字段,當(dāng)指定的偏移、長度范圍內(nèi)帶有不完整字符時,dmfldr 將裝載失敗。

3.2.2.1 創(chuàng)建測試表

SQL> drop table test;

操作已執(zhí)行

已用時間: 29.165(毫秒). 執(zhí)行號:1174.

SQL>

?

SQL> create table test(c1 int,c2 blob,c3 clob);

操作已執(zhí)行

已用時間: 21.497(毫秒). 執(zhí)行號:1175.

SQL>

3.2.2.2 創(chuàng)建源數(shù)據(jù)文件test.txt

[dmdba@dm3 ~]$ cat /home/dmdba/test.txt

1|testblob.txt:0:1|testclob.txt:0:1

2|testblob.txt:1:2|testclob.txt:1:2

3|testblob.txt:2:3|testclob.txt:2:3

[dmdba@dm3 ~]$

其中testblob.txt、testclob.txt 為文本文件,長度大于 3 字節(jié),存放路徑

為/home/dmdba。

3.2.2.3 創(chuàng)建控制文件test.ctl

[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl

LOAD DATA

INFILE '/home/dmdba/test.txt'

INTO TABLE test

FIELDS '|'

(

c1,

c2,

c3

)

[dmdba@dm3 ~]$

3.2.2.4 使用 dmfldr 進(jìn)行數(shù)據(jù)載入

[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' lob_directory=\'/home/dmdba\' log=\'/home/dmdba/dmfldr_test.log\'

dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT

dmfldr:

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

控制文件:

加載行數(shù):全部

每次提交服務(wù)器行數(shù):50000

跳過行數(shù):0

允許錯誤數(shù):100

是否直接加載:Yes

是否插入自增列:No

數(shù)據(jù)是否已按照聚集索引排序:No

字符集:GBK

?

數(shù)據(jù)文件共1個:

/home/dmdba/test.txt

錯誤文件:fldr.bad

目標(biāo)表:TEST

列名?? 包裝數(shù)據(jù)類型?? 終止

C1???? CHARACTER?????? |

C2???? CHARACTER?????? |

C3???? CHARACTER?????? |

行緩沖區(qū)數(shù)量: 2

任務(wù)線程數(shù)量: 1

3行記錄已提交

目標(biāo)表:TEST

3 行加載成功。

由于數(shù)據(jù)格式錯誤,0行 丟棄。

由于數(shù)據(jù)錯誤,0行 沒有加載。

跳過的邏輯記錄總數(shù):0

讀取的邏輯記錄總數(shù):3

拒絕的邏輯記錄總數(shù):3

用時:37.195(ms)

[dmdba@dm3 ~]$

從日志輸出,告訴我們成功導(dǎo)入3行.

3.2.2.5 查詢驗證

SQL> select * from test;

?

行號???? c1????????? c2????????? c3

---------- ----------- ----------- ----------

1????????? 1?????????? 1?????????? 2019-09-22

2????????? 2?????????? 2?????????? 2019-09-22

3????????? 3?????????? 3?????????? 2019-09-22

?

已用時間: 10.354(毫秒). 執(zhí)行號:1178.

SQL>

3.2.3 DIRECT為FALSE時大字段數(shù)據(jù)的載入

當(dāng) MODE 為 IN 且 DIRECT 為 FALSE 時,數(shù)據(jù)文件中大字段列數(shù)據(jù)即字段內(nèi)容。BLOB_TYPE 參數(shù)指定 BLOB 列內(nèi)容為十六進(jìn)制或者字符串:

l? BLOB_TYPE 為 HEX_CHAR 時,數(shù)據(jù)文件中 BLOB 列當(dāng)作為十六進(jìn)制內(nèi)容;

l? BLOB_TYPE 為 HEX 時,數(shù)據(jù)文件中 BLOB 列為字符串形式內(nèi)容,導(dǎo)入后會轉(zhuǎn)換為十六進(jìn)制。

BLOB_TYPE 參數(shù)只對 DIRECT 為 FALSE 時有效,默認(rèn)為 HEX_CHAR。

3.2.3.1 創(chuàng)建測試表

SQL> drop table test;

操作已執(zhí)行

已用時間: 29.165(毫秒). 執(zhí)行號:1174.

SQL>

?

SQL> create table test(c1 int,c2 blob,c3 clob);

操作已執(zhí)行

已用時間: 21.497(毫秒). 執(zhí)行號:1175.

SQL>

3.2.3.2 創(chuàng)建源數(shù)據(jù)文件test.txt

[dmdba@dm3 ~]$ cat /home/dmdba/test.txt

1|0x12d3c8a7|abcdefg

2|0x12a4cbac|hijlkmn

3|0x22d3c8b3|adefhjd

[dmdba@dm3 ~]$

3.2.3.3 創(chuàng)建控制文件test.ctl

[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl

LOAD DATA

INFILE '/home/dmdba/test.txt'

INTO TABLE test

FIELDS '|'

(

c1,

c2,

c3

)

[dmdba@dm3 ~]$

3.2.3.4 使用 dmfldr 進(jìn)行數(shù)據(jù)載入

[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' direct=false blob_type=\'hex_char\' log=\'/home/dmdba/dmfldr_test.log\'

dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT

dmfldr:

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

控制文件:

加載行數(shù):全部

每次提交服務(wù)器行數(shù):50000

跳過行數(shù):0

允許錯誤數(shù):100

是否直接加載:No

是否插入自增列:No

數(shù)據(jù)是否已按照聚集索引排序:No

字符集:GBK

?

數(shù)據(jù)文件共1個:

/home/dmdba/test.txt

錯誤文件:fldr.bad

?

目標(biāo)表:TEST

列名? 包裝數(shù)據(jù)類型?? 終止

C1??? CHARACTER?????? |

C2??? CHARACTER?????? |

C3??? CHARACTER?????? |

?

3 rows processed.

?

目標(biāo)表:TEST

3 行加載成功。

由于數(shù)據(jù)格式錯誤,0行 丟棄。

由于數(shù)據(jù)錯誤,0行 沒有加載。

?

跳過的邏輯記錄總數(shù):0

讀取的邏輯記錄總數(shù):3

拒絕的邏輯記錄總數(shù):0

?

用時:1364.220(ms)

從日志輸出,告訴我們成功導(dǎo)入3行.

3.2.3.5 查詢驗證

SQL> select * from test;

行號???? c1????????? c2???????? c3

---------- ----------- ---------- -------

1????????? 1?????????? 0x12D3C8A7 abcdefg

2????????? 2?????????? 0x12A4CBAC hijlkmn

3????????? 3?????????? 0x22D3C8B3 adefhjd

已用時間: 25.011(毫秒). 執(zhí)行號:1198.

SQL>

對于blog_type為hex的情形,讀者可以自行測試,方法與上面相同。

四 特殊應(yīng)用

4.1 文本文件第一行為列名

SKIP 參數(shù)用來設(shè)置跳過數(shù)據(jù)文件起始的邏輯行數(shù),int數(shù)值。默認(rèn)的跳過起始行數(shù)為0 行。

繼續(xù)使用之前的test.txt文件,修改文件如下:

[dmdba@dm3 ~]$ cat /home/dmdba/test.txt

col1 col2 col3

1|1 2019-09-22

2|2 2019-09-22

3|3 2019-09-22

[dmdba@dm3 ~]$

對于此類文件的導(dǎo)入,需要設(shè)置跳過文本文件的第一行,設(shè)置方法有兩種:

1、通過控制文件

?? 創(chuàng)建控制文件test.ctl:

[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl

OPTIONS

(

?SKIP = 1

)

LOAD DATA

INFILE '/home/dmdba/test.txt'

INTO TABLE test

FIELDS '|'

(

c1,

c2 TERMINATED BY ' ',

c3 DATE FORMAT 'yyyy-mm-dd'

)

[dmdba@dm3 ~]$

2、在導(dǎo)入時直接指定skip參數(shù)

dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' log=\'/home/dmdba/dmfldr_test.log\' skip=1

我們這里選擇第一種方式:

執(zhí)行數(shù)據(jù)導(dǎo)入:

[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' log=\'/home/dmdba/dmfldr_test.log\'

dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT

dmfldr:

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

控制文件:

加載行數(shù):全部

每次提交服務(wù)器行數(shù):50000

跳過行數(shù):0

允許錯誤數(shù):100

是否直接加載:Yes

是否插入自增列:No

數(shù)據(jù)是否已按照聚集索引排序:No

字符集:GBK

?

數(shù)據(jù)文件共1個:

/home/dmdba/test.txt

錯誤文件:fldr.bad

目標(biāo)表:TEST

列名???? 包裝數(shù)據(jù)類型?? 終止

C1?????? CHARACTER?????? |

C2?????? CHARACTER?????? WHT

C3?????? yyyy-mm-dd????? |

行緩沖區(qū)數(shù)量: 2

任務(wù)線程數(shù)量: 1

?

3行記錄已提交

?

目標(biāo)表:TEST

3 行加載成功。

由于數(shù)據(jù)格式錯誤,0行 丟棄。

由于數(shù)據(jù)錯誤,0行 沒有加載。

?

跳過的邏輯記錄總數(shù):0

讀取的邏輯記錄總數(shù):3

拒絕的邏輯記錄總數(shù):0

?

用時:10.231(ms)

從日志輸出,告訴我們成功導(dǎo)入3行.

?

驗證:

SQL> select * from test;

行號???? c1????????? c2????????? c3

---------- ----------- ----------- ----------

1????????? 1?????????? 1?????????? 2019-09-22

2????????? 2?????????? 2?????????? 2019-09-22

3????????? 3?????????? 3?????????? 2019-09-22

已用時間: 0.721(毫秒). 執(zhí)行號:1203.

SQL>

4.2 最后一行格式不正確而無法導(dǎo)入

dmfldr 使用的數(shù)據(jù)文件都是文本格式的,其中的列值都是以字符串的方式保存在數(shù)據(jù)文件中。要想將這些數(shù)據(jù)載入數(shù)據(jù)庫表中,需要將字符串轉(zhuǎn)換成數(shù)據(jù)庫表各列對應(yīng)的數(shù)據(jù)類型。dmfldr 支持所有 DM 數(shù)據(jù)庫支持的列定義類型,包括字符串、數(shù)值、時間日期、時間

日期間隔、大字段類型等。

若數(shù)據(jù)文件的編碼方式與 DM 數(shù)據(jù)庫服務(wù)器的編碼方式不一樣,dmfldr 還需要進(jìn)行字符編碼的轉(zhuǎn)換。dmfldr 支持 UTF8 和 GBK 編碼之間的相互轉(zhuǎn)換。

數(shù)據(jù)類型和編碼轉(zhuǎn)換工作由 dmfldr 客戶端進(jìn)行,在這個過程中如果出現(xiàn)錯誤,dmfldr 會跳過該行繼續(xù)后面的工作,并記錄錯誤行到 BADFILE 指定的文件。

4.2.1 創(chuàng)建測試表

SQL> drop table test;

操作已執(zhí)行

已用時間: 29.165(毫秒). 執(zhí)行號:1174.

SQL>

?

SQL> create table test(c1 int,c2 int,c3 date);

操作已執(zhí)行

已用時間: 21.497(毫秒). 執(zhí)行號:1175.

SQL>

4.2.2 創(chuàng)建源數(shù)據(jù)文件test.txt

[dmdba@dm3 ~]$ cat /home/dmdba/test.txt

1|1 2019-09-22

2|2 2019-09-22

3|3 2019-09-22

4|4 yyyy-mm-dd

[dmdba@dm3 ~]$

4.2.3 創(chuàng)建控制文件test.ctl

[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl

LOAD DATA

INFILE '/home/dmdba/test.txt'

INTO TABLE test

FIELDS '|'

(

c1,

c2 TERMINATED BY ' ',

c3 DATE FORMAT 'yyyy-mm-dd'

)

[dmdba@dm3 ~]$

4.2.4 使用 dmfldr 進(jìn)行數(shù)據(jù)載入

[dmdba@dm3 ~]$ dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' log=\'/home/dmdba/dmfldr_test.log\' badfile=\'/home/dmdba/test.bad\'

dmfldr V7.6.0.171-Build(2019.07.02-109059)ENT

dmfldr:

?

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

?

控制文件:

加載行數(shù):全部

每次提交服務(wù)器行數(shù):50000

跳過行數(shù):1

允許錯誤數(shù):100

是否直接加載:Yes

是否插入自增列:No

數(shù)據(jù)是否已按照聚集索引排序:No

字符集:GBK

?

數(shù)據(jù)文件共1個:

/home/dmdba/test.txt

錯誤文件:/home/dmdba/test.bad

目標(biāo)表:TEST

列名??? 包裝數(shù)據(jù)類型?? 終止

C1????? CHARACTER?????? |

C2????? CHARACTER?????? WHT

C3????? yyyy-mm-dd????? |

?

行緩沖區(qū)數(shù)量: 2

任務(wù)線程數(shù)量: 1

?

2行記錄已提交

?

目標(biāo)表:TEST

2 行加載成功。

由于數(shù)據(jù)格式錯誤,0行 丟棄。

由于數(shù)據(jù)錯誤,1行 沒有加載。

?

跳過的邏輯記錄總數(shù):1

讀取的邏輯記錄總數(shù):3

拒絕的邏輯記錄總數(shù):1

?

用時:18.103(ms)

?

[dmdba@dm3 ~]$

從日志輸出,告訴我們成功導(dǎo)入3行,跳過1行.

4.2.5 查詢驗證

SQL> select * from test;

?

行號???? c1????????? c2????????? c3

---------- ----------- ---------

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI