oracle 使用sqlload匯入外部資料

2021-09-16 12:08:14 字數 4646 閱讀 1240

使用sqlload大批量匯入資料

第一步:建立表

create table "testht"

."demo"

("id" varchar2(20 byte) not null enable,

"name" varchar2(20 byte),

"age" varchar2(20 byte)

)

建立控制檔案 : /home/demo.ctl

內容如下:

options (rows=1024)

load data

characterset zhs16gbk -- 這裡不加的話,可能中文亂碼

infile '/home/demo.txt'

truncate

into table demo

fields terminated by ","

optionally enclosed by '"'

trailing nullcols

( id,

name,

age)

控制檔案還有其他引數,根據自己需求調整和測試:

附部分控制引數:具體用法以官方文件為準

options (skip=1,rows=128) 	-- sqlldr 命令顯示的選項可以寫到這裡邊來,skip=1 用來跳過資料中的第一行

load data

infile "users_data.csv" --指定外部資料檔案,可以是不同格式的資料檔案,如csv、txt都支援 可以寫多個 infile "another_data_file.csv" 指定多個資料檔案

truncate --操作型別,用 truncate table 來清除表中原有記錄,根據情況而定是否需要清楚原有表中資料

into table users --要插入記錄的表

when user_id<>'1' -- 還可以用 when 子 句選擇匯入符合條件的記錄

fields terminated by "," --資料中每行記錄用 "," 分隔

optionally enclosed by '"' --資料中每個欄位用 '"' 框起,比如欄位中有 "," 分隔符時

trailing nullcols --表的字段沒有對應的值時允許為空

( virtual_column filler, --這是乙個虛擬字段,用來跳過由 pl/sql developer 生成的第一列序號

user_id number, --欄位可以指定型別,否則認為是 character 型別, log 檔案中有顯示

username "'hi '||upper(:username)",--,還能用sql函式或運算對資料進行加工處理

logintimes terminated by "," nullif (logintimes='null') --可為列單獨指定分隔符

last_login date "yyyy-mm-dd hh24:mi:ss" nullif (last_login="null") --當字段為"null"時就是 null

)

第三步 : 建立需要匯入的資料,注意資料格式必須和表結構嚴格對應,否則匯入失敗!測試資料如下:有部分資料最後欄位為空,所以控制檔案中需要加trailing nullcols 引數!

建立資料檔案 : /home/demo.txt

"2019-01-20","李思","23",

"2019-01-20","李思","23",

"2019-01-20","李思","23",

"2019-01-20","李思","23",

"2019-01-20","李思","23",

"2019-01-20","李思","23",

"2019-01-20","李思","23",

"2019-01-20","李思","23",

"2019-01-20","李思","23",

"2019-01-20","李思","23",

"2019-01-20","李思","23",

"2019-01-20","李思","23",

第四步 : 執行

我的資料檔案資料是300萬條記錄, 經測試執行時間大概在7s左右, 常規匯入可以通過使用 insert語句來匯入資料。direct匯入可以跳過資料庫的相關邏輯(direct=true),而直接將資料匯入到資料檔案中,可以提高匯入資料的 效能。當然,在很多情況下,不能使用此引數(如果主鍵重複的話會使索引的狀態變成unusable!)。

[oracle@hm311 home]$ sqlldr testht/123456 control=/home/demo.ctl  data=/home/demo.txt  direct=true;

....

...commit point reached - logical record count 2999760

commit point reached - logical record count 2999824

commit point reached - logical record count 2999888

commit point reached - logical record count 2999952

commit point reached - logical record count 2999999

commit point reached - logical record count 3000000

sqlload語法結構:

userid -- oracle 使用者名稱/口令          

control -- 控制檔名

log -- 記錄匯入時的日誌檔案,預設為 控制檔案(去除副檔名).log

bad -- 壞資料檔案,預設為 控制檔案(去除副檔名).bad

data -- 資料檔案,一般在控制檔案中指定。用引數控制檔案中不指定資料檔案更適於自動操作

discard -- 廢棄檔名

discardmax -- 允許廢棄的檔案的數目 (全部預設)

skip -- 要跳過的邏輯記錄的數目 (預設 0)

load -- 要載入的邏輯記錄的數目 (全部預設)

errors -- 允許的錯誤記錄數,可以用他來控制一條記錄都不能錯 (預設 50)

rows -- 常規路徑繫結陣列中或直接路徑儲存資料間的行數

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

bindsize -- 常規路徑繫結陣列的大小 (以位元組計)

(預設 256000)

silent -- 執行過程中隱藏訊息 (標題,反饋,錯誤,廢棄,分割槽)

direct -- 使用直接路徑 (預設 false)

parfile -- 引數檔案: 包含引數說明的檔案的名稱

parallel -- 執行並行載入 (預設 false)

file -- 要從以下物件中分配區的檔案

skip_unusable_indexes -- 不允許/允許使用無用的索引或索引分割槽 (預設 false)

skip_index_maintenance -- 沒有維護索引, 將受到影響的索引標記為無用 (預設 false)

commit_discontinued -- 提交載入中斷時已載入的行 (預設 false)

readsize -- 讀取緩衝區的大小 (預設 1048576)

external_table -- 使用外部表進行載入; not_used, generate_only, execute (預設 not_used)

columnarrayrows -- 直接路徑列陣列的行數 (預設 5000)

streamsize -- 直接路徑流緩衝區的大小 (以位元組計)

(預設 256000)

multithreading -- 在直接路徑中使用多執行緒

resumable -- 啟用或禁用當前的可恢復會話 (預設 false)

resumable_name -- 有助於標識可恢復語句的文字字串

resumable_timeout -- resumable 的等待時間 (以秒計)

(預設 7200)

date_cache -- 日期轉換快取記憶體的大小 (以條目計)

(預設 1000)

當載入大量資料時(大約超過10gb),最好抑制日誌的產生:

sql

>

alter

table demo nologging;

SqlLoad的簡單使用

sqlload的簡單使用 能實現 快速匯入大量資料 1.先安裝oracle 客戶端機器.有點大,600m 2.安裝時選擇管理員安裝 1.1g 3.第三步的時候我的出錯了.說是環境變數校驗不通過,檢查環境變數的長度以及是否擁有管理員許可權之後都沒解決.考慮到這裡只是用來匯入資料,我選擇了全部錯誤忽略,...

Oracle資料庫SqlLoad常用技巧總結

ad 線下活動 三大新銳html 5企業匯聚51cto 大話移動前端技術 oracle資料庫sqlload常用技巧的相關知識是本文我們主要要介紹的內容,本文我們總結了14種sqlload的使用技巧,並給出了測試用的檔案原始碼,接下來我們就開始一一介紹這部分內容,希望能夠對您有所幫助。1 控制檔案中注...

sqlload的基本用法

sqlload的基本用法 範例 資料檔案 2.dat 控制檔案 2.ctl 控制台裝載命令 linux sqlldr userid sjcl aaa111aaa control 2.ctl load data infile 1.txt fields terminated by x 09 traili...