伺服器端監聽器配置

賀子_DBA時代發表於2014-06-29
 

1、伺服器端監聽器配置

Oracle監聽器是執行在資料庫端的一個程式,這個程式負責監聽使用者的連線請求。每當收到一個使用者請求,監聽器程式就會建立一個影子程式(Shraw Process),然後把使用者請求轉交給這個影子程式,由影子程式繼續完成使用者提交的各種命令。一旦監聽器程式把使用者轉交給影子程式,監聽程式的任務就算完成了,它就繼續監聽下一個使用者請求。所以監聽器的角色就像一箇中間人,它只是負責為使用者程式和影子程式搭橋牽線。

監聽器是根據配置檔案工作的,這個檔案叫做listener.ora,位於$ORACLE_HOME/network/admin目錄下,因為監聽器只工作在資料庫伺服器端,因此這個檔案只有伺服器端需要,客戶端並不需要這個檔案。這個檔案的內容如下:

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.51)(PORT = 1521))

)

)

這個檔案內容說明監聽器在IP地址192.168.2.51的1521埠上監聽。

Oracle能夠支援兩種連線方式,分別是專有模式(Dedicated Service)和共享模式(Shared Server)。二者的區別在於,專有模式為每個使用者連線啟動一個單獨的程式(Shadow Process),相當於為每個使用者提供一個單獨的到伺服器的會話通道,專有由此得名。而共享模式是躲個使用者連線共享一個程式,也就是多個使用者共享一個會話通道,因此叫做共享。Net Services Administrator’s Guide,使用哪一種模式是在建立資料庫時確定的。

2、靜態註冊和動態註冊

伺服器端的監聽程式和資料庫是兩組獨立的程式。換句話說,一臺物理伺服器上可以同時執行多個資料庫,具體數量取決於伺服器的資源能力,理論上可以是無限的。但是一臺伺服器上一般只需要一個監聽程式就足夠了,一個監聽程式足以為它所在的伺服器上的所有資料庫提供服務,也就是說,監聽程式並不固定為一個資料庫服務。

因為監聽程式並不繫結在特定資料庫,所以監聽器要想完成它的使命——傳遞使用者的連線請求,首先必須知道如果才能知道找到目標資料庫,這個資訊的獲得可以透過兩種方式,靜態註冊和動態註冊。

2.1、靜態配置

所謂靜態配置,就是在配置監聽器時,就明確的告訴監聽器某個資料庫的資訊,監聽器在啟動過程中就會載入這一部分資訊。這個資訊同樣是記錄在監聽器的配置檔案LISTENER.ORA中,下面就是使用靜態配置的LISTENER.ORA檔案,注意其中SID_LIST_LISTENER部分就是靜態配置內容。

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = ORCL.192.168.2.51)

(ORACLE_HOME = C:\oracle\product\10.1.0\Db_1)

(SID_NAME = ORCL)

)

)

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.51)(PORT = 1521))

)

)

這個例子就是說,名字叫做LISTENER的監聽器需要負責SID=ORCL的資料庫的連線請求,靜態配置的最大問題就是監聽器無法知道資料庫的真正狀態。

2.2、動態註冊。

除了靜態配置,Oracle資料庫還可以動態地像監聽器註冊。動態註冊是在instance啟動的時候PMON程式根據init.ora中的INSTANCE_NAME,SERVICE_NAMES兩個引數將例項和服務動態註冊到listener中。要想使用動態註冊功能,首先需要在資料庫的初始化SERVICE_NAME和INSTANCE_NAME。如果沒有定義SERVER_NAME引數,資料庫會使用DB_NAME和DB_DOMAIN組成的一個全域性資料庫名稱(Global Database Name)註冊到監聽器中。INSTANCE_NAME是例項名稱,通常和SID值一樣。

只要資料庫處於執行狀態,PMON程式就會自動、定期的地向監聽程式註冊、更新資訊,DBA也可以使用下面命令強制PMON立即向監聽器註冊:

SQL>alert system register;

System altered.

靜態配置和動態註冊二者在監聽器中的表現狀態不一樣,這一點可以利用Oracle提供的lsnrctl工具來驗證。比如在下面檢視結果中,有兩個ORCL條目,這兩個條目對應的是同一個資料庫,只不過記錄的生成方式不一同。第一條目的狀態是UNKNOWN,這個條目就是靜態配置產生的,而第二條目是READY,這個條目是動態註冊生成的。

