oracle 使用sqlload匯入外部資料
阿新 • • 發佈:2022-11-29
使用SQLload大批量匯入資料
第一步:建立表
CREATE TABLE "TESTHT"."DEMO"
(
"ID" VARCHAR2(20 BYTE) NOT NULL ENABLE,
"NAME" VARCHAR2(20 BYTE),
"AGE" VARCHAR2(20 BYTE)
)
第二步 : 編寫sqlload匯入資料的控制檔案
這裡測試的控制檔案如下,可以根據自己需要新增相關的控制引數,測試的話複製儲存為txt檔案即可!
建立控制檔案 : /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 )
insert --為預設方式,在資料裝載開始時要求表為空
append --在表中追加新記錄
replace --刪除舊記錄(用 delete from table 語句),替換成新裝載的記錄
truncate --刪除舊記錄(用 truncate table 語句),替換成新裝載的記錄
第三步 : 建立需要匯入的資料
注意資料格式必須和表結構嚴格對應,否則匯入失敗!測試資料如下:有部分資料最後欄位為空,所以控制檔案中需要加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)
no_index_errors -- 出現任何索引錯誤時中止載入 (預設 FALSE)本文來自:雨花石,原地址:https://www.yuhuashi.infohttps://www.yuhuashi.info/post/121.html
當載入大量資料時(大約超過10GB),最好抑制日誌的產生:
SQL>ALTER TABLE DEMO nologging;