我在虚拟机(虚拟机安装的操作系统是RedHat Enterprise Linux 5)上安装了Oracle 10G,并在安装过程中完成了第一个数据库的创建(svr)SID是svr;然后我用oralce用户登录RHEL5,用命令:dbca 创建了第二个数据库(cli)SID是cli。我的本意在一台机子上建2个Oracle数据库,并通过2个监听来实现对这2个数据库的访问。但现在出现一个问题。我将第一个监听配置端口为1521(svr),第二个监听配置端口为1522(cli)。并启动数据库和监听。监听启动的输出:
XXXX>lsnrctl startLSNRCTL for Linux: Version 10.2.0.1.0 - Production on 06-FEB-2009 16:42:19Copyright (c) 1991, 2005, Oracle.  All rights reserved.Starting /home/oracle/dbhome/product/10.2.0/bin/tnslsnr: please wait...TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /home/oracle/dbhome/product/10.2.0/network/admin/listener.ora
Log messages written to /home/oracle/dbhome/product/10.2.0/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rhel5)(PORT=1521)))Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date                06-FEB-2009 16:42:19
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /home/oracle/dbhome/product/10.2.0/network/admin/listener.ora
Listener Log File         /home/oracle/dbhome/product/10.2.0/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rhel5)(PORT=1521)))
Services Summary...
Service "svr" has 1 instance(s).
  Instance "svr", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully发现cli并没有启动。然后我用netstat -ant来查看,结果:
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:6000                0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:1521                0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:57723               0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:37919               0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:45143             127.0.0.1:1521              ESTABLISHED 
tcp        0      0 127.0.0.1:45144             127.0.0.1:1521              ESTABLISHED 
tcp        0      0 127.0.0.1:1521              127.0.0.1:45143             ESTABLISHED 
tcp        0      0 127.0.0.1:1521              127.0.0.1:45144             ESTABLISHED 
tcp        0      0 :::6000                     :::*                        LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0      0 ::ffff:192.168.0.2:22       ::ffff:192.168.0.1:1407     ESTABLISHED 
tcp        0      0 ::ffff:192.168.0.2:22       ::ffff:192.168.0.1:1412     ESTABLISHED 
tcp        0      0 ::ffff:192.168.0.2:22       ::ffff:192.168.0.1:1416     ESTABLISHED 
tcp        0      0 ::ffff:192.168.0.2:22       ::ffff:192.168.0.1:1223     ESTABLISHED 
并没有1522的监听。REHL 5下的Oralce监听的配置文件:
SID_LIST_LISTENER2 =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = cli)
      (ORACLE_HOME = /home/oracle/dbhome/product/10.2.0)
      (PROGRAM = extproc)
    )
  )LISTENER2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rhel5)(PORT = 1522))
    )
  )SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = svr)
      (ORACLE_HOME = /home/oracle/dbhome/product/10.2.0)
      (PROGRAM = extproc)
    )
  )LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = rhel5)(PORT = 1521))
    )
  )在Windows下用Net Configuration Assistant来配置“本地NET服务名”,结果所有的配置都只能通过1521这个端口访问到RHEL5上的库(svr库和cli库都可以通过1521访问,但cli不能通过1522来访问。报错:正在连接...ORA-12541: TNS: 无监听程序)。请问用怎样配置可以实现我的想法?

