日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle使用sqluldr2

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle使用sqluldr2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分三部分:

1 . sqluldr2簡介與使用

2 . sqlldr的使用,常見異常

3 . 測試使用

?

1 . sqluldr2簡介與使用

sqluldr2是一款Oracle數據快速導出工具,包含32、64位程序,sqluldr2在大數據量導出方面速度超快,能導出億級數據為excel文件,另外它的導入速度也是非常快速,功能是將數據以TXT/CSV等格式導出。

  sqluldr2下載地址:http://www.pc6.com/softview/SoftView_516318.html

  sqluldr2百度文庫參考:https://wenku.baidu.com/view/ffd7e60400f69e3143323968011ca300a7c3f614

基本簡介

  下載完sqluldr解壓后,文件夾內容如下:
  sqluldr2.exe? 用于32位windows平臺;
  sqluldr2_linux32_10204.bin? 適用于linux32位操作系統;
  sqluldr2_linux64_10204.bin? 適用于linux64位操作系統;
  sqluldr264.exe?? 用于64位windows平臺。

使用方法

1、首先將sqluldr2.exe復制到執行目錄下,即可開始使用
2、查看help 幫助

?

3、執行數據導出命令
  3.1、常規導出 

sqluldr2 hr/hr123@127.0.0.1:1521/XE query="select * from bb_user_t" head=yes file=D:\sqluldr2\File\tmp001.csv


  說明:head=yes?? 表示輸出表頭

?

  3.2、使用sql參數

sqluldr2 hr/hr123@127.0.0.1:1521/XE sql=query.sql head=yes file=D:\sqluldr2\File\tmp002.csv

  

sqluldr2 hr/hr123@127.0.0.1:1521/XE sql=D:\sqluldr2\query.sql head=yes file=D:\sqluldr2\File\tmp002.csv


  query.sql的內容為:

select * from bb_user_t

  3.3、使用log參數
  當集成sqluldr2在腳本中時,就希望屏蔽上不輸出這些信息,但又希望這些信息能保留,這時可以用“LOG”選項來指定日志文件名。

sqluldr2 hr/hr123@127.0.0.1:1521/XE sql=D:\sqluldr2\query.sql head=yes file=D:\sqluldr2\File\tmp003.csv log=+D:\sqluldr2\File\tmp003.log

  3.4、使用 table 參數

  (“TABLE”選項用于指定將文件導入的目標表的名字,例如我們將EMP 表的數據導入到EMP_HIS 表中,假設這兩個表的表結構一致,先用如下命令導出數據:

Sqluldr2 … query=”select * from emp” file=emp.txt table=emp_his ……)
  當使用 table 參數時,在目錄下會生成對應的ctl控制文件,如下語句會生成temp_004_sqlldr.ctl文件。

sqluldr2 hr/hr123@127.0.0.1:1521/XE query="select * from bb_user_t" table=temp_004 head=yes file=D:\sqluldr2\File\tmp004.csv

  可以指定文件地址(不建議,指定文件地址情況重新導入數據庫時需要手動修改生成的D:\sqluldr2\File\temp_004_sqlldr.ctl文件中“INTO TABLE D:\sqluldr2\File\temp_004”為表名“INTO TABLE temp_004”):

  sqluldr2 hr/hr123@127.0.0.1:1521/XE query="select * from bb_user_t" table=D:\sqluldr2\File\temp_004 head=yes file=D:\sqluldr2\File\tmp004.csv(不建議使用)

  生成的控制文件temp_004_sqlldr.ctl的內容如下:

?

  3.4、大數據量操作

  對于大表可以輸出到多個文件中,指定行數分割或者按照文件大小分割,例如:

sqluldr2 hr/hr123@127.0.0.1:1521/XE query="select * from bb_user_t" table=temp_001 mode=APPEND head=yes file=D:\sqluldr2\temp_001_%B.csv batch=yes rows=500000

