SQLServer導數據到Oracle


從SQLServer導數據到Oracle大概有以下幾種方法:

  1. 使用SSMS的導出數據向導,使用Microsoft ODBC for Oracle或Oracle Provider for OLE DB連接到Oracle
  2. 導出到平面文件
  3. 導出包含數據的SQL腳本。
  4. 使用ETL工具。
  5. 自己開發軟件。

以下使用第2種方法來進行數據遷移的。

使用BCP合適導出大容量數據。這里導出千萬級別的數據,也是很快就能成功。

如果導出時還需要做一些數據的處理,比如多表關聯,字符處理等,比較復雜的邏輯,最好是做成存儲過程,BCP直接調用存儲過程即可。

BCP "exec TestDB.dbo.export_t1 " queryout d:\export\t1.txt -c -t"||" -S"192.168.1.100" -Urpt -Prpt123
pause
USE TestDB
GO

CREATE PROC [dbo].[export_usercar]
AS
    SELECT  [carId]
           ,CONVERT(NVARCHAR(30), [addTime], 120)
           ,CONVERT(NVARCHAR(30), [lastSearchTime], 120)
           ,CONVERT(NVARCHAR(30), [updateTime], 120)
           ,[carType]
           ,[userTelephone]
           ,[isCorrect]
           ,[userId]
           ,[validFlag]
           ,[Channel]
           ,[carCode]
           ,[engineNumber]
           ,[carNumber]
    FROM    [TestDB].[dbo].[t1] WITH ( NOLOCK )
    WHERE   validFlag = 1
            AND isCorrect = 1;

把導出文件上傳到Oracle所在的主機上,如CentOS下。

使用Oracle的SQL*LOADER導入平面文件。假如Oracle中有已經創建好的表,與導入文件對應。

把以下的內容用vi,寫到import-t1.ctl

load data
CHARACTERSET 'ZHS16GBK'
infile '/data/import/t1.txt' "str '\r\n'"
into table SCOTT.T1
fields terminated by '||' TRAILING NULLCOLS
(
carId, 
addTime DATE "YYYY-MM-DD HH24:MI:SS",
lastSearchTime DATE "YYYY-MM-DD HH24:MI:SS",
updateTime DATE "YYYY-MM-DD HH24:MI:SS",
carType ,
userTelephone  ,
isCorrect  ,
userId  ,
validFlag ,
Channel ,
carCode  ,
engineNumber ,
carNumber  
)

使用SQL*LOADER注意幾個問題:

  • 字符編碼
  • 字段分隔符
  • 行結束符
  • 日期或時間格式
  • 特殊字符
  • 導入字段的順序
  • 導文件文件的表字段類型和長度是否合適

使用sqlldr命令把數據導入到Oracle中。

sqlldr user/"user_password" control=import-t1.ctl

默認下,生成的日志文件在當前目錄下。無論成功與否,一定要查看日志。看看是否導入成功或失敗,或是部分成功。導入的問題一般從日志文件即可找到。

如果有錯誤,還會生成與導入文件同名的t1.bad文件。

以下是日志文件,顯示數據導入的一些信息。成功導入了18495032行記錄,沒有導入失敗的記錄。

[oracle@ttoracle /data/import]$ cat import-t1.log 

SQL*Loader: Release 11.2.0.1.0 - Production on Fri Jun 15 12:46:09 2018

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Control File:   import-t1.ctl
Character Set ZHS16GBK specified for all input.

Data File:      /data/import/t1.txt
  File processing option string: "str '
'"
  Bad File:     t1.bad
  Discard File:  none specified
 
 (Allow all discards)

Number to load: ALL
Number to skip: 0
Errors allowed: 50
Bind array:     64 rows, maximum of 256000 bytes
Continuation:    none specified
Path used:      Conventional

Table SCOTT.T1, loaded from every logical record.
Insert option in effect for this table: INSERT
TRAILING NULLCOLS option in effect

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
CARID                               FIRST     *           CHARACTER            
    Terminator string : '||'
ADDTIME                              NEXT     *           DATE YYYY-MM-DD HH24:MI:SS
    Terminator string : '||'
LASTSEARCHTIME                       NEXT     *           DATE YYYY-MM-DD HH24:MI:SS
    Terminator string : '||'
UPDATETIME                           NEXT     *           DATE YYYY-MM-DD HH24:MI:SS
    Terminator string : '||'
CARTYPE                              NEXT     *           CHARACTER            
    Terminator string : '||'
USERTELEPHONE                        NEXT     *           CHARACTER            
    Terminator string : '||'
ISCORRECT                            NEXT     *           CHARACTER            
    Terminator string : '||'
USERID                               NEXT     *           CHARACTER            
    Terminator string : '||'
VALIDFLAG                            NEXT     *           CHARACTER            
    Terminator string : '||'
CHANNEL                              NEXT     *           CHARACTER            
    Terminator string : '||'
CARCODE                              NEXT     *           CHARACTER            
    Terminator string : '||'
ENGINENUMBER                         NEXT     *           CHARACTER            
    Terminator string : '||'
CARNUMBER                            NEXT     *           CHARACTER            
    Terminator string : '||'


Table SCOTT.T1:
  18495032 Rows successfully loaded.
  0 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.


Space allocated for bind array:                 214656 bytes(64 rows)
Read   buffer bytes: 1048576

Total logical records skipped:          0
Total logical records read:      18495032
Total logical records rejected:         0
Total logical records discarded:        0

Run began on Fri Jun 15 12:46:09 2018
Run ended on Fri Jun 15 12:55:58 2018

Elapsed time was:     00:09:48.90
CPU time was:         00:03:37.62

使用平面文件遷移數據,最大麻煩是就是特殊字符,或是有垃圾數據。如果原數據包含與字符分隔符相同的字符,如這里面的“||”,或是有一些不可見的字符,如回車,換行符,等。這些字符會造成導入時,分割字段錯位,導致導入錯誤,數據導不全,甚至導入失敗。

但從導出導入的速度來說,是最快的,平面文件可以跨不同的數據庫進行遷移。如果數據不容忍丟失,只能通過工具來導了,但速度會相對較慢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM