linux 注册监听器,聊聊跟踪监听器动态注册(Dynamic Register)方法

监听器动态注册是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

CORE11.2.0.4.0Production

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

------------------------

AliasLISTENER

VersionTNSLSNR for Linux: Version 11.2.0.4.0 - Production

Start Date31-AUG-2015 19:43:15

Uptime0 days 5 hr. 34 min. 3 sec

Trace Leveloff

SecurityON: Local OS Authentication

SNMPOFF

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

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

oracle1779110 Aug31 ?00:00:00 ora_pmon_aaadb

root27372 273450 01:28 pts/100: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: '

*** 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: '

*** 2015-09-01 01:37:57.864

Finished processing ORADEBUG command (#4) 'event 10257 trace name context off'

其中可见监听动作。

4、结论

动态监听是Oracle对外服务的重要途径步骤,一般而言,动态监听是不会出现大的问题故障的。在一些特殊场合下,我们可能需要进行监听行为跟踪分析,来解决问题故障。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值