通过配置oracle 的异类服务代理(Heterogeneous Services Agents),我们能构通过oracle访问各种非oracle的数据库,比如sql server ,informix,sybase等。
-- zql 出品
通过配置oracle 的异类服务代理(Heterogeneous Services Agents),我们能构通过oracle访问各种非oracle的数据库,比如sql server ,informix,sybase等。 oracle的异类服务代理有两种类型: 透明网关 (Oracle Transparent Gateways) 普通连通 (Generic Connectivity)
透明网关: oracle对不同的数据库提供专门的网关代理程序来实现与异构数据库的通讯,比如在windows平台下,oracle提供 agent for sql server,agent for sybase 等。通过查阅资料,发现在 window下,oracle透明网关没有提供对informix的支持。 普通连通: oracle通过两个代理程序来与非oracle数据库的ODBC 或者 OLE DB 驱动通讯,实现数据的共享。两个代理程序分别对应ODBC 和 OLE DB 驱动。 这种方式下,需要非oracle数据库的厂商提供的ODBC or OLE DB 驱动。只要有驱动,就能实现对所有非oracle数据库的支持。 下面只介绍普通连通使用odbc驱动的配置方法。
步骤: 1 安装异类服务数据字典 (该步骤在oracle10g 下不必做) SQL> CONNECT SYS/PWD AS SYSDBA -- PWD 为 sys的密码 SQL> @$ORACLE_HOMErdbmsadmincaths.sql -- @$ORACLE_HOME 指的是oracle的bin所在的目录 2 配置oracle 的 NET 服务。在tnsnames.ora 中配置联机串如下: SQL = (DESCRIPTION= (ADDRESS= (PROTOCOL=TCP) (HOST=131.101.10.16) (PORT=1521) ) (CONNECT_DATA= (SID=HSODBC_SQL)) (HS=OK)) 其中(HS=OK) 指定使用oracle异类服务,(SID=HSODBC_SQL) 与监听中配置的SID_NAME 相对应。 3 配置oracle 监听服务,使得监听程序能构启动异类服务代理。配置的方法是在SID_LIST_LISTENER 中增加相应的SID_DESC。如下: LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = zql)(PORT = 1521)) ) )
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ORCL) (ORACLE_HOME = d:ORA92) (SID_NAME = ORCL) ) (SID_DESC = (GLOBAL_DBNAME = HSODBC_SQL) (PROGRAM = hsodbc) -- 指定异类服务的代理程序,该处为odbc代理 (SID_NAME = HSODBC_SQL) -- 该 SID_NAME 与 tnsnames.ora中的 sid对应 (ORACLE_HOME = d:ORA92) ) ) 配置完监听,要重起监听,注意监听文件中不能有 "-- 指定异类服务的代理程序,该处为odbc代理" 这样的注释。要把注释去掉。 4 创建普通连通的初始化文件。在目录 $ORACLE_HOME/hs/admin 下,创建初始化文件,文件名为 initHS_SID.ora ,其中HS_SID 为监听程序中 为异类服务配置的SID_NAME ,比如上例中的 HSODBC_SQL,需要创建的 初始化文件名为initHSODBC_SQL.ora. 文件内容如下配置: HS_FDS_CONNECT_INFO = SYSTEM_DNS HS_FDS_TRACE_LEVEL = ON 其中HS_FDS_CONNECT_INFO 指向 用系统DNS 创建的ODBC连接串 。注意必须是系统DNS ,不能是文件DNS. 关于系统dns的配置这里不详细说明, 大家都知道,配置 ODBC ,需要安装相应数据库的 ODBC驱动 。请确认相应的系统DNS 已经被创建。 5 创建数据链路连接到非oracle数据库中。 create public database link link_name connect to 用户名 identified by "密码" using '连接串名'; 之所以密码放在 ""里面,是为了让oracle对大小写敏感,连接串名为配置的tnsnames.ora 中的串名。用上面的例子,用sa用户登陆,密码是sa, 如下创建: create public database link link_sql connect to sa identified by "sa" using 'SQL'; 6 测试连接。 select * from 表名@link_sql;