?

  當文件名(“FILE”選項)的后綴以小寫的“.gz”結尾時,會將記錄直接寫入到GZIP格式的壓縮文件中,如果要歸檔大量數據,這個功能可以節約很多的存貯空間,降低運營成本。

sqluldr2 hr/hr123@127.0.0.1:1521/XE query="select * from bb_user_t" table=temp_001 mode=APPEND head=yes file=D:\sqluldr2\temp_001.txt.gz


  1 兆大小的文件,以GZIP 壓縮方式生成時,大小才90KB,如果用于歸檔歷史數據,的確可以節約不少空間,GZIP 目前是性價比非常好的壓縮方式之一。

參數說明

user = username/password@tnsname

sql = SQL file name

query = select statement (選擇語句;query參數如果整表導出,可以直接寫表名,如果需要查詢運算和where條件,query=“sql文本”,也可以把復雜sql寫入到文本中由query調用)

field = separator string between fields (

設置導出文件里的分隔符;

默認是逗號分隔符,通過 field參數指定分隔符;

例如現在要改變默認的字段分隔符,用“#”來分隔記錄,導出的命令如下所示:
sqluldr2? test/test sql=tmp.sql field=#
  在指定分隔符時,可以用字符的ASCII代碼(0xXX,大寫的XX為16進制的ASCII碼值)來指定一個字符,常用的字符的ASCII代碼如下:
  回車=0x0d,換行=0x0a,TAB鍵=0x09,|=0x7c,&=0x26,雙引號=0x22,單引號=0x27
  在選擇分隔符時,一定不能選擇會在字段值中出現的字符)

record = separator string between records (記錄之間的分隔字符串;分隔符? 指定記錄分隔符,默認為回車換行,Windows下的換行)

rows = print progress for every given rows (default, 1000000)

file = output file name(default: uldrdata.txt) (輸出文件名(默認:uldrdata.txt))

log = log file name, prefix with + to append mode (日志文件名,前綴加+模式)

fast = auto tuning the session level parameters(YES)

text = output type (MYSQL, CSV, MYSQLINS, ORACLEINS, FORM, SEARCH).

charset = character set name of the target database. (目標數據庫的字符集名稱;導出文件里有中文顯示亂碼,需要設置參數charset=UTF8)

ncharset= national character set name of the target database.

parfile = read command option from parameter file (從參數文件讀取命令選項;可以把參數放到parfile文件里,這個參數對于復雜sql很有用)

read = set DB_FILE_MULTIBLOCK_READ_COUNT at session level

sort = set SORT_AREA_SIZE at session level (UNIT:MB)

hash = set HASH_AREA_SIZE at session level (UNIT:MB)

array = array fetch size

head = print row header(Yes|No)

batch = save to new file for every rows batch (Yes/No) (為每行批處理保存新文件)

size = maximum output file piece size (UNIB:MB)

serial = set _serial_direct_read to TRUE at session level

trace = set event 10046 to given level at session level

table = table name in the sqlldr control file (“TABLE”選項用于指定將文件導入的目標表的名字,例如我們將EMP 表的數據導入到EMP_HIS 表中,假設這兩個表的表結構一致,先用如下命令導出數據:

Sqluldr2 … query=”select * from emp” file=emp.txt table=emp_his ……)

control = sqlldr control file and path.

mode = sqlldr option, INSERT or APPEND or REPLACE or TRUNCATE

buffer = sqlldr READSIZE and BINDSIZE, default 16 (MB)

long = maximum long field size

width = customized max column width (w1:w2:...)

quote = optional quote string (可選引用字符串;引號符? 指定非數字字段前后的引號符)

data = disable real data unload (NO, OFF)

alter = alter session SQLs to be execute before unload

safe = use large buffer to avoid ORA-24345 error (Yes|No) (使用大緩沖器避免ORA-24345錯誤;ORA-24345: A Truncation or null fetch error occurred,設置參數safe=yes)