在資料庫處於運動狀態時,如果執行lsnrctl status命令來檢視監聽器狀態,可以看到兩個條目。注意兩種方式的狀態區別:靜態配置的狀態是UNKNOWN,動態註冊的狀態是READY。

C:\Documents and Settings\Administrator>lsnrctl start

LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 28-10月-2011 22:04:52

Copyright (c) 1991, 2004, Oracle. All rights reserved.

Starting tnslsnr: please wait...

TNSLSNR for 32-bit Windows: Version 10.1.0.2.0 - Production

System parameter file is C:\oracle\product\10.1.0\Db_1\network\admin\listener.ora

Log messages written to C:\oracle\product\10.1.0\Db_1\network\log\listener.log

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.104)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.104)(PORT=1521)))

STATUS of the LISTENER

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

Alias LISTENER

Version TNSLSNR for 32-bit Windows: Version 10.1.0.2.0 - Production

Start Date 28-10月-2011 21:54:57

Uptime 0 days 0 hr. 0 min. 0 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File C:\oracle\product\10.1.0\Db_1\network\admin\listener.ora

Listener Log File C:\oracle\product\10.1.0\Db_1\network\log\listener.log

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.104)(PORT=1521)))

Services Summary...

Service "ORCL" has 1 instance(s).

Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...

Service " ORCL " has 1 instance(s).

Instance " ORCL ", status READY, has 1 handler(s) for this service...

The command completed successfully

現在關閉資料庫,然後再次檢視監聽器的狀態。現在命令結果就只剩下一個條目了,這個條目的狀態是UNKNOWN,很顯然這二個條目對應的是靜態配置產生的,而動態註冊的那個條目隨著資料庫的關閉已經自動消失了。

C:\Documents and Settings\Administrator>lsnrctl start

LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 28-10月-2011 22:14:51

Copyright (c) 1991, 2004, Oracle. All rights reserved.

Starting tnslsnr: please wait...

TNSLSNR for 32-bit Windows: Version 10.1.0.2.0 - Production

System parameter file is C:\oracle\product\10.1.0\Db_1\network\admin\listener.ora

Log messages written to C:\oracle\product\10.1.0\Db_1\network\log\listener.log

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.104)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.104)(PORT=1521)))

STATUS of the LISTENER

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

Alias LISTENER

Version TNSLSNR for 32-bit Windows: Version 10.1.0.2.0 - Production

Start Date 28-10月-2011 21:54:57

Uptime 0 days 0 hr. 0 min. 0 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File C:\oracle\product\10.1.0\Db_1\network\admin\listener.ora

Listener Log File C:\oracle\product\10.1.0\Db_1\network\log\listener.log

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.104)(PORT=1521)))

Services Summary...

Service "ORCL" has 1 instance(s).

Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

從這個實驗已經很明顯地看出動態註冊和靜態配置的區別了:動態序號產生器制不需要對監聽器做任何額外配置,而結果卻比靜態註冊更準確。靜態配置機制需要針對每個資料庫都做額外的配置,但是結果卻不準確。

除此之外,在RAC環境中中,動態註冊還包括每個例項的負載資訊,這也是RAC能夠實現負載均衡、故障轉移的基礎。

3、LSNRCTL命令

Oracle提供了一個叫做lsnrctl的工具來管理監聽程式。我們剛剛演示了檢視狀態的方法,資料庫的狀態可以有3種。

READY:代表例項可以接受連線請求;

BLOCKED:例項目前不能接受連線請求;

UNKNOWN:這個條目是透過靜態註冊、而不是動態註冊的。

Lsnrctl命令可以使用很多個引數,具體可透過help命令檢視。

日常工作中最常用的選項包括start啟動監聽器,stop停止監聽器,status報告監聽器狀態,reload重新載入listener.ora配置檔案,不需重新啟動監聽器就使配置立即生效。

QUEUESIZE引數

如果監聽器經常同時收到大量的連線請求,這時可以使用這個引數增大監聽器的隊伍長度,這個長度預設是5,見一下例子:

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.51)(PORT = 1521)(QUEUESIZE=20))

)

)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-1198362/,如需轉載,請註明出處,否則將追究法律責任。

相關文章