SQL*LOADER是ORACLE的資料載入工具,通常用來將作業系統檔案遷移到ORACLE資料庫中。SQL*LOADER是大型資料 倉庫選擇使用的載入方法,因為它提供了最快速的途徑(DIRECT,PARALLEL)。現在,我們拋開其理論不談,用執行個體來使您快速掌握SQL*LOADER的使用方法。 首先,我們認識一下SQL*LOADER。 在NT下,SQL*LOADER的命令為SQLLDR,在UNIX下一般為sqlldr/sqlload。 如執行:d:\oracle>sqlldr SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 11:06:42 2002 (c) Copyright 1999 Oracle Corporation. All rights reserved. 用法: SQLLOAD 關鍵字 = 值 [,keyword=value,...] 有效關鍵字: userid -- ORACLE username/password control -- Control file name log -- Log file name bad -- Bad file name data -- Data file name discard -- Discard file name discardmax -- Number of discards to allow (全部預設) skip -- Number of logical records to skip (預設0) load -- Number of logical records to load (全部預設) errors -- Number of errors to allow (預設50) rows -- Number of rows in conventional path bind array or between direct path data saves (預設: 常規路徑 64, 所有直接路徑) bindsize -- Size of conventional path bind array in bytes(預設65536) silent -- Suppress messages during run (header,feedback,errors,discards,partitions) direct -- use direct path (預設FALSE) parfile -- parameter file: name of file that contains parameter specifications parallel -- do parallel load (預設FALSE) file -- File to allocate extents from skip_unusable_indexes -- disallow/allow unusable indexes or index partitions(預設FALSE) skip_index_maintenance -- do not maintain indexes, mark affected indexes as unusable(預設FALSE) commit_discontinued -- commit loaded rows when load is discontinued(預設FALSE) readsize -- Size of Read buffer (預設1048576) PLEASE NOTE: 命令列參數可以由位置或關鍵字指定 。前者的例子是 'sqlload scott/tiger foo';後者的例子是 'sqlload control=foo userid=scott/tiger'.位置指定參數的時間必須早於但不可遲於由關鍵字指定的參數。例如, 'SQLLOAD SCott/tiger control=foo logfile=log', 但'不允許 sqlload scott/tiger control=foo log',即使允許 參數 'log' 的位置正確。 d:\oracle> 我們可以從中看到一些基本的協助資訊,這裡,我用到的是中文的WIN2000 ADV SERVER。 我們知道,SQL*LOADER只能匯入純文字,所以我們現在開始以執行個體來講解其用法。 一、已存在資料來源result.csv,欲倒入ORACLE中FANCY使用者下。 result.csv內容: 1,預設 Web 網站,192.168.2.254:80:,RUNNING 2,other,192.168.2.254:80:test.com,STOPPED 3,third,192.168.2.254:81:thirdabc.com,RUNNING 從中,我們看出4列,分別以逗號分隔,為變長字串。 二、制定控制檔案result.ctl result.ctl內容: load data infile 'result.csv' into table resultxt (resultid char terminated by ',', website char terminated by ',', ipport char terminated by ',', status char terminated by whitespace) 說明: infile 指資料來源檔案 這裡我們省略了預設的 discardfile result.dsc badfile result.bad into table resultxt 預設是INSERT,也可以into table resultxt APPEND為追加方式,或REPLACE terminated by ',' 指用逗號分隔 terminated by whitespace 結尾以空白分隔 三、此時我們執行載入: D:\>sqlldr userid=fancy/testpass@tnsname(tnsname.ora中的串連名) control=result.ctl log=resulthis.out SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:25:42 2002 (c) Copyright 1999 Oracle Corporation. All rights reserved. SQL*Loader-941: 在描述表RESULTXT時出現錯誤 ORA-04043: 對象 RESULTXT 不存在 提示出錯,因為資料庫沒有對應的表。 四、在資料庫建立表 create table resultxt (resultid varchar2(500), website varchar2(500), ipport varchar2(500), status varchar2(500)) / 五、重新執行載入 D:\>sqlldr userid=fancy/k1i7l6l8 control=result.ctl log=resulthis.out SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:31:57 2002 (c) Copyright 1999 Oracle Corporation. All rights reserved. 達到提交點,邏輯記錄計數2 達到提交點,邏輯記錄計數3 已經成功!我們可以通過記錄檔來分析其過程:resulthis.out內容如下: SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:31:57 2002 (c) Copyright 1999 Oracle Corporation. All rights reserved. 控制檔案: result.ctl 資料檔案: result.csv 錯誤檔案: result.bad 廢棄檔案: 未作指定 : (可廢棄所有記錄) 裝載數: ALL 跳過數: 0 允許的錯誤: 50 綁定數組: 64 行,最大 65536 位元組 繼續: 未作指定 所用路徑: 常規 表RESULTXT 已載入從每個邏輯記錄 插入選項對此表INSERT生效 列名 位置 長度 中止 封裝資料類型 ------------------------------ ---------- ----- ---- ---- --------------------- RESULTID FIRST * , CHARACTER WEBSITE NEXT * , CHARACTER IPPORT NEXT * , CHARACTER STATUS NEXT * WHT CHARACTER 表RESULTXT: 3 行載入成功 由於資料錯誤, 0 行沒有載入。 由於所有 WHEN 子句失敗, 0 行沒有載入。 由於所有欄位都為空白的, 0 行沒有載入。 為結合數組分配的空間: 65016位元組(63行) 除綁定數組外的記憶體空間分配: 0位元組 跳過的邏輯記錄總數: 0 讀取的邏輯記錄總數: 3 拒絕的邏輯記錄總數: 0 廢棄的邏輯記錄總數: 0 從星期二 1月 08 10:31:57 2002開始運行 在星期二 1月 08 10:32:00 2002處運行結束 經過時間為: 00: 00: 02.70 CPU 時間為: 00: 00: 00.10(可 六、並行作業 sqlldr userid=/ control=result1.ctl direct=true parallel=true sqlldr userid=/ control=result2.ctl direct=true parallel=true sqlldr userid=/ control=result2.ctl direct=true parallel=true 當載入大量資料時(大約超過10GB),最好抑制日誌的產生: SQL>ALTER TABLE RESULTXT nologging; 這樣不產生REDO LOG,可以提高效率。然後在CONTROL檔案中load data上面加一行:unrecoverable 此選項必須要與DIRECT共同應用。 在並行作業時,ORACLE聲稱可以達到每小時處理100GB資料的能力!其實,估計能到1-10G就算不錯了,開始可用結構 相同的檔案,但只有少量資料,成功後開始載入大量資料,這樣可以避免時間的浪費。 有關SQLLDR的問題 控制檔案:input.ctl,內容如下: load data --1、控制檔案標識 infile 'test.txt' --2、要輸入的資料檔案名為test.txt append into table test --3、向表test中追加記錄 fields terminated by X'09' --4、欄位終止於X'09',是一個定位字元(TAB) (id,username,password,sj) -----定義列對應順序 其中append為資料裝載方式,還有其他選項: a、insert,為預設方式,在資料裝載開始時要求表為空白 b、append,在表中追加新記錄 c、replace,刪除舊記錄,替換成新裝載的記錄 d、truncate,同上
|