DM7數據庫數據快速加載(dmfldr) 詳解
一 概述
1.1 功能
dmfldr(DM Fast Loader)是 DM7 提供的快速數據裝載命令行工具。用戶通過使用 dmfldr 工具能夠把按照一定格式排序的文本數據以簡單、快速、高效的方式載入到 DM數據庫中,或把 DM 數據庫中的數據按照一定格式寫入文本文件。
1.2 架構
如圖所示,dmfldr 實際上除了客戶端工具,還包含一個在 DM7 數據庫服務器中的dmfldr 功能模塊,它們共同完成 dmfldr 的各項功能。
1、當進行數據載入時,dmfldr 客戶端接收用戶提交的命令與參數,分析控制文件與數據文件,將數據打包發送給服務器端的 dmfldr 模塊,由服務器完成數據的真正裝載工作。並分析服務器返回的消息,必要時根據用戶參數指定生成日誌文件與錯誤數據文件。
2、當進行數據導出時,dmfldr 客戶端接收用戶提交的命令與參數,分析控制文件,將用戶要求轉換成相應消息發送給服務器端的 dmfldr 模塊。服務器解析並打包需要導出的數據,發送給 dmfldr 客戶端,客戶端將數據寫入指定的數據文件,必要時根據用戶參數指定生成日誌文件。
二 dmfldr入門
2.1 啓動
安裝好 DM7 數據庫管理系統後,在安裝目錄的“bin”子目錄下可找到 dmfldr 執行文件。
啓動操作系統的命令行窗口,進入“dmfldr”所在目錄,如果配置了環境變量,則可以在任何位置啓動,可以準備啓動 dmfldr 工具了。
dmfldr 的使用必須指定必要的參數,否則工具會報錯“無效的參數個數”並退出。爲dmfldr 指定參數的格式爲:
dmfldr keyword=value [keyword=value ...]
例如:
dmfldr USERID=SYSDBA/SYSDBA CONTROL='c:\fldr.ctl'
如例子所示,USERID 和 CONTROL 是啓動 dmfldr 必須要指定的參數,且 USERID 必須是第一個參數,CONTROL 必須是第二個參數。
2.2 dmfldr語法
dmfldr 使用較爲靈活,參數較多,用戶可以使用“dmfldr help”查看各參數的簡單信息。
dmfldr help
格式: DMFLDR KEYWORD=value
例程: DMFLDR SYSDBA/SYSDBA CONTROL='c:\fldr.ctl'
USERID 必須是命令行中的第一個參數
CONTROL 必須是命令行中的第二個參數
字符串類型參數必須以引號封閉
關鍵字 說明(默認值)
---------------------------------------------------------------------------
USERID 用戶名/口令格式:USER/PWD@SERVER:PORT#SSL_PATH@SSL_PWD
CONTROL 控制文件,字符串類型
LOG 日誌文件,字符串類型 (dfldr.log),不指定默認放在文件位置
BADFILE 錯誤數據記錄文件,字符串類型 (dfldr.bad)
SKIP 初始忽略邏輯行數 (0)
LOAD 需要裝載的行數 (ALL)
ROWS 提交頻次 (50000), DIRECT 爲 FALSE 有效
DIRECT 是否使用快速方式裝載 (TRUE)
SET_IDENTITY 是否插入自增列 (FALSE)
SORTED 數據是否已按照聚集索引排序 (FALSE)
INDEX_OPTION 索引選項 (1)
1 不刷新二級索引,數據按照索引先排序,裝載完後再
將排序的數據插入索引
2 不刷新二級索引,數據裝載完成後重建所有二級索引
ERRORS 允許的最大數據錯誤數 (100)
CHARACTER_CODE 字符編碼,字符串類型 (GBK, UTF-8, SINGLE_BYTE, EUC-KR)
MODE 裝載方式,字符串類型 IN 表示載入,OUT 表示載出,默認爲IN;
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
SILENT 是否靜默方式裝載數據(FALSE)
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)
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)
HELP 打印幫助信息
2.3 控制文件語法
控制文件 CONTROL 是啓動 dmfldr 必須要指定的參數,用於指定數據文件中數據的格式。在數據載入時,dmfldr 根據控制文件指定的格式來解析數據文件;導出數據時,dmfldr 也會根據控制文件指定的列分隔符、行分隔符等生成數據文件。
控制文件中還可以指定其他 dmfldr 參數值。
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> ::=參數
<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> ::= "函數名稱()"
對於上述控制文件語法,需要說明的是:
1、dmfldr 在處理數據文件中換行符時 windows 默認爲 0x0D0A(\r\n),非windows 默認爲 0x0A(\n),用戶應該根據現有的數據文件中的換行符做相應的調整。對應選項爲<row_term_option>,若指定的<value>值爲十六進制的字符串值需要指明[X]選項,<value>值不再需要以 0x 開頭。若沒有指明[X]選項,則<value>值爲指定的字符串;
2、關於列分隔符,用戶應當指定 FIELDS 或者 coldef_option 中的至少一種。若兩者均存在,則以 coldef_option 中的設置爲準,若分隔符指明[X]選項,則表明此分隔符爲十六進制格式的字符串;
3、關於 LIST 選項,INFILE 使用 LIST 選項時,表明實際的數據文件路徑存儲在INFILE 指定的文件中,該文件可以存儲多個實際的數據文件路徑,使用逗號或者換行分割;
4、關於 OPTIONS 選項,該選項支持命令行參數中除 userid,control,help 以外的所有參數的指定,每個參數值對使用空格或者換行分割。對於 option 中出現的參數,在 dmfldr 的指定執行參數中也出現的,dmfldr 會選擇 option 中對應參數的值執行;
5、關於 col_def,FILLER 表示跳過處理數據文件中指定列的值;
6、關於 property_option 選項
A、position(p1:p2):從數據文件中每行數據的第 p1 個字節到第 p2 個字節爲該列值,包含邊界 p1,p2;
B、 position(p1):從數據文件中每行數據的第 p1 個字節開始,到下一個列分
隔符之間的數據爲該列值,包含邊界 p1;
C、position 選項對大字段數據無效,若對大字段類型指定此選項會報錯;
D、NULL:指定的值爲 NULL,忽略數據文件中的值;
property_option 參數僅對導入有效;
7、關於 term_option 選項,該選項用來指定數據文件中指定列的結束標誌。列的結束標誌可以是 WHITESPACE(空格)或者用戶自定義的字符串或十六進制串。指定了 term_option 後,該列不需要用 FIELDS 分隔;
8、關於 enclosed_option 選項,此參數指定封閉符,爲可選參數,默認不存在封閉符。若在 into_table_clause 和 coldef_option 中均設置了封閉符,則以 coldef_option 中的設置爲準,若封閉符前指定[X]選項,則表明此封閉符爲十六進制格式的字符串;
9、分隔符或封閉符字符串的長度均不能超過 255 個字節;
10、關於 constant_option 選項,指定 constant 關鍵字後,數據文件中不需要爲該列準備數據,如果指定了,該列數據將作爲下一字段數據裝載而導致數據混亂。constant 選項對大字段類型無效;
11、關於 fun_option 選項,目前只支持 trim()函數。
三 dmfldr實例
3.1 普通文件(文本文件)
3.1.1 創建測試表
SQL> drop table test;
操作已執行
已用時間: 29.165(毫秒). 執行號:1174.
SQL>
SQL> create table test(c1 int,c2 int,c3 date);
操作已執行
已用時間: 21.497(毫秒). 執行號:1175.
SQL>
3.1.2 創建源數據文件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 創建控制文件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 進行數據載入
[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.
控制文件:
加載行數:全部
每次提交服務器行數:50000
跳過行數:0
允許錯誤數:100
是否直接加載:Yes
是否插入自增列:No
數據是否已按照聚集索引排序:No
字符集:GBK
數據文件共1個:
/home/dmdba/test.txt
錯誤文件:fldr.bad
目標表:TEST
列名 包裝數據類型 終止
C1 CHARACTER |
C2 CHARACTER WHT
C3 yyyy-mm-dd |
行緩衝區數量: 2
任務線程數量: 1
3行記錄已提交
目標表:TEST
3 行加載成功。
由於數據格式錯誤,0行 丟棄。
由於數據錯誤,0行 沒有加載。
跳過的邏輯記錄總數:0
讀取的邏輯記錄總數:3
拒絕的邏輯記錄總數:0
用時:10.231(ms)
從日誌輸出,告訴我們成功導入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(毫秒). 執行號:1178.
SQL>
3.2 大字段數據處理
3.2.1 大字段數據的導出
當 dmfldr 工作在導出模式即 MODE 爲 OUT 時,dmfldr 生成大字段對應的數據文件名由 LOB_FILE_NAME 指定,若未指定默認爲 dmfldr.lob,文件存放於LOB_DIRECTORY 指定的目錄,如果未指定 LOB_DIRECTORY 則存放於指定的導出數據文件同一目錄。
3.2.1.1 創建測試表
SQL> drop table test;
操作已執行
已用時間: 29.165(毫秒). 執行號:1174.
SQL>
SQL> create table test(c1 int,c2 blob,c3 clob);
操作已執行
已用時間: 21.497(毫秒). 執行號:1175.
SQL>
3.2.1.2 插入數據
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(毫秒). 執行號:1184.
SQL>
3.2.1.3 創建控制文件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 進行數據導出
[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
總共導出 2 行數據
用時: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,導出的大字段數據文件將存放在 LOB_DIRECTORY 指定的/opt/data 目錄,文件名爲dmfldr.lob。
3.2.2 DIRECT爲TRUE時大字段數據的載入
當 MODE 爲 IN 且 DIRECT 爲 TRUE 時,此時數據載入若涉及到大字段對象,需要用戶指定大字段數據文件。若 CLIENT_LOB 爲 TRUE,LOB_DIRECTORY 應指定大字段數據文件所在的客戶端本地目錄;若 CLIENT_LOB 爲 FALSE,用戶必須先把相關文件傳送到 DM服務器所在主庫,然後使用 LOB_DIRECTORY 指明存放目錄
大字段數據文件在數據文件中指定,可以是任意格式的文件。在數據文件中,大字段以“文件名:起始偏移:長度”的形式記錄在數據文件中。指定的文件名無效時,dmfldr 會報錯,裝載失敗。對於 CLOB 類型字段,當指定的偏移、長度範圍內帶有不完整字符時,dmfldr 將裝載失敗。
3.2.2.1 創建測試表
SQL> drop table test;
操作已執行
已用時間: 29.165(毫秒). 執行號:1174.
SQL>
SQL> create table test(c1 int,c2 blob,c3 clob);
操作已執行
已用時間: 21.497(毫秒). 執行號:1175.
SQL>
3.2.2.2 創建源數據文件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 字節,存放路徑
爲/home/dmdba。
3.2.2.3 創建控制文件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 進行數據載入
[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.
控制文件:
加載行數:全部
每次提交服務器行數:50000
跳過行數:0
允許錯誤數:100
是否直接加載:Yes
是否插入自增列:No
數據是否已按照聚集索引排序:No
字符集:GBK
數據文件共1個:
/home/dmdba/test.txt
錯誤文件:fldr.bad
目標表:TEST
列名 包裝數據類型 終止
C1 CHARACTER |
C2 CHARACTER |
C3 CHARACTER |
行緩衝區數量: 2
任務線程數量: 1
3行記錄已提交
目標表:TEST
3 行加載成功。
由於數據格式錯誤,0行 丟棄。
由於數據錯誤,0行 沒有加載。
跳過的邏輯記錄總數:0
讀取的邏輯記錄總數:3
拒絕的邏輯記錄總數:3
用時:37.195(ms)
[dmdba@dm3 ~]$
從日誌輸出,告訴我們成功導入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(毫秒). 執行號:1178.
SQL>
3.2.3 DIRECT爲FALSE時大字段數據的載入
當 MODE 爲 IN 且 DIRECT 爲 FALSE 時,數據文件中大字段列數據即字段內容。BLOB_TYPE 參數指定 BLOB 列內容爲十六進制或者字符串:
l BLOB_TYPE 爲 HEX_CHAR 時,數據文件中 BLOB 列當作爲十六進制內容;
l BLOB_TYPE 爲 HEX 時,數據文件中 BLOB 列爲字符串形式內容,導入後會轉換爲十六進制。
BLOB_TYPE 參數只對 DIRECT 爲 FALSE 時有效,默認爲 HEX_CHAR。
3.2.3.1 創建測試表
SQL> drop table test;
操作已執行
已用時間: 29.165(毫秒). 執行號:1174.
SQL>
SQL> create table test(c1 int,c2 blob,c3 clob);
操作已執行
已用時間: 21.497(毫秒). 執行號:1175.
SQL>
3.2.3.2 創建源數據文件test.txt
[dmdba@dm3 ~]$ cat /home/dmdba/test.txt
1|0x12d3c8a7|abcdefg
2|0x12a4cbac|hijlkmn
3|0x22d3c8b3|adefhjd
[dmdba@dm3 ~]$
3.2.3.3 創建控制文件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 進行數據載入
[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.
控制文件:
加載行數:全部
每次提交服務器行數:50000
跳過行數:0
允許錯誤數:100
是否直接加載:No
是否插入自增列:No
數據是否已按照聚集索引排序:No
字符集:GBK
數據文件共1個:
/home/dmdba/test.txt
錯誤文件:fldr.bad
目標表:TEST
列名 包裝數據類型 終止
C1 CHARACTER |
C2 CHARACTER |
C3 CHARACTER |
3 rows processed.
目標表:TEST
3 行加載成功。
由於數據格式錯誤,0行 丟棄。
由於數據錯誤,0行 沒有加載。
跳過的邏輯記錄總數:0
讀取的邏輯記錄總數:3
拒絕的邏輯記錄總數:0
用時:1364.220(ms)
從日誌輸出,告訴我們成功導入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(毫秒). 執行號:1198.
SQL>
對於blog_type爲hex的情形,讀者可以自行測試,方法與上面相同。
四 特殊應用
4.1 文本文件第一行爲列名
SKIP 參數用來設置跳過數據文件起始的邏輯行數,int數值。默認的跳過起始行數爲0 行。
繼續使用之前的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 ~]$
對於此類文件的導入,需要設置跳過文本文件的第一行,設置方法有兩種:
1、通過控制文件
創建控制文件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、在導入時直接指定skip參數
dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' log=\'/home/dmdba/dmfldr_test.log\' skip=1
我們這裏選擇第一種方式:
執行數據導入:
[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.
控制文件:
加載行數:全部
每次提交服務器行數:50000
跳過行數:0
允許錯誤數:100
是否直接加載:Yes
是否插入自增列:No
數據是否已按照聚集索引排序:No
字符集:GBK
數據文件共1個:
/home/dmdba/test.txt
錯誤文件:fldr.bad
目標表:TEST
列名 包裝數據類型 終止
C1 CHARACTER |
C2 CHARACTER WHT
C3 yyyy-mm-dd |
行緩衝區數量: 2
任務線程數量: 1
3行記錄已提交
目標表:TEST
3 行加載成功。
由於數據格式錯誤,0行 丟棄。
由於數據錯誤,0行 沒有加載。
跳過的邏輯記錄總數:0
讀取的邏輯記錄總數:3
拒絕的邏輯記錄總數:0
用時:10.231(ms)
從日誌輸出,告訴我們成功導入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(毫秒). 執行號:1203.
SQL>
4.2 最後一行格式不正確而無法導入
dmfldr 使用的數據文件都是文本格式的,其中的列值都是以字符串的方式保存在數據文件中。要想將這些數據載入數據庫表中,需要將字符串轉換成數據庫表各列對應的數據類型。dmfldr 支持所有 DM 數據庫支持的列定義類型,包括字符串、數值、時間日期、時間
日期間隔、大字段類型等。
若數據文件的編碼方式與 DM 數據庫服務器的編碼方式不一樣,dmfldr 還需要進行字符編碼的轉換。dmfldr 支持 UTF8 和 GBK 編碼之間的相互轉換。
數據類型和編碼轉換工作由 dmfldr 客戶端進行,在這個過程中如果出現錯誤,dmfldr 會跳過該行繼續後面的工作,並記錄錯誤行到 BADFILE 指定的文件。
4.2.1 創建測試表
SQL> drop table test;
操作已執行
已用時間: 29.165(毫秒). 執行號:1174.
SQL>
SQL> create table test(c1 int,c2 int,c3 date);
操作已執行
已用時間: 21.497(毫秒). 執行號:1175.
SQL>
4.2.2 創建源數據文件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 創建控制文件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 進行數據載入
[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.
控制文件:
加載行數:全部
每次提交服務器行數:50000
跳過行數:1
允許錯誤數:100
是否直接加載:Yes
是否插入自增列:No
數據是否已按照聚集索引排序:No
字符集:GBK
數據文件共1個:
/home/dmdba/test.txt
錯誤文件:/home/dmdba/test.bad
目標表:TEST
列名 包裝數據類型 終止
C1 CHARACTER |
C2 CHARACTER WHT
C3 yyyy-mm-dd |
行緩衝區數量: 2
任務線程數量: 1
2行記錄已提交
目標表:TEST
2 行加載成功。
由於數據格式錯誤,0行 丟棄。
由於數據錯誤,1行 沒有加載。
跳過的邏輯記錄總數:1
讀取的邏輯記錄總數:3
拒絕的邏輯記錄總數:1
用時:18.103(ms)
[dmdba@dm3 ~]$
從日誌輸出,告訴我們成功導入3行,跳過1行.
4.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(毫秒). 執行號:1178.
SQL>
4.3 多表裝載
通過在控制文件中指定多個 INTO TABLE 子句,可以將一批數據同時向多個表進行裝載。每個 INTO TABLE 子句中都可以指定 WHEN 過濾條件、FIELDS 子句和列定義子句。對於多表裝載的使用需注意以下幾點:
l 每個 INTO TABLE 子句的目標表必須是不同的表;
l 多表裝載時不支持直接裝載分區表子表;
對於第二個及其之後的 INTO TABLE 子句,在其 coldef_option 中,必須爲第一列指定 POSITION 選項;
4.3.1 創建測試表
SQL> drop table test1;
SQL> drop table test2;
SQL> create table test1(c1 int,c2 int);
操作已執行
已用時間: 11.497(毫秒). 執行號:1209.
SQL> create table test2(c1 int,c2 int);
操作已執行
已用時間: 12.779(毫秒). 執行號:1210.
SQL>
4.3.2 創建源數據文件test.txt
[dmdba@dm3 ~]$ cat /home/dmdba/test.txt
1,2
2,3
3,2
4,8
9,1
[dmdba@dm3 ~]$
4.3.3 創建控制文件test.ctl
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
LOAD DATA
INFILE '/home/dmdba/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
)
[dmdba@dm3 ~]$
4.3.4 使用 dmfldr 進行數據載入
[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.
控制文件:
加載行數:全部
每次提交服務器行數:50000
跳過行數:0
允許錯誤數:100
是否直接加載:Yes
是否插入自增列:No
數據是否已按照聚集索引排序:No
字符集:GBK
數據文件共1個:
/home/dmdba/test.txt
錯誤文件:/home/dmdba/test.bad
目標表:TEST1
列名 包裝數據類型 終止
C1 CHARACTER ,
C2 CHARACTER ,
行緩衝區數量: 2
任務線程數量: 1
數據文件共1個:
/home/dmdba/test.txt
錯誤文件:/home/dmdba/test.bad
目標表:TEST2
列名 包裝數據類型 終止
C1 CHARACTER ,
C2 CHARACTER ,
行緩衝區數量: 2
任務線程數量: 1
1行記錄已提交
4行記錄已提交
目標表:TEST1
4 行加載成功。
由於數據格式錯誤,0行 丟棄。
由於數據錯誤,0行 沒有加載。
跳過的邏輯記錄總數:0
讀取的邏輯記錄總數:5
拒絕的邏輯記錄總數:0
用時:21.305(ms)
目標表:TEST2
1 行加載成功。
由於數據格式錯誤,0行 丟棄。
由於數據錯誤,0行 沒有加載。
跳過的邏輯記錄總數:0
讀取的邏輯記錄總數:5
拒絕的邏輯記錄總數:0
用時:21.305(ms)
從日誌輸出,告訴我們成功導入兩個表的數據.
4.3.5 查詢驗證
SELECT * FROM TEST1;
行號 C1 C2
---------- ----------- -----------
1 2 3
2 3 2
3 4 8
4 9 1
SELECT * FROM TEST2;
行號 C1 C2
---------- ----------- -----------
1 1 2
4.4 控制文件中導入表的三種模式
以下面的控制文件爲例:
[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'
)
控制文件中導入表的模式有三種:append,insert,replace,這個與oracle的sqlloader類似,默認爲append方式,所以上面的控制語句也可以寫爲:
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
LOAD DATA
INFILE '/home/dmdba/test.txt'
APPEND INTO TABLE test
FIELDS '|'
(
c1,
c2 TERMINATED BY ' ',
c3 DATE FORMAT 'yyyy-mm-dd'
)
其它模式與此類似,不再舉例。
4.5 其它注意事項
對於控制文件中的OPTION部分的內容,也可以在dmfldr命令行下直接指定,以日誌文件log爲例:
dmfldr 的日誌文件路徑由 LOG 參數設置,默認日誌文件名爲 fldr.log。文件記錄了裝載過程中的裝載信息和錯誤信息以及統計信息。用戶也可以通過設置控制文件中的OPTION 選項來指定日誌路徑。如果參數及 OPTION 中同時指定了日誌路徑則其將以OPTION 中指定的路徑爲最終路徑。
控制文件中關於 OPTIONS 選項,該選項支持命令行參數中除 userid,control,help 以外的所有參數的指定,每個參數值對使用空格或者換行分割。對於 option 中出現的參數,在 dmfldr 的指定執行參數中也出現的,dmfldr 會選擇 option 中對應參數的值執行;
有如下的控制文件:
[dmdba@dm3 ~]$ cat /home/dmdba/test.ctl
OPTIONS
(
LOG = '/tmp/dmfldr.log'
)
LOAD DATA
INFILE '/home/dmdba/test.txt'
INTO TABLE test
FIELDS '|'
(
c1,
c2 TERMINATED BY ' ',
c3 DATE FORMAT 'yyyy-mm-dd'
)
[dmdba@dm3 ~]$
執行數據載入時也指定log選項:
dmfldr userid=sysdba/SYSDBA control=\'/home/dmdba/test.ctl\' log=\'/home/dmdba/dmfldr_test.log\' badfile=\'/home/dmdba/test.bad\'
此時日誌的生成以控制文件中OPTIONS中指定的路徑爲準!!!