Freigeben über


Linked server和SSIS连接Oracle时的常见问题

1. Linked server去连接oracle的时候,是按照SQL Server 引擎的版本去载入oracle provider的版本。如果SQL Server是64bit的,只能载入64 bit oracle的provider。32bit的SQL Server只能使用32bit的oracle的provider。

2. 很多SQL Server的图形界面工具都是32bit的,比如SSIS,32位的 import/export wizard,这些32bit的工具只能load 32 bit的oracle provider。如果想知道这个工具是不是32bit的,去检查工具所对应的exe文件是不是在program files(x86)子路径下。

3. Linked server去 连接oracle的时候,首先会读取tnsname.ora文件,然后读取sqlnet.ora文件,然后用SQLServr.exe直接去连oracle,连接成功以后会再次读取tnsname.ora文件,然后开始载入oracle OLEDB的DLL文件。在64位操作系统上安装的32位SQL 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 bit的SQL Server服务器以及32 bit的oracle客户端,是可以创建linked server和SSIS程序包的。但是,oracle在处理包含括号文件全路径名称时有个bug,这个bug在8i,9i和10g的版本上都存在。必须通过打oracle的补丁来解决。

以下报错由Oracle bug引起(以下参考了官方定义关于此bug的文档):

主题: 在64位Windows操作系统上运行32位Oracle报错ORA-12154或者 ORA-6413

原文档 ID: 334528.1

症状:如果在64位Windows操作系统上运行32位Oracle客户端,自Windows平台使用ODBC 、OLEDB 、OO4O 、ODP.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-6413或ORA-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 bit的SQL Server服务器和64 bit 的oracle 客户端,linked server是可以工作的。但是oracle在64 bit的OLEDB 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 <linked server name>.

这个问题在32位环境下使用32位 MSDAORA (Microsoft’s OLEDB Provider for Oracle) provider或者32-bit ORAOLEDB (Oracle’s OLEDB Provider) provider时不会发生。只发生在使用64-bit ORAOLEDB provider时(MSDAORA没有64位版本存在)。

这是一个与Oracle的64位OLEDB provider的已知问题。多数情况下,客户发生错误信息到Oracle或通过Oracle补丁或升级Oracle提供程序解决了这一问题。

最新64位Oracle OLE DB provider版本是10.2.0.3.00. 如果用户在使用低版本,升级即可解决。

对此问题Oracle正事补丁#5084517,Oracle关于bug1023的前提补丁# 6166400也解决了早期部分用户的这一问题。看起来这些版本补丁都包含最新的Oracle provider

5. 如果在一个64 位的SQL Server上想同时使用linked server和SSIS的BIDS去连oracle ,必须要同时安装64 位和32位的oracle客户端。但是,在oracle 10g早期的版本中,貌似有一个bug导致oracle 10g的32 位和64 位客户端无法同时在一台机器上工作。不确定这个问题是否已经被解决。目前11g的32bit 和64bit Oracle客户端同时安装在一个机器上没有遇到这样的问题。

6. 32 位上还可以使用oracle的ODBC driver 创建ODBC数据源,然后在创建linked server时候使用Microsoft OLEDB for ODBC provider 然后指向oracle的ODBC数据源。如果是64位的SQL Server 2005,默认安装是没有64bit的Microsoft OLEDB for ODBC provider的。需要去下载并安装64 位 Microsoft OLEDB for ODBC provider,然后就可以按照同样的方法使用oracle的ODBC。https://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=en

7. 使用oracle ODBC provider比较容易遇到中文字符的问题,建议尽量使用OLEDB的provider

8. SQL Server对于oracle client OLEDB和ODBC的支持和test只到oracle 8.17的最后版本.这个版本中对于一些数据类型,比如blob字段是不支持的。如果使用9i以及后续版本的oracle client,不能保证在连接和使用中不遇到任何兼容性问题。任何兼容性问题,微软都不保证一定能解决方案。

9. 对于oracle client 9i和10g的版本,Microsoft .net的oracle provider提供了兼容性支持。