天天看点

Oracle 异构服务实践

近期公司准备开发一个计费项目,数据库当然还是选用我最信赖的Oracle了。由于一部分基础数据在一台Win2000 Server的SQL Server 7.0数据库中,需要考虑灵活、可靠的方法实现从Or 

acle数据库端访问SQL Server中的数据。于是我有机会真正体验Oracle 9I 中的新增强功能“异构服务”(Heterogeneous Services)并为此痛苦了近两天。

先简单介绍一下Oracle异构服务。它是包含在Oracle数据库中的一个模块,通过使用透明网关(Transparent Gateway)或通用连接(Generic Connectivity)来访问其它非Oracle系统的数据。异构服务的主要结构如下:

各模块简要说明如下:

异构服务模块:属于Oracle数据库的内核部分,负责大部分异构连接的处理;

代理通用代码:对所有基于异构服务产品的通用代码;

驱动:是与非Oracle系统直接交互的模块,实现从异构服务API到特定非Oracle系统API的映射。

代理:是Oracle Server连接非Oracle系统的进程,包括两部分即代理通用代码和针对特定非Oracle系统的驱动。代理的位置可以与非Oracle系统在同一台机器上,或与Oracle Server在同一台机器上,或者单独在一台机器上。我这次实践的环境采用的是最后一种。

Oracle 异构服务实践

我们所说的透明网关和通用连接实际是异构服务中代理的两种类型。其中透明网关是功能较强的,它通过代理进程从Oracle Server访问各地的异构分布式数据库,而提供给用户的感觉是这些数据库仍然是Oracle数据库,Oracle公司提供对大多数商业数据库的透明网关。通用连接则有较多限制,它使用用户自己提供的ODBC或OLE DB驱动程序作为异构服务的代理驱动,并且要求这些驱动必须要安装在Oracle Server的$ORACLE_HOME目录下。

好了,让我们开始亲自动手吧!我的实验环境如下:

主机

操作系统

软件环境

ORADB

Redhat linux 7.2

Oracle 9.0.1 Database Standard Edition

GATEWAY

windows 2000 Professional

SQL Server 2000 (安装类型“仅连接”)

SQLDB

Windows 2000 Server

SQL Server 7.0(访问的数据库是CDR)

注意:Transparent Gateway for Microsoft SQL Server目前只有NT版本,因此网关程序tg4msql仅包含在Oracle Database for windows中。

系统结构:

Oracle 异构服务实践

配置过程:

从SQLDB开始:

1. 在SQLDB上创建将要从Oracle数据库访问SQL Server的用户testuser/testuser,并授予可访问CDR的权限;

接下来是GATEWAY:

1.安装好Oracle 9.0.1 Database for Windows后,会发现在%ORACLE_HOME%下有目录tg4msql,以及网关程序$ORACLE_HOME\BIN\tg4msql;

2. 确保在c:\winnt\system32下有ntwdblib.dll,若没有则安装SQL Server2000(安装类型选择“仅连接”)。此文件是访问SQL Server的DB-Library;

3. ping SQLDB看是否通,若不通则在\winnt\system32\drivers\etc\hosts文件中增加一行,用来解析SQLDB的IP地址,很简单不多说了。

4. 修改%ORACLE_HOME%\tg4msql\inittg4msql.ora,这是网关进程启动时需要的初始化文件。只需改下面这一行即可:

HS_FDS_CONNECT_INFO=SQLDB.CDR

5.修改%ORACLE_HOME%\network\admin\listener.ora如下:

LISTENER =

(ADDRESS_LIST=

(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))

)

SID_LIST_LISTENER=

(SID_LIST=

(SID_DESC=

(SID_NAME=tg4msql)

(ORACLE_HOME=e:\Oracle\OraHome_9I) #用你的%ORACLE_HOME%

(PROGRAM=tg4msql)

)

最后是ORADB:

1.修改tnsnames.ora

CDR = #CDR是我起的,你可以选用其它

(DESCRIPTION =

(ADDRESS = 

(PROTOCOL = TCP)

(HOST= GATEWAY)

(PORT = 1521)

(CONNECT_DATA =

(SID = tg4msql) #tg4msql必须要和GATEWAY上listener.ora中的SID一致

(HS = OK) #这很重要,告诉Oracle Server要调用异构服务模块来处理

2.修改initora9i.ora(数据库初始化文件)

global_names=true,重启数据库。

否则会在执行sql时报错:ORA-02085: 数据库链接CDR与HO.WORLD相连结

原因如下:The GLOBAL_NAMES parameter when set to TRUE implies that database link name should be similar to the Global database name to which you are trying to connect.

3.创建访问SQLDB.CDR的数据库链接

SQL>create public database link cdr connect to testuser identified by testuser using ‘CDR’;