如何快速批量導入非Oracle DB格式的數據--sqlloader

前言

在 Oracle 數據庫中,咱們一般在不一樣數據庫的表間記錄進行復制或遷移時會用如下幾種方法:html

  1. A表記錄利用toad或者pl/sql工具將其導出爲一條條分號隔開的insert語句,而後再執行插入到B表中
  2. 創建數據庫間的dblink,而後使用 create table B as select from A@dblink where...,或者insert into B select from A@dblink where...
  3. exp/expdp A表,再imp/impdp到B表
  4. 那麼除了上面的三種經常使用的方法,還有其餘比較好的方法進行數據遷移嗎,下面介紹oracle自帶的Sql Loader(sqlldr)的用法。

sqlloader簡介

sqlloaderOracle用於數據遷移、將數據從外部文件加載到Oracle數據庫的表中,它具備強大的數據解析引擎,對數據文件中數據的格式幾乎沒有限制。sql

Description of sut81088.gif follows

基本的組成由:數據庫

*.ctl:控制文件,與表信息相關,數據入表的邏輯處理(數據加載信息,解析數據,導入數據信息)windows

*.bad :執行bat後自動生成,錯誤日誌,保存導入文件出現錯誤的記錄併發

*.log :執行bat後自動生成,日誌文件,能夠查看導入的狀況oracle

*.dis:廢棄文件app

經常使用的參數命令:函數

  • userid -- ORACLE 用戶名/口令
  • control -- 控制文件名,默認 格式 *.ctl
  • log -- 記錄導入時的日誌文件,默認爲 控制文件(去除擴展名).log
  • bad -- 壞數據文件,默認爲 控制文件(去除擴展名).bad
  • data -- 數據文件,通常在控制文件中指定。用參數控制文件中不指定數據文件更適於自動操做
  • discard -- 廢棄文件名
  • discardmax -- 容許廢棄的文件的數目
  • skip -- 要跳過的邏輯記錄的數目 (默認 0)
  • load -- 要加載的邏輯記錄的數目 (所有默認)
  • rows -- 對於傳統常規路徑(Conventional Path)導入的狀況,表明一次提交(Commit)的行數(默認:6 最大值:65534)
  • bindsize -- 每次提交記錄的緩衝區的最大值(僅適用於傳統常規路徑加載),默認256000 Bytes
  • readsize -- 讀取緩衝區的大小 (適用於傳統常規路徑和直接路徑加載),默認 1048576。
  • errors -- 容許的錯誤記錄數,能夠用他來控制一條記錄都不能錯 (默認 50)
  • silent -- 運行過程當中隱藏消息 (標題,反饋,錯誤,廢棄,分區)
  • direct -- 使用直接路徑 (默認 FALSE)
  • parfile -- 參數文件: 包含參數說明的文件的名稱
  • parallel -- 執行並行加載 (默認 FALSE)
  • file -- 要從如下對象中分配區的文件
ROWS

對於傳統常規路徑(Conventional Path)導入的狀況,表明一次提交(Commit)的行數(默認:6 最大值:65534)工具

BINDSIZE大數據

經過配置BINDSIZE的值,加快加載導入效率,並且配置的值要比默認值和經過參數ROWS計算的緩衝區大小更優先。
即BINDSIZE可以制約ROWS,若是ROWS提交的數據須要的緩衝區大於BINDSIZE的配置值,會以BINDSIZE的設定爲準

※在設定參數時,必定要同時考慮ROWS和BINDSIZE的設定。

READSIZE
讀取緩衝區的大小 (適用於傳統常規路徑和直接路徑加載),默認 1048576。

READSIZE負責讀取的緩衝區大小,而BINDSIZE負責提交的緩衝區大小,若是READSIZE小於BINDSIZE,那麼READSIZE會自動增長。

經過設置READSIZE爲更大的值,能夠在提交前讀取更多的數據到Buffer中去

sqlloader安裝

  1. 下載並解壓軟件

地址:https://www.oracle.com/databa...

下載包:

  • sqlloader所需的基礎包:instantclient-basic-windows.x64-19.6.0.0.0dbru.zip
  • sqlloader工具包: instantclient-tools-windows.x64-19.6.0.0.0dbru.zip
