近期公司准备开发一个计费项目,数据库固然仍是选用我最信赖的Oracle了。因为一部分基础数据在一台Win2000 Server的SQL Server 7.0数据库中,须要考虑灵活、可靠的方法实现从Or
acle数据库端访问SQL Server中的数据。因而我有机会真正体验Oracle 9I 中的新加强功能“异构服务”(Heterogeneous Services)并为此痛苦了近两天。linux
先简单介绍一下Oracle异构服务。它是包含在Oracle数据库中的一个模块,经过使用透明网关(Transparent Gateway)或通用链接(Generic Connectivity)来访问其它非Oracle系统的数据。异构服务的主要结构以下:sql
各模块简要说明以下:数据库
异构服务模块:属于Oracle数据库的内核部分,负责大部分异构链接的处理;windows
代理通用代码:对全部基于异构服务产品的通用代码;tcp
驱动:是与非Oracle系统直接交互的模块,实现从异构服务API到特定非Oracle系统API的映射。分布式
代理:是Oracle Server链接非Oracle系统的进程,包括两部分即代理通用代码和针对特定非Oracle系统的驱动。代理的位置能够与非Oracle系统在同一台机器上,或与Oracle Server在同一台机器上,或者单独在一台机器上。我此次实践的环境采用的是最后一种。ide
咱们所说的透明网关和通用链接实际是异构服务中代理的两种类型。其中透明网关是功能较强的,它经过代理进程从Oracle Server访问各地的异构分布式数据库,而提供给用户的感受是这些数据库仍然是Oracle数据库,Oracle公司提供对大多数商业数据库的透明网关。通用链接则有较多限制,它使用用户本身提供的ODBC或OLE DB驱动程序做为异构服务的代理驱动,而且要求这些驱动必需要安装在Oracle Server的$ORACLE_HOME目录下。测试
好了,让咱们开始亲自动手吧!个人实验环境以下:this
主机
软件环境
ORADB
Redhat linux 7.2
Oracle 9.0.1 Database Standard Edition
GATEWAY
windows 2000 Professional
Oracle 9.0.1 Database Standard Edition
SQL Server 2000 (安装类型“仅链接”)
SQLDB
Windows 2000 Server
SQL Server 7.0(访问的数据库是CDR)
注意:Transparent Gateway for Microsoft SQL Server目前只有NT版本,所以网关程序tg4msql仅包含在Oracle Database for windows中。
系统结构:
配置过程:
从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’;
4. OK!最后执行SQL测试看是否能正常访问SQL Server
SQL>select count(*) from all_tables@cdr;
看上去并不复杂,但这些内容是我在查阅若干文档和屡次的失败后的精华所在呀!这其中得到的不少东西必须靠本身亲自实践才能牢记于心和融会贯通,因此你可不要仅仅知足于最后的结果,继续去啃Oracle的技术文档吧!祝开心、顺利