聊聊跟蹤監聽器動態註冊(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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 監聽動態註冊
- 動態註冊監聽
- 動態監聽註冊
- 【監聽】動態註冊和靜態註冊
- 例項動態註冊跟蹤
- rac監聽動態註冊
- 動態註冊監聽Listener
- Oracle 動態監聽註冊Oracle
- oracle監聽靜態註冊和動態註冊Oracle
- oracle監聽動態註冊與靜態註冊Oracle
- oracle監聽器動態註冊於靜態註冊的區別Oracle
- oracle監聽器的靜態和動態註冊Oracle
- Oracle監聽的靜態註冊和動態註冊Oracle
- Oracle監聽的動態註冊與靜態註冊Oracle
- 【LISTENER】使用“alter system register;”解決動態監聽註冊緩慢問題
- rac監聽不能動態註冊
- oracle監聽動態註冊與靜態註冊[轉帖]Oracle
- Oracle動態監聽註冊測試Oracle
- HPUX 監聽無法動態註冊UX
- 轉載:oracle監聽器的靜態和動態註冊Oracle
- oracle 監聽器動態與靜態註冊服務_listenerOracle
- ORACLE 動態註冊,靜態註冊,多個監聽,一個監聽多個埠配置Oracle
- oracle監聽之動態和靜態註冊Oracle
- Oracle監聽器的靜態註冊與動態註冊,以及DB_DOMAIN問題OracleAI
- 【原創】Oracle的動態監聽註冊Oracle
- oracle監聽【非1521埠】動態註冊Oracle
- 動態和靜態監聽註冊-小魚的理解
- Oracle9i中的監聽動態註冊Oracle
- Oracle 靜態監聽註冊詳解Oracle
- 理解Oracle9i中的監聽動態註冊Oracle
- 監聽器控制程式lsnrctl跟蹤trace file
- 【TRACE】如何設定或動態跟蹤Oracle net偵聽器Oracle
- Oracle 19C 監聽無法動態註冊例項Oracle
- oracle10.2.0.4 動態註冊監聽配置_摘自小荷Oracle
- 理解Oracle9i中的監聽動態註冊(zt)Oracle
- 使用JavaScript給物件修改註冊監聽器JavaScript物件
- 【LISTENER】修改 LISTENER的監聽埠為1526(動態註冊)
- 動態監聽與靜態監聽