使用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...