不同数据库平台的互连一般称之为数据库的异构服务,现在各大数据库之间都可以实现这样的异构互连,只是各厂商的具体实现技术不一样,如:在SQL SERVER里面叫做LINKED SERVER,通过ODBC实现与其它数据库的互联。
而ORACLE实现异构服务的技术叫做透明网关(Transparent Gateway),当然之前ORACLE还采用过通用连接技术。目前ORACLE利用透明网关可以实现和SQL SERVER、SYBASE、DB2等多种数据库的互联。
透明网关的体系结构也很简单,在ORACLE和SQL SERVER之间使用ORACLE透明网关服务器实现互连互通,其中透明网关服务器可以与ORACLE或SQL SERVER数据库在同一台主机上,也可以是在独立的一台主机上。
下面是具体步骤:
1、在SQL SERVER数据库上创建测试账号和表
这里我用的是10.16.74.140的PUBS数据库,账号cyx,
create table t (c char(10));
2、我测试所用数据库和透明网关是在同一台机器上,在我本机:10.16.98.16,透明网关在oracle默认安装时是不安装的,所以如果你想用需要选择这一选项。
3、安装透明网关for sql server的软件后,可以在$ORACLE_HOME下看到tg4msql目录,编辑$ORACLE_HOME/tg4msql/admin/inittg4msql.sql文件确认这一行正确:
HS_FDS_CONNECT_INFO="SERVER=10.16.74.140;DATABASE=pubs"
4、修改透明网关server上的listener.ora,在SID_LIST中加入以下内容:
(SID_NAME = tg4msql) # SID自己命名
(ORACLE_HOME = c )
(PROGRAM = tg4msql)
5、在oracle server上的tnsnames.ora中加入到透明网关的tnsname,内容如下:
sql2k =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.16.98.16)(PORT = 1521)) #此处HOST填的是透明网关SERVER的地址
)
(CONNECT_DATA = (SID = tg4msql) ) #此SID应和透明网关SERVER上设定的SID相同
(HS=OK)
)
6、修改ORACLE SERVER的初始化参数,将global_names设为false,因为我们并不使用GLOBAL NAME。然后重起数据库。
7、现在在ORACLE SERVER上创建DB LINK就可以了。下面实验数据:
C:>sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 6月 25 13:29:41 2003
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> conn sys/change_on_install as sysdba
已连接。
SQL> create user cyx identified by cyx default tablespace users;
用户已创建
SQL> grant connect to cyx;
授权成功。
SQL> grant resource to cyx;
授权成功。
SQL> conn cyx/cyx
已连接。
SQL> create database link tosql2k connect to cyx identified by cyx using
2 'sql2k';
数据库链接已创建。
SQL> select * from t@tosql2k;
c
abc
aaa
bbb
cyx
gototop
ncn
11111
已选择7行。
SQL> insert into t@tosql2k values('ncn.cn');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from t@tosql2k;
c
abc
aaa
bbb
cyx
gototop
ncn
11111
ncn.cn
已选择8行。
以上示例,oracle server和透明网关server都是在同一台机器上,像在开始说明的那样,我们同样可以在其他下面oracle server中通过透明网关来访问sql server的数据。下面是示例:
现在这个oracle server上添加tnsname。
hawk3$sqlplus cyx
SQL*Plus: Release 8.1.7.0.0 - Production on Wed Jun 25 14:00:34 2003
(c) Copyright 2000 Oracle Corporation. All rights reserved.
Enter password:
Connected to:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production
SQL> create database link hawk3_sql2k connect to cyx identified by cyx
2 using 'sql2k';
Database link created.
SQL> select * from t@hawk3_sql2k;
c
abc
aaa
bbb
cyx
gototop
ncn
11111
ncn.cn
8 rows selected.
注:很多朋友问到关于透明网关的一些问题,在此加以说明如下:
1、Oracle For SQL Server的透明网关在UNIX下无法实现,目前只支持WIN; 原因很简单,SQL Server本身不支持UNIX,所以Oracle也无法直接在UNIX下访问SQL Server。
2、Oracle For其它数据库的透明网关,如SYBASE等有UNIX本版本的数据库在UNIX可以实现。
3、Oracle透明网关软件在Oracle 8i时是需要花钱另买的,大约1万$;到Oracle 9i时是作为数据库的一个组件免费发布的。安装时在组件种选择即可。
4、针对我们的实际应用,如果有需要实现Oracle 到SQL Server的互连,我们需要另外用一台WIN下的Oracle 9i来做透明网关服务器,其它UNIX下的Oracle通过这个透明网关来访问SQL Server。
5、不同数据库间的数据处理需使用标准SQL来实现。
6、各数据库中特殊的数据类型,需要在程序中实现转换,应尽量避免使用无法转换的数据类型。
Oracle 数据库的透明网关( transparent gateway )是这样的一个接口:通过它,我们可以 sqlplus 操纵其他数据库,如 ms sqlserver 、 sybase 、 infomix 等,实现数据库的异构服务。我一直在找 8i 的透明网关,但是没有; 9i 就有了, 9 i 连接 sqlserver 的透明网关在 9i for nt/2000 的安装盘上。 本文以 oracle 连接 sqlserver 为例,叙述一下配置的主要步骤。 网络结构 服务器一: sqlserver , ip 为 147.25.8.1 , port 为 1433 ; 服务器二: oracle 9i server 和透明网关, ip 为 147.25.8.11 , port 为 1521 ; 服务器三: oracle server , ip 为 147.25.8.111 , port 为 1521 ; 客户机: sqlnet + sqlplus ,或其他客户端软件。 安装 / 配置 oracle 9i server 和透明网关 安装: 在服务器二上安装 9i server for nt/2000 ,必须选择透明网关( transparent gateway for ms sqlsvr )。 在服务器二上安装 sqlsvr 的客户端程序。 配置: 在服务器二上正常配置 listener , port 口为 1521 ; 在服务器二上配置 listener.ora ,在 SID_LIST 中加入: ( SID_NAME = SID_NAME ) --------- 自己修改 ( ORACLE_HOME = 《 ORACLE_HOME 》) ( PROGRAM = tg4msql ) ---------- 这是透明网关的目录 在服务器二上配置透明网关的配置文件(《 ORACLE_HOME 》 /tg4msql/admin/initSID_NAME.ora ),明确: HS_FDS_CONNECT_INFO = “SERVER = 147.25.8.1;DATABASE = pubs” 在服务器二上配置 sqlsvr 的客户连接: SERVER NAME = SERVER NAME -------- 自己修改 SERVER = 147.25.8.1 PORT = 1433 PROTOCOL = TCP/IP SOCKET 在服务器三上配置 tnsnames.ora ,加入一个 tns : MSSQL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 147.25.8.11) (PORT = 1521))) (CONNECT_DATA = (SID = SID_NAME)) --------SID 自己修改(与上文一致) (HS = OK) ) 测试 服务器一: 启动 sqlserver ,确认用户 sa 及其密码(或另外建用户、建表)。 服务器二: 启动 listener 。 oracle 数据库不需要启动。 服务器三: sqlplus scott/tiger create database link mssql connect to sa identified by password using ‘mssql'; select * from sales@mssql; 如果无误,配置透明网关成功。 其他 使用透明网关只可以用标准的 DML ; 服务器一二三还可以是一个服务器,也可以任意组合成两个服务器;但是服务器二所在的服务器必须是 windows nt/2000 server 平台; 透明网关可以同时连接多个 sqlsvr ,方法是加入多个 SID_LIST 和相应的 initSID_NAME.ora 配置文件; 可能会遇到中文字符显示成乱码的情况,这可能是由于 sqlsvr 的服务器和客户端的程序不是一个版本引起的。我正在测试。 |
假设我们要在ORACLE里同时能访问SQL Server里默认的pubs和Northwind两个数据库。 可参考最初写的通过异构服务链接oracle 和sql server 数据库服务器 1、在安装了ORACLE9i Standard Edition或者ORACLE9i Enterprise Edition的windows机器上(IP:192.168.0.1), 产品要选了透明网关(Oracle Transparent Gateway)里要访问Microsoft SQL Server数据库. $ORACLE9I_HOME/tg4msql/admin下新写initpubs.ora和initnorthwind.ora配置文件 initpubs.ora内容如下: HS_FDS_CONNECT_INFO="SERVER=sqlserver_hostname;DATABASE=pubs" HS_DB_NAME=pubs HS_FDS_TRACE_LEVEL=OFF HS_FDS_RECOVERY_ACCOUNT=RECOVER HS_FDS_RECOVERY_PWD=RECOVER initnorthwind.ora内容如下: HS_FDS_CONNECT_INFO="SERVER=sqlserver_hostname;DATABASE=Northwind" HS_DB_NAME=Northwind HS_FDS_TRACE_LEVEL=OFF HS_FDS_RECOVERY_ACCOUNT=RECOVER HS_FDS_RECOVERY_PWD=RECOVER (蓝色字的部分可以根据具体要访问的SQL Server数据库的情况而修改) $ORACLE9I_HOME/network/admin 下listener.ora内容如下: LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521)) ) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = test9) (ORACLE_HOME = d:/oracle/ora92) (SID_NAME = test9) ) (SID_DESC= (SID_NAME=pubs) (ORACLE_HOME=d:/Oracle/Ora92) (PROGRAM=tg4msql) ) (SID_DESC= (SID_NAME=northwind) (ORACLE_HOME=d:/Oracle/Ora92) (PROGRAM=tg4msql) ) ) 重启动这台做gateway的windows机器上(IP:192.168.0.1)TNSListener服务. (凡是按此步骤新增可访问的SQL Server数据库时,TNSListener服务都要重启动) 2、ORACLE8I,ORACLE9I的服务器端配置tnsnames.ora, 添加下面的内容: pubs = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521)) ) (CONNECT_DATA = (SID = pubs) ) (HS = pubs) ) northwind = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521)) ) (CONNECT_DATA = (SID = northwind) ) (HS = northwind) ) 保存tnsnames.ora后,在命令行下 tnsping pubs tnsping northwind 出现类似提示,即为成功 Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2) (PORT = 1521))) (CONNECT_DATA = (SID = pubs)) (HS = pubs)) OK(20毫秒) Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2) (PORT = 1521))) (CONNECT_DATA = (SID = northwind)) (HS = northwind)) OK(20毫秒) 设置数据库参数global_names=false。 设置global_names=false不要求建立的数据库链接和目的数据库的全局名称一致。 global_names=true则要求, 多少有些不方便。 oracle9i和oracle8i都可以在DBA用户下用SQL命令改变global_names参数 alter system set global_names=false; 建立公有的数据库链接: create public database link pubs connect to testuser identified by testuser_pwd using 'pubs'; create public database link northwind connect to testuser identified by testuser_pwd using 'northwind'; (假设SQL Server下pubs和northwind已有足够权限的用户登录testuser,密码为testuser_pwd) 访问SQL Server下数据库里的数据: select * from stores@pubs; ...... ...... select * from region@northwind; ...... ...... 使用sql *plus copy命令从本地数据库复制暑假到MS SQL SERVER中: copy from scott/tiger@myoracle insert EMP@pubs using select * from EMP 3、使用时的注意事项 ORACLE通过访问SQL Server的数据库链接时,用select * 的时候字段名是用双引号引起来的。 例如: create table stores as select * from stores@pubs; select zip from stores; ERROR 位于第 1 行: ORA-00904: 无效列名 select "zip" from stores; zip ----- 98056 92789 96745 98014 90019 89076 已选择6行。 用SQL Navigator或Toad看从SQL Server转移到ORACLE里的表的建表语句为: CREATE TABLE stores ("stor_id" CHAR(4) NOT NULL, "stor_name" VARCHAR2(40), "stor_address" VARCHAR2(40), "city" VARCHAR2(20), "state" CHAR(2), "zip" CHAR(5)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 TABLESPACE users STORAGE ( INITIAL 131072 NEXT 131072 PCTINCREASE 0 MINEXTENTS 1 MAXEXTENTS 2147483645 ) / 总结: WINDOWS下ORACLE9i网关服务器在$ORACLE9I_HOME/tg4msql/admin目录下的initsqlserver_databaseid.ora WINDOWS下ORACLE9i网关服务器listener.ora里面 (SID_DESC= (SID_NAME=sqlserver_databaseid) (ORACLE_HOME=d:/Oracle/Ora92) (PROGRAM=tg4msql) ) UNIX或WINDOWS下ORACLE8I,ORACLE9I服务器tnsnames.ora里面 northwind = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521)) ) (CONNECT_DATA = (SID = sqlserver_databaseid) ) (HS = sqlserver_databaseid) ) sqlserver_databaseid一致才行. |