监听器动态注册是Oracle实例与监听器建立关系的一种重要途径。监听器Listener的作用类似中介,实现Oracle实例和远程Client Process的连接。Listener在“中介”过程中,是需要知道当前服务器上支持哪些Instance,以及对应的$ORACLE_HOME目录是什么。
这个过程中,有两种注册register方法:静态注册和动态注册。所谓静态注册,就是直接在listener.ora文件标记上服务名和对应文件。这种方式下,监听器程序是不知道Instance的真实情况的(启动还是关闭,还是已经僵死),所以在lsnrctl status列表中,静态注册服务的状态通常都是“UNKNOWN”。
动态注册情况则是不同的,Oracle实例会定期与监听器进程进行沟通,告知自身的存在和服务状态。这种方式的好处显而易见,就是让监听器能获取到实例真实的情况信息。目前,除了一些特殊的场景,我们通常都是选择动态注册作为监听主要方式。
动态监听的“责任人”是谁?就是Oracle实例的核心进程pmon。Pmon是Oracle数据库实例里面最重要的进程,可以说PMON存在就表示实例还存在。PMON的职责中,就有一项内容是进行动态注册工作。一些时候,我们会出于研究、分析问题的目的,需要跟踪动态注册行为。本篇就主要介绍几个常用的监控方式方法。
1、实验环境介绍
笔者选择11gR2进行测试,系统监听程序选择动态监听策略。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 – Production
[oracle@aaalife ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 01-SEP-2015 01:17:19
Copyright (c) 1991, 2013, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date 31-AUG-2015 19:43:15
Uptime 0 days 5 hr. 34 min. 3 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/aaalife/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "aaadb" has 1 instance(s).
Instance "aaadb", status READY, has 1 handler(s) for this service...
Service "aaadbXDB" has 1 instance(s).
Instance "aaadb", status READY, has 1 handler(s) for this service...
The command completed successfully'
2、11g listener_registration事件跟踪
进入11g之后,Oracle提供了专门的动态监听跟踪事件方法。借助这种方法可以很方便的进行监听动作跟踪。通过alter system语句启动监听跟踪。
SQL> alter system set events='immediate trace name listener_registration level 3';
System altered.
SQL> alter system register; --主动启动一次监听动作
System altered.
SQL> alter system set events='immediate trace name listener_registration off';
System altered.
定位跟踪文件,注意这个过程是定位当前会话的跟踪文件,动态注册的核心问题是Pmon进程后台跟踪。
SQL> select value from v$diag_info where name='Default Trace File';
VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/aaadb/aaadb/trace/aaadb_ora_26707.trc
其中可以找到对应的pmon跟踪文件。
*** 2015-09-01 01:20:35.026
*** SESSION ID:(162.43) 2015-09-01 01:20:35.026
*** CLIENT ID:() 2015-09-01 01:20:35.026
*** SERVICE NAME:(SYS$USERS) 2015-09-01 01:20:35.026
*** MODULE NAME:(sqlplus@aaalife.localdomain (TNS V1-V3)) 2015-09-01 01:20:35.026
*** ACTION NAME:() 2015-09-01 01:20:35.026
Listener registration dumped to PMON's trace file:
/u01/app/oracle/diag/rdbms/aaadb/aaadb/trace/aaadb_pmon_17791.trc
*** 2015-09-01 01:21:08.871
Listener registration dumped to PMON's trace file:
/u01/app/oracle/diag/rdbms/aaadb/aaadb/trace/aaadb_pmon_17791.trc
在跟踪文件aaadb_pmon_17791.trc中,可以找到注册动作行为。
------------------------------
Start Registration Information
------------------------------
Last update: 431530095 (280 seconds ago)
Flag: 0x4, 0x0
State: succ=1, wait=0, fail=0
Listeners:
0 - (ADDRESS=(PROTOCOL=TCP)(HOST=aaalife.localdomain)(PORT=1521))
state=1, err=0
nse[0]=0, nse[1]=0, nte[0]=0, nte[1]=0, nte[2]=0
ncre=0
endp=(ADDRESS=(PROTOCOL=TCP)(HOST=aaalife.localdomain)(PORT=1521))
flg=0x0 nse=12542
--注册实例名称信息
Instance: aaadb
flg=0x0, upd=0x2
info=(HOST=aaalife)
node load=2, max=20480
inst load=0, max=624
--该实例下所带的服务service信息
Services:
0 - aaadb
flg=0x4, upd=0x6
goodnes=0, delta=1
1 - aaadbXDB
flg=0x5, upd=0x6
goodnes=0, delta=1
Handlers:
0 - Dedicated
flg=0x80002002, upd=0x2
services=aaadb
hdlr load=25, max=399
Dispatchers:
0 - D000
addr=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=28177))
inf=DISPATCHER <machine: aaalife.localdomain, pid: 17865>
flg=0x1004, upd=0x0
services=aaadbXDB
hdlr load=0, max=1022
CMON Handlers:
Listen Endpoints:
----------------------------
End Registration Information
----------------------------
注意:监听器注册行为是分为两端,Oracle Instance负责找监听器注册,监听器也要去接受注册信息。本篇讨论的主要是Instance端的动作行为。在listener.log文件中,我们可以看到约10s一次的动态注册动作。
Tue Sep 01 08:08:36 2015
01-SEP-2015 08:08:36 * service_update * aaadb * 0
Tue Sep 01 08:15:31 2015
01-SEP-2015 08:15:31 * service_update * aaadb * 0
01-SEP-2015 08:15:34 * service_update * aaadb * 0
Tue Sep 01 08:18:37 2015
01-SEP-2015 08:18:37 * service_update * aaadb * 0
Tue Sep 01 08:20:55 2015
01-SEP-2015 08:20:55 * service_update * aaadb * 0
Tue Sep 01 08:25:31 2015
在监听信息中,注册实例、服务信息被加入到其中。
3、oradebug跟踪法
oradebug是我们进行Oracle研究的利器,通过进程层面的分析处理,可以窥视到系统内部机制。在11g之前,使用oradebug是我们跟踪动态注册的一个方法。
首先要知道pmon进程对应的进程编号。
[root@aaalife ~]# ps -ef | grep pmon
oracle 17791 1 0 Aug31 ? 00:00:00 ora_pmon_aaadb
root 27372 27345 0 01:28 pts/1 00:00:00 grep pmon
调用oradebug,绑定pmon进程,监视行为信息。
SQL> oradebug setospid 17791
Oracle pid: 2, Unix process pid: 17791, image: oracle@aaalife.localdomain (PMON)
SQL> oradebug event 10257 trace name context forever, level 16
Statement processed.
SQL> oradebug tracefile_name
/u01/app/oracle/diag/rdbms/aaadb/aaadb/trace/aaadb_pmon_17791.trc
SQL> alter system register;
System altered.
SQL> oradebug event 10257 trace name context off;
Statement processed.
在跟踪文件上,可以找到对应信息。
*** 2015-09-01 01:37:05.833
Received ORADEBUG command (#2) 'event 10257 trace name context forever, level 16' from process 'Unix process pid: 27342, image: <none>'
*** 2015-09-01 01:37:05.833
Finished processing ORADEBUG command (#2) 'event 10257 trace name context forever, level 16'
*** 2015-09-01 01:37:07.785
err=-300 lbflgs=0x0 tbtime=0 tntime=0 etime=300 srvs=1 nreqs=0 sreqs=0 asrvs=1
error=-300 etime=300 control=0 integral=0 lasterr=-300 lastetm=300
kmmlrl: status: succ=1, wait=0, fail=0
(篇幅原因,有省略……)
*** 2015-09-01 01:37:25.798
err=-300 lbflgs=0x0 tbtime=0 tntime=0 etime=300 srvs=1 nreqs=0 sreqs=0 asrvs=1
error=-300 etime=300 control=0 integral=0 lasterr=-300 lastetm=300
kmmlrl: status: succ=1, wait=0, fail=0
*** 2015-09-01 01:37:27.647
kmmlrl: status: succ=1, wait=0, fail=0
kmmlrl: register now
kmmgdnu: aaadbXDB
goodness=0, delta=1,
flags=0x5:unblocked/not overloaded, update=0x6:G/D/-
kmmgdnu: aaadb
goodness=0, delta=1,
flags=0x4:unblocked/not overloaded, update=0x6:G/D/-
kmmlrl: node load 5
kmmlrl: nsgr update returned 0
kmmlrl: nsgr register returned 0
*** 2015-09-01 01:37:30.650
err=-485 lbflgs=0x0 tbtime=0 tntime=0 etime=485 srvs=1 nreqs=0 sreqs=0 asrvs=1
error=-485 etime=485 control=0 integral=0 lasterr=-300 lastetm=300
kmmlrl: status: succ=1, wait=0, fail=0
(篇幅原因,有省略……)
*** 2015-09-01 01:37:57.864
Received ORADEBUG command (#4) 'event 10257 trace name context off' from process 'Unix process pid: 27342, image: <none>'
*** 2015-09-01 01:37:57.864
Finished processing ORADEBUG command (#4) 'event 10257 trace name context off'
其中可见监听动作。
4、结论
动态监听是Oracle对外服务的重要途径步骤,一般而言,动态监听是不会出现大的问题故障的。在一些特殊场合下,我们可能需要进行监听行为跟踪分析,来解决问题故障。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-1788100/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17203031/viewspace-1788100/