Oracle中使用透明网关链接到Sqlserver ——转自《wangqi0079百度空间》

2012-02-08补充

最近被透明网关弄得很蛋疼,总是抱"用户名"登录失败,最后发现问题在建立数据链接的时候如果我使用“create database link 数据库  connect to "用户名" identified by "密码" using ‘名称’ 这个sql语句时,链接就没问题。如果使用pl/sql中



这个快捷界面的话,仍会报这个错误。

最后发现pl/sql拼写出的sql为“create database link 服务器
  connect to 用户名 identified by 密码
  using '名称”

这里的密码处没有加入“双引号”致使密码变为大写,哎!以后还是学好命令行吧

2012-02-06补充

透明网关连接到多个 sqlserver 上,且端口非默认端口 连接非默认端口的 sqlserver 比较麻烦,HS\_FDS\_CONNECT\_INFO 的设置要借助 sqlserver 别名来解析。(如 果是 11g 的话就比较简单, HS\_FDS\_CONNECT\_INFO=<hostname>:<port>/<server alias>/<database>语法 用 即可) 
  1、生成 sqlserver 别名 生成 sqlserver 别名的方式有三种: 
  1)借助 sqlserver 的网络客户端配置。

  2)设置 sqlserver 别名 由于透明网关中可以读取 HKEY\_LOCAL\_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo 下的值作为 sqlserver 的别 名,所以可以通过更新注册表的方式为 sqlserver 设置别名。 在注册表的 HKEY\_LOCAL\_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client 下新建项 ConnectTo, 然后在新建的 ConnectTo 下新建字符串值:
在数值名称中输入你的 sqlserver 别名,在数值数据中输入:DBMSSOCN,4,1422 其中:DBMSSOCN 是固定字符串,不用修改;4 是 sqlserver 服务器的 IP;1422 为 sqlserver 的端口。最简单的方法是,生成一个.reg 文件,如 hc.reg,包含如下内容:

 Windows Registry Editor Version 5.00 [HKEY\_LOCAL\_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo] "hc"="DBMSSOCN,.4,1422" 直接双击这个 reg 文件就可以把信息写入注册表中。

  3)odbc 用 odbc 的方式其实也是通过配置 odbc 来为 sqlserver 定义别名。具体步骤是: 开始菜单->设置->控制面板->ODBC 数据源,点击添加,在弹出的界面上选择[SQL Server],点击[完成],弹 出在弹出界面中设定数据源名称,如 hc; 点击下一步,在弹出界面中,点击[客户端配置],在弹出界面中输入服务器别名,如 hc,选择 TCP/IP 协议, 输入服务器名称:

  4)取消选择[动态决定端口],然后输入非缺省的端口号,如 1422,点击确定返回到 创建数据源窗口中; 选择[使用用户输入登录 ID 和密码的 SQL Server 验证],在界面的下方输入登录 ID 和密码; 测试数据源,如果测试成功,odbc 配置就完成了。 之后一路下一步,最后点击完成,并测试 测试 此时,在注册表的 HKEY\_LOCAL\_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo 就 有了 sqlserver 别名相关信息了。 

init<sid_name>.ora中  HS_FDS_CONNECT_INFO=服务器别名.数据库名。例如:HS_FDS_CONNECT_INFO=zjgl.house_zong



 

在最近项目中需要从Oracle中访问SQL Server数据库, 自然想到了透明网关. 因为Oracle数据库是Linux上的, 而Linux上的Oracle9i不包括连接到SQL Server的透明网关.就在一台单独的Windows服务器上安装了透明网关用做Oracle访问SQL Server的桥梁.

环境如下:

Oracle Database Server:Linux + oracle 9.2.0.4 IP:10.194.129.197

Transparent Gateway:Windows 2003 server IP: 10.194.129.225

MS SQL Server:Windows 2003 server + SQL Server 2005 IP: 10.194.129.225

1、 Transparent Gateway for SQL Server安装

从Oracle 9i数据库安装光盘setup.exe安装,选择安装客户端

 

安装类型选择:管理员

安装完客户端后,重新运行setup.exe,安装产品选择Oracle 9i Database 9.2.0.1.0, 安装类型选择"自定义",安装组件选择Oracle Net Services和Oracle Transparent Gateways, 并在此项下选择Oracle Transparent Gateway for Microsoft SQL Server, 安装过程中可以不设置连接到SQL Server的信息.如下图所示:

以下的IP地址及数据库以实际环境为准

