從SQLServer導數據到Oracle大概有以下幾種方法: 1. 使用SSMS的導出數據嚮導,使用Microsoft ODBC for Oracle或Oracle Provider for OLE DB連接到Oracle 2. 導出到平面文件 3. 導出包含數據的SQL腳本。 4. 使用ETL工具 ...
從SQLServer導數據到Oracle大概有以下幾種方法:
- 使用SSMS的導出數據嚮導,使用Microsoft ODBC for Oracle或Oracle Provider for OLE DB連接到Oracle
- 導出到平面文件
- 導出包含數據的SQL腳本。
- 使用ETL工具。
- 自己開發軟體。
以下使用第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
使用平面文件遷移數據,最大麻煩是就是特殊字元,或是有垃圾數據。如果原數據包含與字元分隔符相同的字元,如這裡面的“||”,或是有一些不可見的字元,如回車,換行符,等。這些字元會造成導入時,分割欄位錯位,導致導入錯誤,數據導不全,甚至導入失敗。
但從導出導入的速度來說,是最快的,平面文件可以跨不同的資料庫進行遷移。如果數據不容忍丟失,只能通過工具來導了,但速度會相對較慢。