從SQLServer導數據到Oracle大概有如下幾種方法:sql
如下使用第2種方法來進行數據遷移的。數據庫
使用BCP合適導出大容量數據。這裏導出千萬級別的數據,也是很快就能成功。oracle
若是導出時還須要作一些數據的處理,好比多表關聯,字符處理等,比較複雜的邏輯,最好是作成存儲過程,BCP直接調用存儲過程便可。ide
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中有已經建立好的表,與導入文件對應。this
把如下的內容用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中。code
sqlldr user/"user_password" control=import-t1.ctl
默認下,生成的日誌文件在當前目錄下。不管成功與否,必定要查看日誌。看看是否導入成功或失敗,或是部分紅功。導入的問題通常從日誌文件便可找到。ip
若是有錯誤,還會生成與導入文件同名的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
使用平面文件遷移數據,最大麻煩是就是特殊字符,或是有垃圾數據。若是原數據包含與字符分隔符相同的字符,如這裏面的「||」,或是有一些不可見的字符,如回車,換行符,等。這些字符會形成導入時,分割字段錯位,致使導入錯誤,數據導不全,甚至導入失敗。
但從導出導入的速度來講,是最快的,平面文件能夠跨不一樣的數據庫進行遷移。若是數據不容忍丟失,只能經過工具來導了,但速度會相對較慢。