2、 编辑%ORACLE_HOME%/tg4msql/admin/init%ORACLE_SID%.ora, 该文件包含了TG for SQL Server的配置信息, 其中%ORACLE_SID%是给TG的"SID", 默认为tg4msql. 修改文件中的行

HS_FDS_CONNECT_INFO="SERVER=10.194.129.225;DATABASE=185life"

其中SERVER后为SQL Server所在的服务器名称或ip地址,Database为连接到的数据库名称.

当然,如果在SQL Server服务器上,有两个sql server实例,则使用‘服务器名"实例名’的方式设置上面的SERVER值,如:HS_FDS_CONNECT_INFO="SERVER=ZZL/MSSQLSERVER;DATABASE=MSDB"

3、 编辑%ORACLE_HOME%"network"admin"listener.ora, 编辑对应listener的SID_LIST

SID_LIST_LISTENER=

   (SID_LIST=

      (SID_DESC=

         (SID_NAME=%ORACLE_SID%)        

         (ORACLE_HOME=oracle_home_directory)        

         (PROGRAM=tg4msql)

      )

   )

例如:

SID_LIST_LISTENER =

(SID_LIST =

    (SID_DESC =

      (SID_NAME = tg4msql)

      (ORACLE_HOME = d:/oracle/ora92) #oracle的主目录

      (PROGRAM = tg4msql)

    )

)

其中%ORACLE_SID%必须为第二布中设置的SID, 默认值为tg4msql. 修改listener.ora文件后需重启listener使修改生效.如果没有listener.ora文件,请用Net Configuration Assistant或Net Manager新建一个LISTENER.

以上操作都是在Transparent Gateway所在机器上。

4、 在Oracle服务器上:编辑需要连接到透明网关的Oracle Server的$ORACLE_HOME/network/admin/tnsnames.ora, 例如:

TG4MSQL =

(DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.194.129.225)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = tg4msql)

    )

    (HS = OK)

)

HOST指向Transparent Gateway所在的机器的IP,Service_name为第3步中的SID_NAME

使用tnsping测试服务名是否连通,命令:tnsping tg4msql。如果不通,请检查防火墙及网络配置。

5、 在Oracle数据库中建立连接, 指向TG for SQL Server.

CREATE DATABASE LINK tg4msql CONNECT TO "user" IDENTIFIED BY "password" USING 'tg4msql';

其中tg4msql是tnsnames中建立的连接字符串.

ms sql server的用户名和密码必须小写,而且要加双引号

否则会报如下错误:

                错误信息:

                      ORA-28500: connection from ORACLE to a non-Oracle system returned this messsage:

                      [Transparent gateway from MSSQL][Microsoft][ODBC SQL Server Driver][SQL Server]??

                      'sa'????? (SQL State:28000; SQL Code: 18456)

                      ORA-02063: preceding 2 lines from LINK_ZZL

                错误原因:

                      在CREATE    DATABASE LINK LINK_ZZL的连接字符串中,ms sql server的用户名和密码必须小写,而且要加双引号

6、确保CATHS.sql已被运行。

以SYS用户连接上去,查看有没有SYS.HS_FDS_CLASS,如果没有,运行$ORACLE_HOME/RDBMS"ADMIN"CATHS.SQL

6、 测试, 如运行select * from emp@tg4msql等.
访问dblink时说明:
              这是基于网关的方式,因此不能在断开网络的情况下本地的oracle连接本地的ms sql server               ORA-28545: error diagnosed by Net8 when connecting to an agent
              NCRO: Failed to make RSLV connection
              ORA-02063: preceding 2 lines from LINK_ZZL

7、BUG解决。

如果在第6步出现以下错误提示,则以SYS运行

exec dbms_hs.replace_base_caps(531, 531, 'First/Last function');

ERROR at line 1:

           ORA-28522: error initializing heterogeneous capabilities

           ORA-28522: error initializing heterogeneous capabilities

           ORA-28559: FDS_CLASS_NAME is <GTW>9.2.0.5.0_128, FDS_INST_NAME is <link>

           ORA-02063: preceding 3 lines from %s

           ORA-00604: error occurred at recursive SQL level 1

           ORA-24274: no row exists in the HS$_BASE_CAPS table for these parameters

           ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86

           ORA-06512: at "SYS.DBMS_HS_UTL", line 431

           ORA-06512: at "SYS.DBMS_HS_CHK", line 51

           ORA-06512: at "SYS.DBMS_HS_UTL", line 48

           ORA-06512: at "SYS.DBMS_HS", line 38

           ORA-06512: at line 1

http://it.chinawin.net/database/article-9457.html



2012-2-1整理