crypt = encrypted user information only (Yes|No)

sedf/t = enable character translation function

null = replace null with given value

escape = escape character for special characters

escf/t = escape from/to characters list

format = MYSQL: MySQL Insert SQLs, SQL: Insert SQLs.

exec = the command to execute the SQLs.

prehead = column name prefix for head line.

rowpre = row prefix string for each line.

rowsuf = row sufix string for each line.

colsep = separator string between column name and value.

presql = SQL or scripts to be executed before data unload.

postsql = SQL or scripts to be executed after data unload.

lob = extract lob values to single file (FILE).

lobdir = subdirectory count to store lob files .

split = table name for automatically parallelization.

degree = parallelize data copy degree (2-128).

for field and record, you can use '0x' to specify hex character code,

\r=0x0d \n=0x0a |=0x7c ,=0x2c, \t=0x09, :=0x3a, #=0x23, "=0x22 '=0x27</span>

?

--附贈一個小例子:每個數值以#間隔,每行數據以0x0d0x0a間隔 sqluldr2 hr/hr123@127.0.0.1:1521/XE query="select vip_card from bb_user_t" table=temp_001 mode=APPEND record=0x0d0x0a field=# head=yes file=D:\sqluldr2\temp_001.txt

2 . sqlldr的使用,常見異常

安裝ORACLE客戶端有SQLLDR命令

  我的sqlldr位置:C:\oraclexe\app\oracle\product\10.2.0\server\BIN\sqlldr.exe

  注:導入數據字段,表中必須包含(>=)導入數據中字段;

導入數據時我遇到的問題:

  異常1:SQL*Loader-522: ?文件(temp_004_sqlldr.log)的lfiopn失敗

  異常2:SQL*Loader-350: ?語法錯誤位于第 15 行。

  異常3:SQL*Loader-601: ?對于 INSERT 選項, 表必須為空。表 BB_USER_T 上出錯

  異常4:SQL*Loader-941: ?在描述表 BB_USER_T_1 時出錯

異常1:

?

  SQL*Loader-522: ?文件(temp_004_sqlldr.log)的lfiopn失敗

原因可能兩種
  1.路徑和文件名?不正確或不存在
  2.權限不足

我是因為權限不足,

解決:將C:\oraclexe\app\oracle\product\10.2.0\server\BIN\sqlldr.exesqlldr.exe粘貼到temp_004_sqlldr.ctl文件的目錄下,繼續執行;

異常2:?

?

  SQL*Loader-350: ?語法錯誤位于第 15 行。

  預期值是 "(", 而實際值是 ":"。

  INSERT INTO TABLE D:\sqluldr2\File\temp_004

原因:導出時的table參數的設置(table=D:\sqluldr2\File\temp_004)不正確,應設置為導入數據的表名

解決:重新導出table設為要導入數據的表名

?異常3:

  SQL*Loader-601: ?對于 INSERT 選項, 表必須為空。表 BB_USER_T 上出錯

原因:導出數據庫數據時若不設定sqlldr 裝載數據時的裝載方式,則默認為INSERT

?

解決:若需要在其它表中新增數據用如下類似語句:

sqluldr2 hr/hr123@127.0.0.1:1521/XE query="select * from bb_user_t" table=BB_USER_T mode=APPEND head=yes file=D:\sqluldr2\temp_001.csv

異常4:

?

  SQL*Loader-941: ?在描述表 BB_USER_T_1 時出錯

  ORA-04043: 對象 BB_USER_T_1 不存在

原因:提示出錯,因為數據庫沒有對應的表。

解決:修改“sqlldr hr/hr123@127.0.0.1:1521/XE control=temp_001_sqlldr.ctl”語句文件“temp_001_sqlldr.ctl”中BB_USER_T_1為正確表名

?

3 . 測試使用

測試操作:

操作一》導出數據

?

  進行導出數據操作:95951433條數據導出時間不到4分鐘

操作二》導入數據

sqlldr hr/hr123@127.0.0.1:1521/XE control=bb_user_t_sqlldr.ctl log=bb_user_t_sqlloader.log

  bb_user_t_sqlloader.log內容如下:

SQL*Loader: Release 10.2.0.1.0 - Production on 星期四 11月 1 10:07:29 2018Copyright (c) 1982, 2005, Oracle. All rights reserved.控制文件: bb_user_t_sqlldr.ctl 數據文件: D:\sqluldr2\temp_001.csv 文件處理選項字符串: "STR X'0a'"錯誤文件: temp_001.bad廢棄文件: 未作指定(可廢棄所有記錄)要加載的數: ALL 要跳過的數: 1 允許的錯誤: ALL 綁定數組: 50000 行, 最大 2097152 字節 繼續: 未作指定 所用路徑: 常規表 BB_USER_T,已加載從每個邏輯記錄 插入選項對此表 APPEND 生效 TRAILING NULLCOLS 選項生效列名 位置 長度 中止 包裝數據類型 ------------------------------ ---------- ----- ---- ---- --------------------- "FIRST_NAME" FIRST 200 , CHARACTER NULL if "FIRST_NAME" = BLANKS "LAST_NAME" NEXT 200 , CHARACTER NULL if "LAST_NAME" = BLANKS "IF_VALID" NEXT 4 , CHARACTER NULL if "IF_VALID" = BLANKS "CREATE_DATE" NEXT * , DATE YYYY-MM-DD HH24:MI:SSNULL if "CREATE_DATE" = BLANKS "VIP_CARD" NEXT 64 , CHARACTER NULL if "VIP_CARD" = BLANKSROWS 參數所用的值已從 50000 更改為 2857表 BB_USER_T:95951433 行 加載成功。由于數據錯誤, 0 行 沒有加載。由于所有 WHEN 子句失敗, 0 行 沒有加載。由于所有字段都為空的, 0 行 沒有加載。為綁定數組分配的空間: 2097038 字節 (2857 行) 讀取 緩沖區字節數: 2097152跳過的邏輯記錄總數: 1 讀取的邏輯記錄總數: 95951433 拒絕的邏輯記錄總數: 0 廢棄的邏輯記錄總數: 0從 星期四 11月 01 10:07:29 2018 開始運行 在 星期四 11月 01 10:32:10 2018 處運行結束經過時間為: 00: 24: 41.28 CPU 時間為: 00: 04: 16.48

  經過時間為: 00: 24: 41.28

操作三》優化導入數據

提高 SQL*Loader 的性能
  1) 一個簡單而容易忽略的問題是,沒有對導入的表使用任何索引和/或約束(主鍵)。如果這樣做,甚至在使用ROWS=參數時,會很明顯降低數據庫導入性能。?
  2) 可以添加 DIRECT=TRUE來提高導入數據的性能。當然,在很多情況下,不能使用此參數。?常規導入可以通過使用 INSERT語句來導入數據。Direct導入可以跳過數據庫的相關邏輯(DIRECT=TRUE),而直接將數據導入到數據文件中,可以提高導入數據的 性能。當然,在很多情況下,不能使用此參數(如果主鍵重復的話會使索引的狀態變成UNUSABLE!)。
  3) 通過指定 UNRECOVERABLE選項,可以關閉數據庫的日志。這個選項只能和 direct 一起使用。?
  4) 可以同時運行多個導入任務。

sqlldr?? userid=/?? control=result1.ctl?? direct=true?? parallel=true?

當加載大量數據時(大約超過10GB),最好抑制日志的產生:???
??
? SQL>ALTER?? TABLE?? bb_user_t nologging;?

(SQL> ALTER ??TABLE ??bb_user_t ??logging;)
??
  這樣不產生REDO LOG,可以提高效率。然后在 CONTROL 文件中 load data 上面加一行:unrecoverable,? 此選項必須要與DIRECT共同應用。?

