关于Oracle实例和监听启动顺序问题

关于Oracle服务和监听启动顺序问题,结合自身经验和网上资料做个笔记:
 
        经常用oracle的人对下面的这条信息肯定不会陌生:“监听程序当前无法识别链接描述符中请求的服务”,或者你发现你的实例和监听都已经正常启动了,或者当实例和监听都正常运行时你无意间重启了监听服务但是并没有重启实例,此时可能会发生用PLSQL去连Oracle时提示“ORA-12541:TNS:无监听程序”,但是你在SQLPlus用sqlplus /as sysdba登陆时他没有从你的实例中进去就不会报错。其实产生这个问题的根本原因不是监听没有起来,而是监听没有监听你要连接的oracle实例。
 
        首先oracle只有两者兼备才能向外界提供服务:一个是监听,用于接收用户的请求;一个是实例,真正的提供服务的。但是这两者要协调好才能工作,即实例要告诉监听我准备好了,可以接受外界的服务了。
 
        这里面有个主动和被动的问题,当主动监听时,监听认为实例永远都是准备好的,外界对实例的请求监听都接受,哪怕实例还关着呢。被动就是实例起来后由PMON来向监听注册,告诉监听我准备好了,可以接收外界请求了。
 
        到这里,就要说启动顺序的问题了,在两者同时启动的情况下察觉不到问题,但是当两者不是同时启动情况下有问题了,但这只是个小问题:在等待“很小的一段时间”后问题会自己解决的(这个等待时间正常大概一分钟作用,但也可能更长)。
 
        先启动监听,后启动实例,当从远程客户端连接实例时没有问题,根本察觉不到,因为在启动实例时PMON已经向监听注册实例了,当用户请求时,两者都准备好了,就没问题。
 
        先启动实例,后启动监听,此时会有问题,但是只是个“很小的一段时间”的问题。如果监听刚起来,用户马上就请求连接,这时可能会报“监听程序当前无法识别链接描述符中请求的服务”或者“无监听程序”的错误,原因在于PMON还没来得及向监听注册实例。但是等一会为什么就好了呢?因为PMON是轮循的,它每隔一段时间向监听注册实例,只要监听起来了,当PMON注册时就能注册成功,此时用户在请求就没问题了,但是这个“很小的一段时间”可能不一样,就会影响系统运行和用户体验。
 
        那有没有办法解决这点很短时间的问题呢?有 。这就是变被动监听为主动监听。将实例的描述添加到listener.ora中,这样只要启动监听,就能监听实例,而不管实例的状态如何,只要两者都准备好,OK就没问题。
 
下面给出例子:
修改前:(单纯的监听描述)
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /home/oracle/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
  )
 
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
    )
  )


修改后:(将实例的描述添加到listener.ora后)
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /home/oracle/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /home/oracle/oracle/product/10.2.0/db_1)
      (SID_NAME = orcl)
    )
  )
 
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
    )
  )
 
 
 
注:什么是PMON——
PMON (进程监控进程):
进程监控进程:负责服务器进程的管理和维护工 作,在进程失败或连接异常发生时该进程负责以下一些清理工作:
1、回滚没有提交的事务 
2、释放所持有的当前的表或行锁 
3、释放进程占用的SGA资源 
4、监视其他oracle的后台进程,在必要时重启这些后台进程 
5、向oracle TNS监听器注册刚启动的实例。如果监听器在运行,就与这个监听器通信并传递,如服务名和实例的负载等参数,如果监听器没有启动,进程监控(PMON)会定期 地尝试连接监听来注册实例。
posted @ 2020-05-13 12:00  BestTarry  阅读(891)  评论(0编辑  收藏  举报