解决:客户端连接11gR2 RAC报ORA-12545错误

刚在Oracle Linux 6环境下搭建了一套11gR2 RAC数据库集群,客户端(Oracle 10g)通过SCAN IP访问数据库时遇到下述错误:
  SQL> conn sys/sys@studydb as sysdba
  ERROR:
  ORA-12545: Connect failed because target host or object does not exist
 
在服务器端直接登录没有问题:
 
  [root@study1 ~]# su - oracle
  [oracle@study1 ~]$ sqlplus /nolog
  
  SQL*Plus: Release 11.2.0.1.0 Production on Tue Aug 21 16:22:48 2012
  
  Copyright (c) 1982, 2009, Oracle.  All rights reserved.
  
  SQL> conn / as sysdba
  Connected.
  SQL>      

服务器的网络配置:
 
  [oracle@study1 ~]$ more /etc/hosts
  127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  
  # Public
  172.16.89.231    study1.dlt      study1
  172.16.89.232    study2.dlt      study2
  # Private
  192.168.152.128     study1-priv
  192.168.152.129     study2-priv
  # Virtual
  172.16.90.231       study1-vip
  172.16.90.232       study2-vip
  # SCAN
  172.16.90.201    study-scan
  172.16.90.202    study-scan
  172.16.90.203    study-scan
 
客户端的tnsnames.ora文件配置如下:
 
  STUDYDB =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.90.201)(PORT = 1521))
        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.90.202)(PORT = 1521))
        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.90.203)(PORT = 1521))
      )
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = studydb)
      )
    )
  
tnsping studydb是成功的:  
 
  tnsping studydb
  
  TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 21-AUG-2012 16:28:06
  
  Copyright (c) 1997, 2005, Oracle.  All rights reserved.
  
  Used parameter files:
  c:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora
  
  
  Used TNSNAMES adapter to resolve the alias
  Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.90.201)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 172.1
  OK (60 msec)
  
服务端的scan ip信息如下:

  [oracle@study1 admin]$ srvctl config scan
  SCAN name: study-scan, Network: 1/172.16.88.0/255.255.252.0/eth0
  SCAN VIP name: scan1, IP: /study-scan/172.16.90.201
  SCAN VIP name: scan2, IP: /study-scan/172.16.90.202
  SCAN VIP name: scan3, IP: /study-scan/172.16.90.203
  [oracle@study1 admin]$ srvctl status scan
  SCAN VIP scan1 is enabled
  SCAN VIP scan1 is running on node study2
  SCAN VIP scan2 is enabled
  SCAN VIP scan2 is running on node study1
  SCAN VIP scan3 is enabled
  SCAN VIP scan3 is running on node study1  
  
查看数据库的local_listener参数:

  [oracle@study1 ~]$ sqlplus /nolog
  
  SQL*Plus: Release 11.2.0.1.0 Production on Tue Aug 21 16:32:39 2012
  
  Copyright (c) 1982, 2009, Oracle.  All rights reserved.
  
  SQL> conn / as sysdba
  Connected.
  SQL> show parameter local_listener
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  local_listener                       string      (DESCRIPTION=(ADDRESS_LIST=(AD
                                                   DRESS=(PROTOCOL=TCP)(HOST=stud
                                                   y1-vip)(PORT=1521))))
  
  [oracle@study2 ~]$ sqlplus /nolog
  
  SQL*Plus: Release 11.2.0.1.0 Production on Tue Aug 21 16:35:55 2012
  
  Copyright (c) 1982, 2009, Oracle.  All rights reserved.
  
  SQL> conn / as sysdba
  Connected.
  SQL> show parameter local_listener
  
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  local_listener                       string      (DESCRIPTION=(ADDRESS_LIST=(AD
                                                   DRESS=(PROTOCOL=TCP)(HOST=stud
                                                   y2-vip)(PORT=1521))))
                                                  
可以看到local_listener中没有直接指定ip
修改local_listener参数
 
 SQL> alter system set local_listener = '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.90.231)(PORT=1521))))' sid='studydb1' scope=both;
 
 System altered.                                                  
            
 SQL> alter system set local_listener = '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.90.232)(PORT=1521))))' sid='studydb2' scope=both;
 
 System altered.       
 
 
之后客户端连接正常:
  SQL> conn sys/sys@studydb as sysdba
  Connected.
  SQL> select inst_name from v$active_instances;
  
  INST_NAME
  --------------------------------------------------------------------------------
  study1.dlt:studydb1
  study2.dlt:studydb2   
  
  
其实还有一个解决方法:
  在客户端的hosts文件中配置如下内容
   172.16.90.231       study1-vip
   172.16.90.232       study2-vip  
   当然没有前面的方法方便,但这说明了scan ip的运行原理:
    Oracle客户端通过scan ip连接到服务端,服务端把local_listener配置发送到客户端,客户端再通过local_listener配置真正连接到数据库.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/195110/viewspace-741512/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/195110/viewspace-741512/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值