前言
先简单介绍一下Oracle异构服务。它是包含在Oracle数据库中的一个模块,通过使用透明网关(Transparent Gateway)或通用连接(Generic Connectivity)来访问其它非Oracle系统的数据。异构服务的主要结构如下:
各模块简要说明如下:
异构服务模块:属于Oracle数据库的内核部分,负责大部分异构连接的处理;
代理通用代码:对所有基于异构服务产品的通用代码;
驱动:是与非Oracle系统直接交互的模块,实现从异构服务API到特定非Oracle系统API的映射。
代理:是Oracle Server连接非Oracle系统的进程,包括两部分即代理通用代码和针对特定非Oracle系统的驱动。代理的位置可以与非Oracle系统在同一台机器上,或与Oracle Server在同一台机器上,或者单独在一台机器上。我这次实践的环境采用的是最后一种。
我们所说的透明网关和通用连接实际是异构服务中代理的两种类型。其中透明网关是功能较强的,它通过代理进程从Oracle Server访问各地的异构分布式数据库,而提供给用户的感觉是这些数据库仍然是Oracle数据库,Oracle公司提供对大多数商业数据库的透明网关。通用连接则有较多限制,它使用用户自己提供的ODBC或OLE DB驱动程序作为异构服务的代理驱动,并且要求这些驱动必须要安装在Oracle Server的$ORACLE_HOME目录下。
关健字:异构数据库oracle9i gateway for ms-sql server
[@more@]配置过程:
第一步:在MS-SQL server 创建数据echon,用户ms_echon密码ms_echon并创建一张表ms_t1(id char(10));
第二步:安装oracle9i gateway for ms-sql server,之后检查oracle数据库,如果有对象sys.HS_FDS_CLASS说明存在异构数据库的数据字典,否则运行脚本$ORACLE_HOME/rdbms/admin/caths.sql。设置参数HS_AUTOREGISTER,启用代理的自动注册功能HS_AUTOREGISTER=TRUE,数据库默认启用该功能。
第三步:修改参数,进入C:oracleora92tg4msqladmin,把inittg4msql.ora 改成initechon.ora(命名方法init+MS sql server数据库名.ora),把内容改为:
HS_FDS_CONNECT_INFO="SERVER=127.0.0.1;DATABASE=echon"
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
第四步:修改侦听
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1527)) #新增一端口
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = jialong)
(ORACLE_HOME = C:oracleora92)
(SID_NAME = jialong)
)
#以下是为MS-SQL server配的侦听
(SID_DESC =
(SID_NAME = echon) #MS-Sql server的数据库名
(ORACLE_HOME=C:oracleora92)
(PROGRAM = tg4msql)
)
)
配好后,重新启动侦听程序
第五步:配置net manager
修改tnsname.ora
新增
MS_SQL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1527)) #与侦听端口一致
)
(CONNECT_DATA =
(SID = echon) # MS-Sql server数据库名, GATEWAY上listener.ora中的SID一致
)
(HS = OK) #这很重要,告诉Oracle Server要调用异构服务模块来处理
)
第六步:创建db link:
SQL> create public database link ora_msql connect to ms_echon identified by
ms_echon using 'ms_sql'; #ms_echon是ms_sql server上的用户。
数据库链接已创建。
SQL> select count(*) from ms_t1@ora_msql;
select count(*) from ms_t1@ora_msql
*
ERROR 位于第 1 行:
ORA-02085: 数据库链接ORA_MSQL与HO.WORLD相连结
SQL> alter system set global_names=false scope=both;
系统已更改。
SQL> conn echon/echon
已连接。
SQL> select count(*) from ms_t1@ora_msql;
COUNT(*)
----------
1
至此,oracle与ms sqlserver 的通道已开,为了使开发工作简单,透明的进行,我们进一步加强功能的可读性,可在oracle上创建同义词来解决开发SQL语句的通用性,但值得注意的是,强烈要求开发人员采用标准SQL语法,否则可迁移性不强。
SQL> create synonym ms_t1 for ms_t1@ora_msql;
同义词已创建。
SQL> select count(*) from ms_t1;
COUNT(*)
----------
3
SQL> select * from ms_t1;
id
----------
weijsh
lanying
lanying
SQL> insert into ms_t1 values('lanying');
已创建 1 行。
SQL> commit;
提交完成。
也可以到SQL 查询分析器上执行insert into ms_t1 values('lanying');
总结
通过oracle和mssql server两个数据库多次认证,oracle网关很好的解决了两种异构平台下的数据实时同步,这种方案对开发人员是透明的。另外,本次测试仅对功能上的可行性进行了验证,没有进行大量的数据测试,所以在性能上能否满足实际应用还有待验证。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/32202/viewspace-891729/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/32202/viewspace-891729/