Oracle 10g连接 sql2005

一.利用透明网关实现oracle10g访问MSSQLServer2005
1.     准备系统环境
假设有两台数据库服务器:
a. MS SQLServer2005数据库服务器
机器名:L15 IP:192.168.9.100
OS:Microsoft Windows XP Professional2002 Service Pack2
SQLServer2005数据库版本号:
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
Nov 24 2008 13:01:59
Copyright (c) 1988-2005 Microsoft Corporation
Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
数据库名:webdb
 
b. Oracle10g数据库服务器
机器名:L20 IP:192.168.9.120
OS:Microsoft Windows XP Professional2002 Service Pack2
Oracle数据库版本号: Oracle10g 10.2.0.1
 


2.     下载透明网关
Oracle10g下,透明网关是一个单独的组件,需要单独下载安装
http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/10201winsoft.html(10201_gateways_win32.zip)


其它版本Oracle透明网关下载地址
http://blog.itpub.net/27006877/viewspace-739059/
其它版本Oracle透明网关下载地址
http://www.blogjava.net/wangdetian168/archive/2011/03/01/345428.html
 
3.     安装网关
前面提到了,透明网关可以安装在MS SQLServer2005数据库服务器上,也可以安装在Oracle10g数据库服务器,也可以安装在单独的一台服务器上,作为独立的透明网关服务器。本例是在MS SQLServer2005数据库服务器安装透明网关:
解压后,进入目录,点击setup.exe,启动安装界面,安装oracle transparent gateway for microsoft sql server;
先指定主目录详细信息:
  
选择需要安装的网关,我们是需要与MS SQLServer2005通信,因此需要选中如下图所示的选项。
 
输入sqlserver地址和sqlserver 数据库名,这里你可以输入正确的,也可以随便输入,或者留空,我们可以安装完成后再配置。本例中的Microsoft SQL Server的值应该为“L15”,Microsoft SQL数据库的值应该为“webdb”
 
点击下一步后开始透明网关的安装
 
安装完后,会弹出配置监听界面,因为我们要手工配置,点击取消即可。当然与可以选中“执行典型配置”
 
4.     配置透明网关
在刚刚安装过网关的服务器(L15机器上)上配置透明网关参数文件,默认情况下,安装透明网关时会生成一个默认的参数文件:inittg4msql.ora,它的sid是tg4msql,你可以使用这个文件,也可以新建一个文件。本例选择默认的文件inittg4msql.ora。
进入$GATEWAY_HOME\tg_1\tg4msql\admin目录(这里的$GATEWAY_HOME是指透明网关的安装主目录) ,本例的目录是:D:\oracle\product\10.2.0\tg_1\tg4msql\admin ,用记事本打开inittg4msql.ora,并编辑为如下内容(注意红色字体的内容为服务器的IP与SQLServer的数据库名):
# This is a sample agent init file that contains the HS parameters that are
# needed for the Transparent Gateway for SQL Server
#以#开头的语句都是注释
# HS init parameters
#
HS_FDS_CONNECT_INFO="SERVER=192.168.9.100;DATABASE=webdb"
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=sa
HS_FDS_RECOVERY_PWD=admin
 
如果是新建一个文件:initjss.ora ,这个名字随便取,但要注意格式:init<sid>.ora,把它理解为oracle的参数文件就可以。
HS_FDS_CONNECT_INFO的设置有多种格式,如:
HS_FDS_CONNECT_INFO=server_name.db_name,但这种写法server_name不能为IP,且端口必须为默认的1433,如:
HS_FDS_CONNECT_INFO=L15.webdb
 
5.     配置监听器
在刚刚安装过网关的服务器(L15机器上)上配置监听器。
进入$GATEWAY_HOME\network\admin下,编辑listener.ora文件:
注意:下面的ORACLE_HOME实际上指的是安装透明网关的主目录,sid_name要与上一步配置的参数文件的名称相对应:
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:\oracle\product\10.2.0\tg_1)
      (PROGRAM = extproc)
    )
    (SID_DESC=
         (SID_NAME=tg4msql) #SID_NAME是参数文件inittg4msql.ora里的tg4msql
         (ORACLE_HOME=D:\oracle\product\10.2.0\tg_1)
         (PROGRAM=tg4msql)
    )   
  )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.100)(PORT = 1521)) # 此处HOST填的是透明网关所在机器(L15)的IP地址或机器名,端口号也是 网关机器对应的端口号  
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )
6.     启动监听
进入$GATEWAY_HOME\BIN\lsnrctl start
D:\oracle\product\10.2.0\tg_1\bin\lsnrctl start
 
C:\>D:\oracle\product\10.2.0\tg_1\bin\lsnrctl start
 
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 06-12月-2009 14:50:36
 
Copyright (c) 1991, 2005, Oracle.  All rights reserved.
 
启动tnslsnr: 请稍候...
 
TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
系统参数文件为D:\oracle\product\10.2.0\tg_1\network\admin\listener.ora
写入D:\oracle\product\10.2.0\tg_1\network\log\listener.log的日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.9.100)(PORT=1521)))
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY = EXTPROC0))
 
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.9.100)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名                      LISTENER
版本                      TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
启动日期                  06-12月-2009 14:50:38
正常运行时间              0 天 0 小时 0 分 1 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          D:\oracle\product\10.2.0\tg_1\network\admin\listener.ora
监听程序日志文件          D:\oracle\product\10.2.0\tg_1\network\log\listener.log
 
监听端点概要...
   (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.9.100)(PORT=1521)))
   (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY = EXTPROC0))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
  例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "jss" 包含 1 个例程。
  例程 "tg4msql", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
 
至此,在透明网关上的工作就算完成了。
7.     在Oracle10g数据库上配置
在Oracle10g数据库上配置tnsname.ora,添加内容如下:
tg4=
   (DESCRIPTION=
      (ADDRESS=
         (PROTOCOL=TCP)
         (HOST=192.168.9.100) #此HOST应和透明网关MSSQLSERVER机器上的IP或机器名
         (PORT=1521)
      )
      (CONNECT_DATA= (SID=tg4msql)) #此SID应和透明网关MSSQLSERVER上设定的SID相同 
      (HS=OK) #这个很重要,表示支持异构服务器
    )
8.     创建数据库链接
用下面的方法建立数据库链接:
SQL>create database link mssqldb connect to sa identified by "123456" using 'tg4';
注:1. sa是MSSQLServer的帐户名,密码要用引号引住,using后的网络服务名与要用引号引住。
2. 如果oracle服务器上没有创建网络服务名,则可以用下面的方法来建立数据库链接:
create public database link mssqldb
connect to sa
identified by "123456 "
using '(DESCRIPTION =
    (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.9.100 )(PORT= 521)) --SQLServer机器上的IP或机器名
    (CONNECT_DATA = (SID = tg4msql )) --SQLServer机器上的SID
    (HS=OK)
  ) ';
 
 
9.     测试连接
SQL> select * from dbo.sysobjects@mssqldb;
当从oracle数据库上发出这个sql时,实际上通过tnsname.ora配置的tg4信息转到10.10.10.2上,当10.10.10.2的监听监听到10.10.10.1的请求时,再次通过initjss.ora配置的HS_FDS_CONNECT_INFO信息转到sqlserver数据库上,最终把用户需要的数据返回。如果这个sql有记录返回,说明透明网关没有问题。
oracle的透明网关向前兼容做得不好,oracle 9i数据库不能通过10g的透明网关方位sqlserver。
10.  总结
访问SQLServer时SQL语句中的字段名经常要加引号。
      select “f1” from t1
访问SQLServer的Text字段要在Oracle中创建全局临时表导入后才能访问。 
建立数据库链接时密码要加引号以区分大小写(SQLServer是区分大小写的),
存在二进制的字段的表最好不要通过透明网关访问。SQLServer中的表名称、字段名成最好修改为大写。
透明网关连接SQLServer其实是一个不容易的事情,一是访问速度慢,二是不稳定,我在做这方面的实验时就发现经常做不成功。总之就是不可靠,但如果连接成功,基本是可靠的,只是访问速度慢点而已。
透明网关还可以连接到多个sqlserver上,且端口非默认端口,连接非默认端口的sqlserver比较麻烦,HS_FDS_CONNECT_INFO的设置要借助sqlserver别名来解析。(如果是11g的话就比较简单,用HS_FDS_CONNECT_INFO=<hostname>:<port>/<server alias>/<database>语法即可),本文不再阐述。






今天同事找我说,服务器上的连接都不能用了,报ora-02085错误。在我网上搜到下面的解释:
ora-02085:的注解是:
database link name connects to name
cause: The database link attempted to connect to a database with a different name.
The name of the database link must be the same name as the name of the database.
Action: Create a database link with same name as the database to which it connects.
意思是:If u set the parameter 'global_names' to true,the db link name connected to this server must equal db_name + db_domain.
很多时候我们只是让dblink的名字等于了db_name,所以创建出错
于是想到今天上午,我不小心,把服务器上的global_names修改了。
运行下面的语句:
enet@lx>column name format a20;
enet@lx>column value format a20;
enet@lx>select name ,value from v$parameter
  2  where name = 'global_names';
NAME                 VALUE
-------------------- --------------------
global_names         TRUE
果然global_names的值为true。下面把其修改为false:


enet@lx>alter system set global_names=false scope=both;
系统已更改。
确认修改成功:
enet@lx>select name ,value from v$parameter
  2  where name = 'global_names';
NAME                 VALUE
-------------------- --------------------
global_names         FALSE
再运行连接,一切正常。看来要小心了,一不小心修改的参数就会导致很大的错误。




--使用的注意事项   ORACLE通过访问SQL?Server的数据库链接时,用select?*?的时候字段名是用双引号引起来的

猜你喜欢

转载自blog.csdn.net/u013625182/article/details/78531105