您的当前位置:首页正文

SSIS连接Oracle参考

2021-08-07 来源:汇智旅游网
SSIS连接Oracle参考

Wu Shuo

Vanceinfo

相关知识:

1, 理解服务器之间的访问机制:连接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)子路径下,或者在进程管理器中检查是否带有32字样。

3,

Linked server或SSIS去 连接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))))

1

在64 bit的操作系统上按照32 bit的SQL Server服务器以及32 bit的oracle客户端,是可以创建linked server和SSIS程序包的。但是,oracle在处理包含括号文件全路径名称时有个bug,这个bug在8i,9i和10g的版本上都存在。必须通过打oracle的补丁来解决。

4,

如果使用64 bit的SQL Server服务器和64 bit 的oracle 客户端,linked

server和SSIS是可以工作的。但是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 . 这个问题在32位环境下使用32位 MSDAORA (Microsoft’s OLEDB Provider for Oracle) provider或者32-bit ORAOLEDB (Oracle’s OLEDB Provider) provider时不会发生。只发生在使用64-bit ORAOLEDB provider时(MSDAORA没有64位版本存在)。

5,

如果在一个64 位的SQL Server上想同时使用linked server和SSIS的

BIDS去连oracle,必须要同时安装64 位和32位的oracle客户端。但是,在oracle 10g早期的版本中,貌似有一个bug导致oracle 10g的32 位和64 位客户端无法同时在一台机器上工作。我这次在11g和10g上都安装了双客户端,没有遇到这个问题,但不确定该问题是否已经被解决。

6,

32 位上还可以使用oracle的ODBC driver 创建ODBC数据源,然后在创建

连接的时候使用Microsoft OLEDB for ODBC provider 然后指向oracle的ODBC数据源。如果是64位的SQL Server 2005,默认安装是没有64bit的Microsoft OLEDB for

2

ODBC provider的。需要去下载并安装64 位 Microsoft OLEDB for ODBC provider,然后就可以按照同样的方法使用

oracle

ODBC。

http://www.microsoft.com/downloads/details.aspx?FamilyID=000364db-5e8b-44a8-b9be-ca44d18b059b&displaylang=en

7,

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

OLEDB的provider。

步骤:

1,

根据Oracle版本(10g或11g),安装相对应的64位客户端Administrator

模式,并配置相应的LISTENER和SERVICE NAME。

3

2, 安装32位Administrator模式客户端,并配置相应的LISTENER和

SERVICE NAME。

3,

在SSIS中使用Oracle Provider for OLEDB连接即可。

常见问题:

1,

设计时运行正常,运行时报TNS无法解析的错误。

在BIDS设计环境下,只有32位的本地服务命名可以正确连接。而在运行时需要64位程序调用包时(例如SQLServer存储过程),则需要改为64位命名。因此,我建议在

4

双客户端下都建立本地服务命名,并以包配置的形式保存连接字符串。这样在切换运行环境时,只需要修改一下连接串中的命名即可。

2,

遇到Oracle数据可以预览,但执行ETL出错的问题。

检查SSIS工程属性,将Run64BitRuntime置为False。

3,

执行包正常,用作业调用时包卡住。

检查包日志。一般来说此类问题是SQL Server Agent操作账号的权限不够,无法获取全部Oracle连接信息导致。将SQL Server Agent操作账号从Local System改为Administrator即可。

5

4,

RAC集群连接

当配置oracle客户端服务名以便应用程序访问ORACLE数据库时,一般使用oracle实例的虚IP。这样当ORACLE RAC 中的一个实例DOWN掉后,ORACLE RAC会自动切换到另一个实例。但是通过这样配置的ORACLE 服务名,客户端在利用它连接ORACLE数据库时,会经常提示ORA-12545错误。关于连接Oracle RAC 找不到主机问题,请尝

6

试以下方法看是否能解决:

方法一:修改ORACLE客户端所在的机器上的HOSTS文件来解决这个问题。 HOSTS文件位于C:\\Windows\\System32\\drivers\\etc\\hosts 。在hosts文件中加入ORACLE RAC节点的主机名解析,包括虚IP。例如,当前我们线上环境ORACLE RAC的配置为:

节点1:实际IP: 10.0.7.37 虚拟IP:10.0.7.33 主机名: zsxtdb1-vip 节点2:实际IP: 10.0.7.36 虚拟IP:10.0.7.34 主机名: zsxtdb2-vip 则可在HOSTS文件中加入: 10.0.7.37 zsxtdb1-vip 10.0.7.33 zsxtdb1-vip 10.0.7.36 zsxtdb2-vip 10.0.7.34 zsxtdb2-vip

再次通过客户端访问ORACLE数据库,问题解决。

方法二:在DNS服务器中加入ORACLE RAC节点的主机名解析(这个需要网络服务器配置,无需修改客户端)

另附TNS配置信息供参考: ZSXT =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = zsxtdb2-vip)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = zsxtdb1-vip)(PORT = 1521)) (LOAD_BALANCE = yes) (CONNECT_DATA = (SERVER = DEDICATED)

7

(SERVICE_NAME = zsxt) ) ) ZSXT2 = (DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = zsxtdb2-vip)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = zsxt) (INSTANCE_NAME = zsxt2) ) ) ZSXT1 = (DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = zsxtdb1-vip)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = zsxt) (INSTANCE_NAME = zsxt1) )

8

因篇幅问题不能全部显示,请点此查看更多更全内容