天天看點

資料批量導入Oracle資料庫

今天學習了一個新的東西,覺得還挺有意思的,也是從别出COPY 的,

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 p

ath data saves

(預設: 正常路徑 64, 所有直接路徑)

bindsize -- Size of conventional path bind array in bytes(預設65536)

silent -- Supdivss messages during run (header,feedback,errors,discards,part

itions)

direct -- use direct path (預設FALSE)

parfile -- parameter file: name of file that contains parameter specification

s

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 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就算不錯了,開始可用結構

相同的檔案,但隻有少量資料,成功後開始加載大量資料,這樣可以避免時間的浪費。

我的示例:

一、在資料庫建立表格weather如下:

create table weather(

outlook varchar(20),

temperature float,

humidity float,

windy varchar(10),

play varchar(10)

)

二、在F盤建立兩個檔案 分别如下:

#1、result.ctl内容如下:

load data

infile 'result.csv'

into table weather

(outlook char terminated by ',',

temperature char terminated by ',',

humidity char terminated by ',',

windy char terminated by ',',

play char terminated by ','

)

#2、result.csv内容如下:

sunny,85,85,FALSE,no

sunny,80,90,TRUE,no

overcast,83,86,FALSE,yes

rainy,70,96,FALSE,yes

rainy,68,80,FALSE,yes

rainy,65,70,TRUE,no

overcast,64,65,TRUE,yes

sunny,72,95,FALSE,no

sunny,69,70,FALSE,yes

rainy,75,80,FALSE,yes

sunny,75,70,TRUE,yes

overcast,72,90,TRUE,yes

overcast,81,75,FALSE,yes

rainy,71,91,TRUE,no

三、指令行下執行

F:\>sqlldr userid=cqsb/ctbujx123 control=result.ctl

四、搞定