解决方案 »

  1.   

    你检查一下tnsnames.ora和listens.ora里面的端口,第二个监听端口是不是都设置为1522了?
      

  2.   

    to:hdhai9451
    tnsnames.ora中的cli的端口的确是1521。我试过将cli的端口改为1522,但重启监听以后,还是无法连接,报:ORA-12541: TNS: 无监听程序。没办法,我只好改为1521,先凑合用。
      

  3.   

    不知道这个是不是可以解释?
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++
    最近已经收到多起关于Oracle10g启动两个监听进程的故障报告。
    故障发生时数据库无法通过监听正常建立连接,检查时会发现系统上存在两个监听器进程,其中一个是另外一个的子进程。
    一位朋友在我的留言板上给出了以下输出:local1:/ #ps -ef | grep tnslsnr 
    oracle 925826 1 0 Apr 06 - 234:50 /u01/app/oracle/product/102/bin/tnslsnr listener1 -inherit 
    oracle 1081540 925826 0 21:39:39 - 0:00 /u01/app/oracle/product/102/bin/tnslsnr listener1 -inherit 有朋友在RAC环境下也遇到了类似的问题,在ITPUB上也有一个相关问题的讨论。在Metalink上可以找到相关问题的很多解释,这个问题被最终确认为一个BUG,BUG号为:4518443
    Oracle称在较大压力下,监听进程可能出现间歇性停止服务,此时Oracle会spaw出另外一个监听进程,进而导致两个监听进程互相影响的故障。在非RAC环境下,可以通过在listener.ora中设置参数:
    SUBSCRIBE_FOR_NODE_DOWN_EVENT_=OFF
    来暂时回避这个BUG。同时Oracle已经推出了相关Patch用来修正这个问题。
      

  4.   

    SID_LIST_LISTENER2 = 
      (SID_LIST = 
        (SID_DESC = 
          (SID_NAME = cli) 
          (ORACLE_HOME = /home/oracle/dbhome/product/10.2.0) 
          (PROGRAM = extproc) 
        ) 
      ) SID_LIST_LISTENER = 
      (SID_LIST = 
        (SID_DESC = 
          (SID_NAME = svr) 
          (ORACLE_HOME = /home/oracle/dbhome/product/10.2.0) 
          (PROGRAM = extproc) 
        ) 
      ) 这里有问题.改为这个:
    LISTENER =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = rhel5)(PORT = 1521))
      )SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (SID_NAME = PLSExtProc)
          (ORACLE_HOME = /home/oracle/dbhome/product/10.2.0)
          (PROGRAM = extproc)
        )
        (SID_DESC =
          (GLOBAL_DBNAME = svr)
          (ORACLE_HOME = /home/oracle/dbhome/product/10.2.0)
          (SID_NAME = svr)
        )
      )LISTENER2 =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = rhel5)(PORT = 1522))
        )
      )SID_LIST_LISTENER2 =
      (SID_LIST =
        (SID_DESC =
          (GLOBAL_DBNAME = svr)
          (ORACLE_HOME = /home/oracle/dbhome/product/10.2.0)
          (SID_NAME = svr)
        )
      )
      

  5.   

    to:lockhall我首先在我的RHEL 5下面用命令:ps -ef | grep tnslsnr,结果:
    XXXXX >ps -ef | grep tnslsnr
    oracle   31539     1  0 17:53 ?        00:00:00 /home/oracle/dbhome/product/10.2.0/bin/tnslsnr LISTENER -inherit
    oracle   31654 31462  0 17:57 pts/2    00:00:00 grep tnslsnr这说明并不是你所说的那个bug,并且,我现在只是安装了oracle,并没有开始使用。同时,我将listener.ora和tnsnames.ora里面对应cli的端口改为1522以后,在windows下用netca的图形界面测试svr的连接,报:ORA-28547: 连接服务器失败, 可能是 Oracle Net 管理错误。(该连接的配置windows下没有更改。)我又修改了windows下cli的测试连接配置,端口号改为1522,报:ORA-12541: TNS: 无监听程序这说明1522上还是没有监听望各位高手指点。。
      

  6.   

    先回家吃饭了。晚上继续上线等thx
      

  7.   

    to:wangxuhero 
       看了你这个配置,发现只有针对svr的监听定义,那针对cli的呢?还是说我没看懂?呵呵。。
      

  8.   

    不是监听的问题,我也遇到过.
    有时侯设置不同的IP,不同的端口号能成功,有时侯不行,不知道怎么回事情.所以,每次只好用行的那个IP.
      

  9.   

    呵呵,楼主只启动了默认的监听器LISTENER阿,楼主自定义的监听器LISTENER2并没有启动哦
    LSNRCTL> set current_listener  
    Current Listener is LISTENERstart LISTENER2status LISTENER2启动一下就好了,默认监听器的名字是LISTENER
      

  10.   

    打错了,不好意思。listener2是这个。我就是配的两个listener,当初配的时候遇到很多问题,最后总结:格式一定要正确。
    LISTENER2 = 
      (DESCRIPTION_LIST = 
        (DESCRIPTION = 
          (ADDRESS = (PROTOCOL = TCP)(HOST = rhel5)(PORT = 1522)) 
        ) 
      ) SID_LIST_LISTENER2 = 
      (SID_LIST = 
        (SID_DESC = 
          (GLOBAL_DBNAME = cli) 
          (ORACLE_HOME = /home/oracle/dbhome/product/10.2.0) 
          (SID_NAME = cli) 
        ) 
      ) 
      

  11.   

    to:dawugui
      2个IP的我原来也配置过,但我现在用的是虚拟机,不想用2个IP。呵呵。。我想在一个IP上实现对于2个端口的监听。。
      

  12.   

    to:xiaoxiao1984
      我刚测试了你这种方法,svr的监听没问题,但在Windows下用Net Configuration Assistant测试,报错:.ORA-28547: 连接服务器失败, 可能是 Oracle Net 管理错误
    测试未成功。
      

  13.   

    listener.ora和tnsnames.ora 要配置的一一对应,或许你可以看下这篇文章:
    http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece76310579535480397634b8c965738848448e4380c075a71e2cf60794613d3b379640aa4435be1e73604645266ecc6949f4aabffc97f6ac96567214b914164885ff8941d73d620e65aedae1fe5b8e477ceee84dc8214029404127af1e7fa5d1763cc7886102692a78e49654860cbfa4767e828063eeb5557b737ee90367976f1e1ad285bb559&p=cb6dde0c92934eac5cb2c771094c&user=baidu
      

  14.   

    to:watson110
      这篇文章我看了,他这个文章是针对一个数据库配置2个不同的监听。而我是想实现 在一个操作系统里,创建2个不同的数据库,用2个监听(监听在不同的端口)来操作这2个不同的数据库。  还有就是,如果我将我的listener.ora 文件内容进行如下修改的话,会报错。
    (SID_NAME = cli)
    (ORACLE_HOME = /home/oracle/dbhome/product/10.2.0)
    (PROGRAM = cli)
    我原来的:
    (SID_NAME = cli)
    (ORACLE_HOME = /home/oracle/dbhome/product/10.2.0) 
    (PROGRAM = extproc) 
    红色部分为修改部分。
    报错:
    NS-01201: Listener cannot find executable /home/oracle/dbhome/product/10.2.0/bin/cli for SID cli
      

  15.   

    问题解决了。呵呵。。仔细看了下 wangxuhero 的方法,然后修改了一下,ok了。呵呵。非常感谢各位的回复。
      

  16.   

    这个还用改tnsnames.ora文件吗?我的listener.ora是这样的:
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (SID_NAME = PLSExtProc)
          (ORACLE_HOME = G:\10g\app\oracle\product\10.2.0\server)
          (PROGRAM = extproc)
        )
        (SID_DESC =
          (SID_NAME = CLRExtProc)
          (ORACLE_HOME = G:\10g\app\oracle\product\10.2.0\server)
          (PROGRAM = extproc)
        )
      )LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
          (ADDRESS = (PROTOCOL = TCP)(HOST = cyl-PC)(PORT = 1521))
        )
      )
      
    LISTENER2 = 
      (DESCRIPTION_LIST = 
      (DESCRIPTION = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = cyl-PC)(PORT = 1522)) 
      ) 
      ) SID_LIST_LISTENER2 = 
      (SID_LIST = 
      (SID_DESC = 
      (GLOBAL_DBNAME = crm) 
      (ORACLE_HOME = G:\10g\app\oracle\product\10.2.0\server) 
      (SID_NAME = crm) 
      ) 
      )   DEFAULT_SERVICE_LISTENER = (XE)为什么没有监听listener2呢?