Linked server和SSIS連線Oracle時的常見問題

apgcdsd發表於2011-08-15

1. Linked server去連線oracle的時候,是按照SQL Server 引擎的版本去載入oracle provider的版本。如果SQL Server64bit的,只能載入64 bit oracleprovider32bitSQL Server只能使用32bitoracleprovider

2. 很多SQL Server圖形介面工具都是32bit的,比如SSIS32位的 import/export wizard,這些32bit的工具只能load 32 bitoracle provider。如果想知道這個工具是不是32bit的,去檢查工具所對應的exe檔案是不是在program files(x86)子路徑下。

3. Linked server 連線oracle的時候,首先會讀取tnsname.ora檔案,然後讀取sqlnet.ora檔案,然後用SQLServr.exe直接去連oracle,連線成功以後會再次讀取tnsname.ora檔案,然後開始載入oracle OLEDBDLL檔案。在64位作業系統上安裝的32SQL Server中,讀到的路徑是這樣的:

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.2.118)(PORT=1521))(CONNECT_DATA=(SID=express)(CID=(PROGRAM=D:\Program Files (x86)\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe)(HOST=SCT-IT-SQLTEST)(USER=SYSTEM))))

64 bit的作業系統上按照32 bitSQL Server伺服器以及32 bitoracle客戶端,是可以建立linked serverSSIS程式包的。但是,oracle在處理包含括號檔案全路徑名稱時有個bug,這個bug8i,9i10g的版本上都存在。必須通過打oracle的補丁來解決。

以下報錯由Oracle bug引起(以下參考了官方定義關於此bug的文件):

主題:64Windows作業系統上執行32Oracle報錯ORA-12154或者 ORA-6413

原文件 ID: 334528.1

症狀:如果在64Windows作業系統上執行32Oracle客戶端,自Windows平臺使用ODBCOLEDBOO4OODP.NET四種介面之一嘗試聯接Oracle資料庫時,將遇到以下報錯資訊

ORA-12154: TNS:could not resolve the connect identifier specified

或者

ORA-6413: Connection not open. Cause64-bit Microsoft OS's install 32-bit applications into the following location

"C:\Program Files (x86)\..."

rather than the typical location of

"C:\Program Files\..."

這將導致發生現有網路的錯誤,因為網路層無法解析程式地址中包含的可執行檔案是試圖連線到Oracle的路徑括號。

這個bug已被提出來如下修正方案:

Bug 3807408 - CANNOT EXTERNALLY AUTHENTICATE USER WITH QUOTE IN USERNAME

更多資訊

之所以遇到ORA-6413ORA-12154這是一般是取決於您選擇用於連線到Oracle的程式設計介面。

錯誤ORA-12154是當使用最新的OCI介面連線時的典型錯誤,介面包括

Oracle ODBC Driver

Oracle Provider for OLE DB

Oracle Objects for OLE

Oracle Data Provider for .NET (ODP.NET)

Microsoft's .NET Managed Provider for Oracle

錯誤ORA-6413則是使用舊版本的介面,即呼叫Oracle OCI API 7版本的介面:

Microsoft ODBC Driver for Oracle

Microsoft OLE DB Provider for Oracle

解決方案有如下兩種

解決1:

使用Oracle軟體包含Bug 3807408補丁的版本

注意目前為止已釋出適用於Windows的補丁有:

Windows 32-bit

9.2.0.7.0 Patch 6: Apply Patch 4928723 or later

10.2.0.1.0 Patch 4: Apply Patch 4923768 or later

10.2.0.2.0 Patch 5: Apply Patch 5383042 or later

10.2.0.3.0: Apply Patch 5337014 or later

Windows 64-bit AMD64 and INTEL EM64T

10.2.0.1.0 Patch 4: Apply Patch 4923787 or later

10.2.0.2.0 Patch 5: Apply Patch 5388871 or later

10.2.0.3.0: Apply Patch 5337014 or later

對於其他版本的Windows平臺請使用解決方案2

解決方案 2:

找到報錯的應用程式路徑,檢查是否含有括號,如何有,請重新配置該應用到一個沒有括號的路徑中

4. 如果使用64 bitSQL Server伺服器和64 bit oracle 客戶端,linked server是可以工作的。但是oracle64 bitOLEDB provider上有個bug,會導致連線伺服器訪問失敗

報錯資訊如:Msg 7333, Level 16, State 2, Line 1

Cannot fetch a row using a bookmark from OLE DB provider "OraOLEDB.Oracle" for

linked server .

這個問題在32位環境下使用32 MSDAORA (Microsoft’s OLEDB Provider for Oracle) provider或者32-bit ORAOLEDB (Oracle’s OLEDB Provider) provider時不會發生。只發生在使用64-bit ORAOLEDB provider時(MSDAORA沒有64位版本存在)。

這是一個與Oracle64OLEDB provider的已知問題。多數情況下,客戶發生錯誤資訊到Oracle或通過Oracle補丁或升級Oracle提供程式解決了這一問題。

最新64Oracle OLE DB provider版本是10.2.0.3.00. 如果使用者在使用低版本,升級即可解決。

對此問題Oracle正事補丁#5084517Oracle關於bug1023的前提補丁# 6166400也解決了早期部分使用者的這一問題。看起來這些版本補丁都包含最新的Oracle provider

5. 如果在一個64 位的SQL Server上想同時使用linked serverSSISBIDS去連oracle,必須要同時安裝64 位和32位的oracle客戶端。但是,在oracle 10g早期的版本中,貌似有一個bug導致oracle 10g32 位和64 位客戶端無法同時在一臺機器上工作。不確定這個問題是否已經被解決。目前11g32bit 64bit Oracle客戶端同時安裝在一個機器上沒有遇到這樣的問題。

6. 32 位上還可以使用oracleODBC driver 建立ODBC資料來源,然後在建立linked server時候使用Microsoft OLEDB for ODBC provider 然後指向oracleODBC資料來源。如果是64位的SQL Server 2005,預設安裝是沒有64bitMicrosoft OLEDB for ODBC provider的。需要去下載並安裝64  Microsoft OLEDB for ODBC provider,然後就可以按照同樣的方法使用oracleODBChttp://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=en

7. 使用oracle ODBC provider比較容易遇到中文字元的問題,建議儘量使用OLEDBprovider

8. SQL Server對於oracle client OLEDBODBC的支援和test只到oracle 8.17的最後版本.這個版本中對於一些資料型別,比如blob欄位是不支援的。如果使用9i以及後續版本的oracle client,不能保證在連線和使用中不遇到任何相容性問題。任何相容性問題,微軟都不保證一定能解決方案。

9. 對於oracle client 9i10g的版本,Microsoft .netoracle provider提供了相容性支援。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25175503/viewspace-704916/,如需轉載,請註明出處,否則將追究法律責任。

相關文章