Oracle 的資料匯入匯出及 Sql Loader (sqlldr) 的用法
在 Oracle 資料庫中,我們通常在不同資料庫的表間記錄進行復制或遷移時會用以下幾種方法:
1. A 表的記錄匯出為一條條分號隔開的 insert 語句,然後執行插入到 B 表中
2. 建立資料庫間的 dblink,然後用 create table B as select * from A@dblink where ...,或 insert into B select * from A@dblink where ...
3. exp A 表,再 imp 到 B 表,exp 時可加查詢條件
4. 程式實現 select from A ..,然後 insert into B ...,也要分批提交
5. 再就是本篇要說到的 Sql Loader(sqlldr) 來匯入資料,效果比起逐條 insert 來很明顯
第 1 種方法在記錄多時是個噩夢,需三五百條的分批提交,否則客戶端會死掉,而且匯入過程很慢。如果要不產生 REDO 來提高 insert into 的效能,就要下面那樣做:
好啦,前面簡述了 Oracle 中資料匯入匯出的各種方法,我想一定還有更高明的。下面重點講講 Oracle 的 Sql Loader (sqlldr) 的用法。
在命令列下執行 Oracle 的 sqlldr 命令,可以看到它的詳細引數說明,要著重關注以下幾個引數:
userid -- Oracle 的 username/password[@servicename]
control -- 控制檔案,可能包含表的資料
-------------------------------------------------------------------------------------------------------
log -- 記錄匯入時的日誌檔案,預設為 控制檔案(去除副檔名).log
bad -- 壞資料檔案,預設為 控制檔案(去除副檔名).bad
data -- 資料檔案,一般在控制檔案中指定。用引數控制檔案中不指定資料檔案更適於自動操作
errors -- 允許的錯誤記錄數,可以用他來控制一條記錄都不能錯
rows -- 多少條記錄提交一次,預設為 64
skip -- 跳過的行數,比如匯出的資料檔案前面幾行是表頭或其他描述
還有更多的 sqlldr 的引數說明請參考:sql loader的用法。
用例子來演示 sqlldr 的使用,有兩種使用方法:
1. 只使用一個控制檔案,在這個控制檔案中包含資料
2. 使用一個控制檔案(作為模板) 和一個資料檔案
一般為了利於模板和資料的分離,以及程式的不同分工會使用第二種方式,所以先來看這種用法。資料檔案可以是 CSV 檔案或者以其他分割符分隔的,資料檔案可以用 PL/SQL Developer 或者 Toad 匯出,也可以用 SQL *Plus 的 spool 格式化產出,或是 UTL_FILE 包生成。另外,用 Toad 還能直接生成包含資料的控制檔案。
首先,假定有這麼一個表 users,並插入五條記錄:
第二種方式: 使用一個控制檔案(作為模板) 和一個資料檔案
1) 建立資料檔案,我們這裡用 PL/SQL Developer 匯出表 users 的記錄為 users_data.csv 檔案,內容如下:
2) 建立一個控制檔案 users.ctl,內容如下:
說明:在操作型別 truncate 位置可用以下中的一值:
1) insert --為預設方式,在資料裝載開始時要求表為空
2) append --在表中追加新記錄
3) replace --刪除舊記錄(用 delete from table 語句),替換成新裝載的記錄
4) truncate --刪除舊記錄(用 truncate table 語句),替換成新裝載的記錄
3) 執行命令:
sqlldr dbuser/dbpass@dbservice control=users.ctl
在 dbservice 指示的資料庫的表 users 中記錄就和資料檔案中的一樣了。
執行完 sqlldr 後希望能留意一下生成的幾個檔案,如 users.log 日誌檔案、users.bad 壞資料檔案等。特別是要看看日誌檔案,從中可讓你更好的理解 Sql Loader,裡面有對控制檔案的解析、列出每個欄位的型別、載入記錄的統計、出錯原因等資訊。
第一種方式,只使用一個控制檔案在這個控制檔案中包含資料
1) 把 users_data.cvs 中的內容補到 users.ctl 中,並以 BEGINDATA 連線,還要把 INFILE "users_data.csv" 改為 INFILE *。同時為了更大化的說明問題,把資料處理了一下。此時,完整的 users.ctl 檔案內容是:
2) 執行一樣的命令:
sqlldr dbuser/dbpass@dbservice control=users.ctl
比如,在控制檯會顯示這樣的資訊:
C:\>sqlldr dbuser/dbpass@dbservice control=users.ctl
SQL*Loader: Release 9.2.0.1.0 - Production on 星期三 1月 7 22:26:25 2009
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
達到提交點,邏輯記錄計數4
達到提交點,邏輯記錄計數5
上面的控制檔案包含的內容比較複雜(演示目的),請根據註釋理解每個引數的意義。還能由此發掘更多用法。
最後說下有關 SQL *Loader 的效能與併發操作
1) ROWS 的預設值為 64,你可以根據實際指定更合適的 ROWS 引數來指定每次提交記錄數。(體驗過在 PL/SQL Developer 中一次執行幾條條以上的 insert 語句的情形嗎?)
2)常規匯入可以通過使用 INSERT語句來匯入資料。Direct匯入可以跳過資料庫的相關邏輯(DIRECT=TRUE),而直接將資料匯入到資料檔案中,可以提高匯入資料的效能。當然,在很多情況下,不能使用此引數(如果主鍵重複的話會使索引的狀態變成UNUSABLE!)。
3) 通過指定 UNRECOVERABLE選項,可以關閉資料庫的日誌(是否要 alter table table1 nologging 呢?)。這個選項只能和 direct 一起使用。
4) 對於超大資料檔案的匯入就要用併發操作了,即同時執行多個匯入任務.
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 就算不錯了,開始可用結構 相同的檔案,但只有少量資料,成功後開始載入大量資料,這樣可以避免時間的浪費。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8183550/viewspace-667623/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 資料匯入匯出Oracle
- Oracle資料匯入匯出Oracle
- SQL資料庫的匯入和匯出SQL資料庫
- Oracle資料泵的匯入和匯出Oracle
- SQLSERVER匯出TXT文字檔案,ORACLE SQL LOADER匯入TXT文字檔案SQLServerOracle
- oracle資料匯出匯入(exp/imp)Oracle
- Oracle資料庫匯入匯出。imp匯入命令和exp匯出命令Oracle資料庫
- Oracle資料泵匯出匯入(expdp/impdp)Oracle
- sqoop用法之mysql與hive資料匯入匯出OOPMySqlHive
- 使用Oracle SQL Developer匯入Excel資料OracleSQLDeveloperExcel
- Mongodb資料的匯出與匯入MongoDB
- 匯入和匯出AWR的資料
- EasyPoi, Excel資料的匯入匯出Excel
- navlicat 匯入匯出SQLSQL
- 【SQL】Oracle BLOB 批量匯入匯出圖片語句SQLOracle
- [資料庫] Navicat for Oracle基本用法(匯入匯出正刪改查)圖文介紹資料庫Oracle
- Oracle使用資料泵expdp,impdp進行資料匯出匯入Oracle
- [Docker核心之容器、資料庫檔案的匯入匯出、容器映象的匯入匯出]Docker資料庫
- sqoop資料匯入匯出OOP
- 資料泵匯出匯入
- phpMyAdmin匯入/匯出資料PHP
- 資料庫 MySQL 資料匯入匯出資料庫MySql
- Oracle 資料匯入ExcelOracleExcel
- 【oracle 資料匯入匯出字元問題】Oracle字元
- MySQL入門--匯出和匯入資料MySql
- QZpython匯入匯出redis資料的實現deuPythonRedis
- 使用Dbeaver 進行資料的匯入和匯出
- Mysql 資料庫匯入與匯出MySql資料庫
- Access 匯入 oracle 資料庫Oracle資料庫
- DBeaver 資料匯入SQL時的問題SQL
- sqoop部署及匯入與匯出OOP
- MYSQL資料匯出備份、匯入的幾種方式MySql
- 使用csv批量匯入、匯出資料的需求處理
- 【oracle 多種形式的外部表匯入、匯出】實驗Oracle
- 【最佳實踐】MongoDB匯出匯入資料MongoDB
- 複雜「場景」資料匯入匯出
- ClickHouse 資料表匯出和匯入(qbit)
- 【STATS】Oracle匯入匯出優化器統計資訊Oracle優化
- Navicat如何匯入和匯出sql檔案SQL