我们在客户端通过监听连接连接数据库的时候常常会遇到下面两个错误,特别在新搭建的环境中 

   
   
   
   
  1. ORA-12520: TNS:listener could not find available handler for requested type of server 
  2.  
  3. or 
  4.  
  5. ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 

    这种情况的原因很多,也包括有很BUG会导致,下面介绍遇得最多的三种情况。

  1,10g rac环境

    在10g rac环境中,默认创建的数据库(不管是dbca还是命令方式创建的),默认local_listener没有配置在vip上面,所以会遇到上面的错误,这个错误在客户那里遇到过几次了。不过在11G后创建数据库会自己配置LOCAL_LISTENER到VIP地址上面。

    手动修改local_listener到vip地址就可以了。

   
   
   
   
  1. 节点1: 
  2. SQL>Alter system set LOCAL_LISTENER="(address=(protocol=tcp)(host=192.168.100.50)(port=1521))" scope=both sid='power1';  
  3.  
  4. 节点2: 
  5. SQL>Alter system set LOCAL_LISTENER="(address=(protocol=tcp)(host=192.168.100.50)(port=1521))" scope=both sid='power2';  

  2,process

     默认创建数据库的process值是150,一般我们在创建数据库的时候都会修改这个值的大小,但是有些工程师常常忘记修改这个值,这样当process达到149时,后面的连接就会报上面的错误,我们通过下面的视图来查看v$resource_limit.

   
   
   
   
  1. SQL> set lines 170 
  2. SQL> select * from gv$resource_limit where rownum <3; 
  3.  
  4.    INST_ID RESOURCE_NAME                  CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_ALLOCATION   LIMIT_VALUE 
  5. ---------- ------------------------------ ------------------- --------------- -------------------- -------------------- 
  6.          1 processes                                       50              58        150                  150 
  7.          1 sessions                                        62              72        247                  247 

     如果processes的值达到149后,我们可以通过下面的命令来修改。

   
   
   
   
  1. SQL> alter system set processes=1000 scope=spfile sid='*'
  2.  
  3. System altered. 

    不过很悲剧,这个参数是静态参数,修改后要重启instance才会生效。

 3,pmon进程出问题

   我们现在的监听一般都是配置的动态监听,由pmon这个进程来负责监听的注册与管理,如果当pmon出现hang的时候,也就意思差监听可能出问题了。