NOTE:直接下載oracle client客戶端便可

使用方式

使用一個控制文件(*.ctl) 和一個數據文件(*.csv),步驟以下:

  • 首先在數據庫中建立好須要導入數據的表;
  • 建立數據文件,*.csv 文件等類型的文件;
  • 建立控制文件 *.ctl,數據入表的邏輯處理。
  • 執行sqload命令加載導入數據

1). 首先在數據庫中建立好須要導入數據的表

create table user_info  (
   userid int,

   username varchar2(50),

   address varchar2(500),

   sex  varchar2(2),

   phone_number varchar2(13)

   email  varchar2(50),

   certificate_no VARCHAR2(20)

)

2). 創建數據文件, users_data.csv 文件

01412401,李四,廣東深圳龍華,M,13444455568,WJ@email.com,310101198504069999
01412402,張三,廣東深圳龍華,M,13444455567,HH@email.com,310101198504069998
01412403,王二,廣東深圳福田,M,13444455566,WJ@email.com,310101198504069997
01412404,李達,廣東深圳南山,M,13444455565,HH@email.com,310101198504069996

3). 創建一個控制文件 users_load_data.ctl

OPTIONS (skip=1,rows=128) -- sqlldr 命令顯示的 選項能夠寫到這裏邊來,skip=1 用來跳過數據中的第一行 ,rows=128 表明每128行數--據提交一次
LOAD DATA  
INFILE "/home/oracle/script/users_data.csv" --指定外部數據文件,能夠寫多 個 INFILE "another_data_file.csv" 指定多個數據文件  
--這裏還可使 用 BADFILE、DISCARDFILE 來指定壞數據和丟棄數據的文件,  
--truncate --操做類型,用 truncate table 來清除表中原有 記錄  
append INTO TABLE test_users -- 要插入記錄的表,這裏插入到另一張表裏  
Fields terminated by "," -- 數據中每行記錄用 "," 分隔  
Optionally enclosed by '"' -- 數據中每一個字段用 '"' 框起,好比字段中有 "," 分隔符時  
trailing nullcols --表的字段沒有對應的值時允 許爲空  
(  
  virtual_column FILLER, --這是一個虛擬字段,用來跳 過由 PL/SQL Developer 生成的第一列序號  
  userid,  
  username,  
  address ,  
  phone_number,
  email  ,
  certificate_no  
)

在操做類型 truncate 位置可用如下中的一值:

  • insert :爲缺省方式,在數據裝載開始時要求表爲空
  • append:在表中追加新記錄
  • replace:刪除舊記錄(用 delete from table 語句),替換成新裝載的記錄
  • truncate :刪除舊記錄(用 truncate table 語句),替換成新裝載的記錄

時間類型轉換

字段 DATE "YYYY-MM-DD HH24:MI:SS" -- 指定接受日期的格式,至關用 to_date() 函數轉換

4).執行命令

普通版:

在安裝好sqlload命令目錄中打開CMD命令,

而後再命令行窗口執行:

sqlldr userid=username/password@ip:port/dbName control=d:users_load_data.ctl log=d:userload.log
普通導入速度比較慢,一秒才幾條,這樣導入跟一條條插入數據差很少,所以應該善用其參數,加快加載導入數據

升級版:

將命令行改爲這樣:

sqlldr userid=username/password@ip:port/dbName control=d:users_load_data.ctl log=d:userload.log errors=100000 bindsize=8000000 rows=5000
這樣能夠配置能夠在一秒1萬條左右,加快導入速度,節省了不少時間。

NOTE:

當加載海量數據時(大約超過10GB),最好禁止日誌的產生,這樣不產生REDO LOG,能夠提升效率,在 CONTROL 文件中 load data 上面加一行:unrecoverable, 此選項必需要與DIRECT共同應用.

對於超大數據文件的導入就要用併發操做了,即同時運行多個導入任務.parallel=true

各位看官還能夠嗎?喜歡的話,動動手指點個💗,點個關注唄!!謝謝支持!
歡迎關注公衆號【Ccww技術博客】,原創技術文章第一時間推出

相關文章
相關標籤/搜索