1.安装for sqlserver的透明网关:
打开oracle for windows的安装程序setup.exe,一路”下一步”,在选择安装产品时,选”oracle9i database”,再下一步时,选择”自定义安装”,单独选择transparent gateway for ms sqlserver安装.
    安装完毕后,在$Oracle_Home下生成一个tg4msql的目录.


2.配置透明网关文件:
d:\oracle\ora92\tg4msql\admin\inittg4msql.ora
内容如下:
HS_FDS_CONNECT_INFO="SERVER=SYHND;DATABASE=pubs"
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER


3.配置lisenter.ora:
内容如下:
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = SYHND)(PORT = 1521))
      )
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:\oracle\ora92)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = hello)
      (ORACLE_HOME = D:\oracle\ora92)
      (SID_NAME = hello)
    )

   (SID_DESC =
     (PROGRAM =tg4msql)
     (SID_NAME =tg4msql)
     (ORACLE_HOME =D:\oracle\ora92)    
   )
)
###最后一个SID_DESC是为了访问SQLSERVER而新增的.


4.配置TNSname.ora:
test.ASPIRE.ASPIRE-TECH.COM= 
  (DESCRIPTION = 
   (ADDRESS_LIST = 
     (ADDRESS = (PROTOCOL = TCP)(HOST = SYHND)(PORT = 1521)) 
   ) 
   (CONNECT_DATA = 
     (SID_NAME= tg4msql) 
   ) 
(HS=OK) 


5.创建链接:
CREATE DATABASE LINK DB_SQL CONNECT TO sa IDENTIFIED BY sa USING 'test.ASPIRE.ASPIRE-TECH.COM';


6.访问测试:
SQL> select * from sales@DB_SQL;

select * from sales@DB_SQL

ORA-12154: TNS: 无法处理服务名

SQL> select * from [email]sales@DB_SQL.US.ORACLE.COM[/email];

select * from [email]sales@DB_SQL.US.ORACLE.COM[/email]

ORA-12154: TNS: 无法处理服务名

SQL>



故障排查:
使用TNSPING命令查看TNSNAME是否正常:
C:\Documents and Settings\Administrator>tnsping test.aspire.aspire-tech.com

TNS Ping Utility for 32-bit Windows: Version 9.2.0.1.0 - Production on 11-5月 -2
006 22:56:55

Copyright (c) 1997 Oracle Corporation.  All rights reserved.

已使用的参数文件:
D:\oracle\ora92\network\admin\sqlnet.ora


已使用 TNSNAMES 适配器来解析别名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = SYHND)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME
= tg4msql))
^C
到了这就不动了.说明在解析服务名就不能成功.

很可能是listenr.ora或tnsname.ora或inittg4msql.ora格式有问题,重新检查:
修改了tnsname.ora:
test.ASPIRE.ASPIRE-TECH.COM= 
  (DESCRIPTION = 
   (ADDRESS_LIST = 
     (ADDRESS = (PROTOCOL = TCP)(HOST = SYHND)(PORT = 1521)) 
   ) 
   (CONNECT_DATA = 
    (SERVICE_NAME=tg4msql) 
   ) 
(HS=OK) 
)
把(SERVICE_NAME=tg4msql)修改为: (SID_NAME=tg4msql)


重启数据库:
C:\Documents and Settings\Administrator>tnsping test

TNS Ping Utility for 32-bit Windows: Version 9.2.0.1.0 - Production on 12-5月 -2
006 11:00:49

Copyright (c) 1997 Oracle Corporation.  All rights reserved.

已使用的参数文件:
D:\oracle\ora92\network\admin\sqlnet.ora


已使用 TNSNAMES 适配器来解析别名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = SYHND)(PORT = 1521))) (CONNECT_DATA = (SID_NAME= tg4msql)) (HS=OK))
OK(10毫秒)

这下OK了.可以解析别名.




查看当前的哪些DBLINK:
select * from dba_db_links

删除没用的DBLINK:
SQL> drop public database link DB_SQL;

Database link dropped

SQL> drop database link sql;

Database link dropped

SQL> drop database link db_sql;

Database link dropped

SQL>

注意:DBLINK是谁创建的,就只有该用户才能删除,DBA都无法删除.
如果是public类型的DBLINK,删除时,则要加上public的参数.

再次访问远程数据库:

SQL> CREATE DATABASE LINK DB_SQL CONNECT TO sa IDENTIFIED BY sa USING 'test.ASPIRE.ASPIRE-TECH.COM';

Database link created

SQL> select * from student@db_sql;

select * from student@db_sql

