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 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 因篇幅问题不能全部显示,请点此查看更多更全内容