1.sqlldr介紹
用法: SQLLDR keyword=value [,keyword=value,...]
有效的關鍵字:
????
userid -- ORACLE 用戶名/口令???????
???
control -- 控制文件名???????????????
???????
log -- 日志文件名???????????????????
???????
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)
no_index_errors -- 出現任何索引錯誤時中止加載? (默認 FALSE)
PLEASE NOTE: 命令行參數可以由位置或關鍵字指定
。前者的例子是 'sqlldr
scott/tiger foo
'; 后一種情況的一個示例是 '
sqlldr control=foo
userid=scott/tiger'。位置指定參數的時間必須早于
但不可遲于由關鍵字指定的參數。例如,
允許
'sqlldr scott/tiger control=foo logfile=log'
, 但是
不允許
'sqlldr scott/tiger control=foo log'
, 即使
參數
'log'
?的位置正確。
2.實戰
先有需求:
將000000_0.txt文件導入oracle數據庫
000000_0.txt大小:123MB,幾十萬行
000000_0.txt內容格式:
20160514|未知|未知|未知|3G|057431041116|55349|41116|28173301261774|460007863660008|1.224609375|13.0|\N|\N
20160514|HTC|手機|D728w|3G|057431001157|55097|1157|35153907023514|460006620667069|0.513671875|10.0|\N|\N
20160514|HTC|手機|D728w|3G|057431043861|55084|43861|35153907033487|460027685036740|2937.208984375|8052.0|\N|\N
20160514|HTC|手機|D728w|3G|057431003011|55084|3011|35153907033487|460027685036740|1.755859375|56.0|\N|\N
導入的數據庫表結構:
create table TEST201605
(SHI_JIAN,ZDCS,ZDFL,ZDXH,XQWLLX,XQWYBH,LAC,CI,IMEI,IMSI,THREEG_LL,THREEG_SZ,FOURG_LL
)
2.1編寫控制文件 load.ctl:
load data
CHARACTERSET UTF8 ?//查看下文件的編碼,設為同一個編碼
infile "E:\datafile\000000_0.txt" ? //只能一個個導入,可以把多個文件合并到一個里,然后導入
append
into table TEST201605
fields terminated by '|'
trailing nullcols
(
? ? --"時間",
? ? SHI_JIAN,
? ? ZDCS,
? ? ZDFL,
? ? ZDXH,
? ? XQWLLX,
? ? XQWYBH,
? ? LAC,
? ? CI,
? ? IMEI,
? ? IMSI,
? ? THREEG_LL,
? ? THREEG_SZ,
? ? FOURG_LL
)
2.2 windows下
dos命令窗,cd 到load.ctl所在目錄
使用命令:
sqlldr daily/mdasil@daily-74 control=load.ctl log=log.log bad=bad.log errors=5000 rows=1000 bindsize=10485760
linux:
load data
CHARACTERSET UTF8
infile "/datafile-import/000021_0.txt"
append
into table jingfen_201605_1415
fields terminated by '|'
trailing nullcols
(
? ? SHI_JIAN,
? ? ZDCS,
? ? ZDFL,
? ? ZDXH,
? ? XQWLLX,
? ? XQWYBH,
? ? LAC,
? ? CI,
? ? IMEI,
? ? IMSI,
? ? THREEG_LL,
? ? THREEG_SZ,
? ? FOURG_LL
)
oracle用戶下執行:
sqlldr daily/mdasil control=/datafile-import/ctl/44.ctl log=/datafile-import/log/log20160526.log ?bad=/datafile-import/log/bad20160526.log
rows與bindsize相關,rows默認64行,如果不修改bindsize,只修改rows無效。
bindsize --( 每次提交記錄的緩沖區的大小,字節為單位,默認256000)
dos窗口會打印:
達到提交點 - 邏輯記錄計數 441884
達到提交點 - 邏輯記錄計數 441954
達到提交點 - 邏輯記錄計數 442024
達到提交點 - 邏輯記錄計數 442094
sqllder 導入的時候,不支持中文列名,因為文件里的都是string,導入的表字段也要 字符串 類型 。
(可以控制類型,但是如果數據內容格式不對,導入出錯就比較麻煩,還是以string文本導入后,再修改表結構)