ORA-28545: 连接代理时 Net8 诊断到错误
NCRO:无法执行 RSLV 连接
ORA-02063: 紧接着2 lines(源于DB_SQL)

SQL>


很可能还是listener.ora和tnsname.ora还是存在问题.
修改了tnsname.ora:
test.ASPIRE.ASPIRE-TECH.COM= 
  (DESCRIPTION = 
   (ADDRESS_LIST = 
     (ADDRESS = (PROTOCOL = TCP)(HOST = SYHND)(PORT = 1521)) 
   ) 
   (CONNECT_DATA = 
    (SID_NAME=tg4msql) 
   ) 
(HS=OK) 
)
把(SID_NAME=tg4msql)修改为: (SERVICE _NAME=tg4msql)



再次访问远程数据库:

SQL> select * from student@db_sql;

name
--------------------

SQL>

SQL> select * from sales@db_sql;

stor_id ord_num              ord_date       qty payterms     title_id
------- -------------------- ----------- ------ ------------ --------
6380    6871                 1994-9-14        5 Net 60       BU1032
6380    722a                 1994-9-13        3 Net 60       PS2091
7066    A2976                1993-5-24       50 Net 30       PC8888
7066    QA7442.3             1994-9-13       75 ON invoice   PS2091
7067    D4482                1994-9-14       10 Net 60       PS2091
7067    P2121                1992-6-15       40 Net 30       TC3218
7067    P2121                1992-6-15       20 Net 30       TC4203
7067    P2121                1992-6-15       20 Net 30       TC7777
7131    N914008              1994-9-14       20 Net 30       PS2091
7131    N914014              1994-9-14       25 Net 30       MC3021
7131    P3087a               1993-5-29       20 Net 60       PS1372
7131    P3087a               1993-5-29       25 Net 60       PS2106
7131    P3087a               1993-5-29       15 Net 60       PS3333
7131    P3087a               1993-5-29       25 Net 60       PS7777
7896    QQ2299               1993-10-28      15 Net 60       BU7832
7896    TQ456                1993-12-12      10 Net 60       MC2222
7896    X999                 1993-2-21       35 ON invoice   BU2075
8042    423LL922             1994-9-14       15 ON invoice   MC3021
8042    423LL930             1994-9-14       10 ON invoice   BU1032
8042    P723                 1993-3-11       25 Net 30       BU1111

stor_id ord_num              ord_date       qty payterms     title_id
------- -------------------- ----------- ------ ------------ --------
8042    QA879.1              1993-5-22       30 Net 30       PC1035

21 rows selected

SQL>
终于配置成功了.!!!!


配置时的注意点:
关键是listener.ora和tnsname.ora两个文件.

像:(SID_NAME=tg4msql)
最好不要有空格之类的符号,以前配置出现的所有问题说不定就是因为空格的原因导致的.!!!





我的配置文件,请参考:
代码:
D:\oracle\ora92\tg4msql\admin\inittg4msql.ora

###此处中的SERVER为SQLSERVER所处的主机名或IP
HS_FDS_CONNECT_INFO="SERVER=SYHND;DATABASE=pubs"  
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER

注意,如果对应的listener.ora里面的sid_name设置为其他的,例如sql2000,那么应该新增一个配置文件对应为initsql2000.ora而不是inittg4msql.ora了.

D:\oracle\ora92\network\admin\listener.ora

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = SYHND)(PORT = 1521))
      )
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:\oracle\ora92)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = hello)
      (ORACLE_HOME = D:\oracle\ora92)
      (SID_NAME = hello)
    )

   (SID_DESC =
(GLOBAL_DBNAME=tg4msql) 
     (PROGRAM =tg4msql)
     (SID_NAME=tg4msql)
     (ORACLE_HOME =D:\oracle\ora92)    
   )
)



D:\oracle\ora92\network\admin\tnsnames.ora
##此处的HOST为透明网关服务所在的主机名或IP
test.ASPIRE.ASPIRE-TECH.COM= 
  (DESCRIPTION = 
   (ADDRESS_LIST = 
     (ADDRESS = (PROTOCOL = TCP)(HOST = SYHND)(PORT = 1521)) 
   ) 
   (CONNECT_DATA = 
(SERVICE_NAME=tg4msql) 
##此SERVICE_NAME应和透明网关SERVER上设定的SID_NAME相同
   ) 
(HS=OK) ##hs=ok 代表异构服务



注意:
如果需要配置对多个sql server数据库进行访问,可以在目录tg4msql中配置多个init.ora文件,里面指定对应的数据库同时在listener.ora和tnsnames.ora进行配置,再建立相应的db links即可。 

 



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值