在達夢數據庫中,有幾種常用的數據遷移工具。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的各項功能。
- 當進行數據載入時,dmfldr客戶端接收用戶提交的命令與參數,分析控制文件與數據文件,將數據打包發送給服務器端的dmfldr模塊,由服務器完成數據的真正裝載工作。並分析服務器返回的消息,必要時根據用戶參數指定生成日誌文件與錯誤數據文件。
- 當進行數據導出時,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使用手冊。歡迎訪問達夢數據庫官網下載開發版體驗,點這裏直達下載地址。