?

導入任務

  在導入數據時,我的是簡化版,一直報錯誤

  ORA-12952: 請求超出了允許的最大數據庫大小 4 GB

  我重新導出了一次約90000000萬條數據;

?

  生成的bb_user_t_sqlldr.ctl文件

?

  對bb_user_t_sqlldr.ctl文件修改

?

執行導入數據庫

  sqlldr hr/hr123@127.0.0.1:1521/XE control=bb_user_t_sqlldr.ctl log=bb_user_t_sqlloader.log DIRECT=TRUE parallel=true

?

  bb_user_t_sqlloader.log內容:

SQL*Loader: Release 10.2.0.1.0 - Production on 星期四 11月 1 13:58:49 2018Copyright (c) 1982, 2005, Oracle. All rights reserved.控制文件: bb_user_t_sqlldr.ctl 數據文件: D:\sqluldr2\temp_001.csv 文件處理選項字符串: "STR X'0a'"錯誤文件: temp_001.bad廢棄文件: 未作指定(可廢棄所有記錄)要加載的數: ALL 要跳過的數: 1 允許的錯誤: ALL 繼續: 未作指定 所用路徑: 直接- 具有并行選項。加載是 UNRECOVERABLE;產生無效的恢復操作。表 BB_USER_T,已加載從每個邏輯記錄 插入選項對此表 APPEND 生效 TRAILING NULLCOLS 選項生效列名 位置 長度 中止 包裝數據類型 ------------------------------ ---------- ----- ---- ---- --------------------- "FIRST_NAME" FIRST 200 , CHARACTER NULL if "FIRST_NAME" = BLANKS "LAST_NAME" NEXT 200 , CHARACTER NULL if "LAST_NAME" = BLANKS "IF_VALID" NEXT 4 , CHARACTER NULL if "IF_VALID" = BLANKS "CREATE_DATE" NEXT * , DATE YYYY-MM-DD HH24:MI:SSNULL if "CREATE_DATE" = BLANKS "VIP_CARD" NEXT 64 , CHARACTER NULL if "VIP_CARD" = BLANKS表 BB_USER_T:90056530 行 加載成功。由于數據錯誤, 0 行 沒有加載。由于所有 WHEN 子句失敗, 0 行 沒有加載。由于所有字段都為空的, 0 行 沒有加載。日期高速緩存:最大大小: 1000條目數: 2命中數 : 90056528未命中數 : 0在直接路徑中沒有使用綁定數組大小。 列數組 行數: 5000 流緩沖區字節數: 256000 讀取 緩沖區字節數: 2097152跳過的邏輯記錄總數: 1 讀取的邏輯記錄總數: 90056530 拒絕的邏輯記錄總數: 0 廢棄的邏輯記錄總數: 0 由 SQL*Loader 主線程加載的流緩沖區總數: 18936 由 SQL*Loader 加載線程加載的流緩沖區總數: 0從 星期四 11月 01 13:58:49 2018 開始運行 在 星期四 11月 01 14:01:49 2018 處運行結束經過時間為: 00: 02: 59.57 CPU 時間為: 00: 02: 14.21

  導入時間不到3分鐘。

導入數據時的其它問題:

  發現無法導入數據,從查詢日志如下:

  記錄 1: 被拒絕 - 表 BB_USER_T 出現錯誤。

  ORA-12952: 請求超出了允許的最大數據庫大小 4 GB

解決方法:因為ORACLE?10g?Express是簡化版,它具有一定的局限性,它的所有數據文件大小不能超過4G,內存使用不能超過1G,CPU只能使用1個。所以應該把它卸了,重新安裝完整版的oracle軟件。

希望對你有幫助,祝你有一個好心情,加油!

若有錯誤、不全、可優化的點,歡迎糾正與補充;轉載請注明出處!

總結

以上是生活随笔為你收集整理的Oracle使用sqluldr2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。