達夢數據庫dmfldr快速裝載工具的使用

       在達夢數據庫中,有幾種常用的數據遷移工具。1.DTS  2.DEXP  3.DMETL  4.DMHS  5.DMFLDR

       在進行數據遷移時,需根據不同情況選擇不同的遷移工具。dmfldr適合數據量特別巨大的情況,且性能相比其他工具更好,但是功能性方面較差。本文主要介紹如何使用dmfldr快速裝載工具進行DM數據庫中表數據的快速載入和導出。 

1 概述

1.1功能簡介

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

1.2系統結構

       dmfldr的系統結構如下圖所示。

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

  1. 當進行數據載入時,dmfldr客戶端接收用戶提交的命令與參數,分析控制文件與數據文件,將數據打包發送給服務器端的dmfldr模塊,由服務器完成數據的真正裝載工作。並分析服務器返回的消息,必要時根據用戶參數指定生成日誌文件與錯誤數據文件。
  2. 當進行數據導出時,dmfldr客戶端接收用戶提交的命令與參數,分析控制文件,將用戶要求轉換成相應消息發送給服務器端的dmfldr模塊。服務器解析並打包需要導出的數據,發送給dmfldr客戶端,客戶端將數據寫入指定的數據文件,必要時根據用戶參數指定生成日誌文件。  

2 dmfldr入門

2.1啓動dmfldr 

       安裝好 DM7 數據庫管理系統後,在安裝目錄的“bin”子目錄下可找到 dmfldr 執行文件。

       啓動操作系統的命令行窗口,進入“dmfldr”所在目錄,如果配置了環境變量,則可以在任何位置啓動,可以準備啓動 dmfldr 工具了。

       dmfldr 的使用必須指定必要的參數,否則工具會報錯“無效的參數個數”並退出。爲dmfldr指定參數的格式爲:

       dmfldrkeyword=value [keyword=value ...]

       例如:

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

       如例子所示,USERID 和CONTROL 是啓動 dmfldr 必須要指定的參數,且 USERID 必須是第一個參數,CONTROL 必須是第二個參數。

2.2查看dmfldr參數

       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                                                                 打印幫助信息 

3 dmfldr實戰

3.1 dmfldr控制文件

       控制文件CONTROL是啓動dmfldr必須要指定的參數,用於指定數據文件中數據的格式。在數據載入時,dmfldr根據控制文件指定的格式來解析數據文件;導出數據時,dmfldr也會根據控制文件指定的列分隔符、行分隔符等生成數據文件。 

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

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

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

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

  • dmfldr在處理數據文件中換行符時windows默認爲0x0D0A(\r\n),非windows默認爲0x0A(\n),用戶應該根據現有的數據文件中的換行符做相應的調整。對應選項爲<row_term_option>,若指定的<value>值爲十六進制的字符串值需要指明[X]選項,<value>值不再需要以0x開頭。若沒有指明[X]選項,則<value>值爲指定的字符串; 
  • 關於列分隔符,用戶應當指定FIELDS或者coldef_option中的至少一種。若兩者均存在,則以coldef_option中的設置爲準,若分隔符指明[X]選項,則表明此分隔符爲十六進制格式的字符串;
  • 關於file_option,用來指定單個文件; 
  • 關於directory_option,用來指定整個文件夾。指定此選項後,dmfldr會自動掃描指定文件夾下的所有文件,這些文件數據將被導入到服務器; 
  • 關於LIST選項,INFILE使用LIST選項時,表明實際的數據文件路徑存儲在INFILE指定的文件中,該文件可以存儲多個實際的數據文件路徑,使用逗號或者換行分割; 
  • 關於APPEND|REPLACE|INSERT選項,表示將數據裝載時採用的加載方式。INSERT,插入方式,向空表插入新記錄(如果不是空表則會報錯無效的裝載模式);APPEND,追加方式,爲缺省方式,在表中追加新記錄;REPLACE,替代方
    式,先清空表再插入新記錄; 
    當dmfldr處於導出數據模式時,設置爲APPEND時,dmfldr會檢查導出數據文件是否存在,若存在,則以追加的方式寫入數據;若不存在,則新建數據文件;設置爲其他值時,dmfldr將直接創建新數據文件。選項默認值爲APPEND; 
  • 關於OPTIONS選項,該選項支持命令行參數中除userid,control,help以外的所有參數的指定,每個參數值對使用空格或者換行分割。對於option中出現的參數,在dmfldr的指定執行參數中也出現的,dmfldr會選擇option中對應參數的值執行;
  • 關於col_def,FILLER表示跳過處理數據文件中指定列的值;
  • 關於property_option選項 
    ✓ position(p1:p2):從數據文件中每行數據的第p1個字節到第p2個字節爲該列值,包含邊界p1,p2; 
    ✓ position(p1):從數據文件中每行數據的第p1個字節開始,到下一個列分隔符之間的數據爲該列值,包含邊界p1; 
    ✓ position選項對大字段數據無效,若對大字段類型指定此選項會報錯; 
    ✓ NULL:指定的值爲NULL,忽略數據文件中的值; 
    property_option參數僅對導入有效; 
  • 關於term_option選項,該選項用來指定數據文件中指定列的結束標誌。列的結束標誌可以是WHITESPACE(空格)或者用戶自定義的字符串或十六進制串。指定了term_option後,該列不需要用FIELDS分隔; 
  • 關於enclosed_option選項,此參數指定封閉符,爲可選參數,默認不存在封閉符。若在into_table_clause和coldef_option中均設置了封閉符,則以coldef_option中的設置爲準,若封閉符前指定[X]選項,則表明此封閉符爲十六進制格式的字符串; 
  • 分隔符或封閉符字符串的長度均不能超過255個字節; 
  • 關於constant_option選項,指定constant關鍵字後,數據文件中不需要爲該列準備數據,如果指定了,該列數據將作爲下一字段數據裝載而導致數據混亂。constant選項對大字段類型無效;
  • 關於fun_option選項,目前只支持trim()和replace(colname, srcStr, destStr)函數。trim()函數用於去除列數據的前後空格;replace()函數用於將colname列名指定的列數據中的srcStr替換爲destStr,其中srcStr和destStr參數可使用chr(int)函數將數字轉換成字符串,要求chr()的參數和返回值均不超過4個字節; 
  • 關於ep_option選項,用於指定數據將要發送的目的站點,僅適用於MPP環境。 

3.2指定數據文件

3.2.1在控制文件中指定數據文件

       可以在控制文件的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\'

3.2.2使用DATA參數指定數據文件

       也可以使用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子句和列定義子句。

     對於多表裝載的使用需注意以下幾點: 

  • 每個INTO TABLE子句的目標表必須是不同的表; 
  • 每個INTO TABLE子句的目標表必須是不同的表; 
  • 對於第二個及其之後的INTO TABLE子句,在其coldef_option中,必須爲第一列指定POSITION選項;

例如:

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使用手冊。歡迎訪問達夢數據庫官網下載開發版體驗,點這裏直達下載地址。

更多關於達夢的新聞和技術分享請關注達夢公衆號:達夢大數據

掃碼關注:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章