聊聊跟蹤監聽器動態註冊(Dynamic Register)方法

realkid4發表於2015-09-01

 

監聽器動態註冊是Oracle例項與監聽器建立關係的一種重要途徑。監聽器Listener的作用類似中介,實現Oracle例項和遠端Client Process的連線。Listener在“中介”過程中,是需要知道當前伺服器上支援哪些Instance,以及對應的$ORACLE_HOME目錄是什麼。

 

這個過程中,有兩種註冊register方法:靜態註冊和動態註冊。所謂靜態註冊,就是直接在listener.ora檔案標記上服務名和對應檔案。這種方式下,監聽器程式是不知道Instance的真實情況的(啟動還是關閉,還是已經僵死),所以在lsnrctl status列表中,靜態註冊服務的狀態通常都是“UNKNOWN”。

 

動態註冊情況則是不同的,Oracle例項會定期與監聽器程式進行溝通,告知自身的存在和服務狀態。這種方式的好處顯而易見,就是讓監聽器能獲取到例項真實的情況資訊。目前,除了一些特殊的場景,我們通常都是選擇動態註冊作為監聽主要方式。

 

動態監聽的“責任人”是誰?就是Oracle例項的核心程式pmonPmonOracle資料庫例項裡面最重要的程式,可以說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'

 

 

211g 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

 

 

在監聽資訊中,註冊例項、服務資訊被加入到其中。

 

3oradebug跟蹤法

 

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章