您的位置:首页 > 数据库 > Oracle

Oracle与SQL Server的互连

2006-02-10 13:47 323 查看
  不同数据库平台的互连一般称之为数据库的异构服务,现在各大数据库之间都可以实现这样的异构互连,只是各厂商的具体实现技术不一样,如:在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一致才行.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息