您好,登錄后才能下訂單哦!
監聽器工作過程
下面我們談談監聽器的工作過程。一般,監聽器作為一個獨立process在操作系統中運行,守候在特定網絡端口(默認為:1521),等待客戶端請求的到來。注意:我們在客戶端配置命名服務的時候,輸入的1521也就是為了與監聽器程序建立連接。
當一個請求“如期而至”,監聽器對照已經注冊的服務列表,查找對應的數據庫實例信息,獲取到指定實例的ORACLE_HOME路徑。相當于表明可以進行連接。
客戶端與實例的交互不是直接的,是通過Server Process作為代理中介來實現的。所有指令SQL都是客戶端通過Server Process發送到實例中,這種體系結構是Oracle對于實例和數據庫文件一種保護機制。
當監聽器獲得請求之后,要從Oracle實例中分配一個Server Process與之對應。這里不同的Oracle連接方式存在一些差別。
如果是專用連接模式,也就是一個客戶端連接對應一個Server Process。監聽器就會向OS請求fork(創造)出一個Server Process,與監聽器嘗試交互。
如果是共享連接模式,也就是多個客戶端共享一個Server Process(注意:這里還不是連接池)。監聽器就會向Dispatcher進程(管理共享模式連接的進程)請求一個Server Process與之交互。
Server Process與監聽器的連接,實際上就是相互信息的交換。Server Process將自身在OS中的進程編號、連接地址信息發給監聽器。監聽器將客戶端信息傳遞給Server Process。
監聽器獲取到Server Process的信息之后,將其返回給客戶端連接程序。客戶端獲取到信息之后,進行重連接,根據返回的信息與Server Process在制定的服務器端口進行聯系。
直到這個時候,客戶端程序才將連接用戶名、密碼等信息發給Server Process,進行登錄驗證等操作。監聽器的工作也就到此結束。
這里面有一個技術細節,就是Server Process與客戶端連接的時候,是允許不使用1521端口的。具體連接的端口,是帶有隨機因素的。在9i版本Windows平臺下,如果安裝了防火墻,只允許1521端口通信,是會帶來一些連接問題。好在在其他平臺上和之后的版本中,實現了一種端口共享技術,連接可以和監聽器一起使用1521端口。
介紹了監聽器工作原理,下面我們說說動靜態注冊的機制。
動靜態注冊機制
在上面的內容中,我們已經初步了解了注冊的作用,就是實現數據庫實例名和服務名注冊到運行的監聽器程序中。目前的Oracle,支持靜態注冊和動態注冊兩種注冊方式。
靜態注冊顧名思義,就是顯示的指定出監聽器程序要為那個實例以哪個服務名做監聽。在啟動監聽器的時候,監聽程序是不知道所監聽實例服務是否存在。直到有客戶端請求指定的服務。
指定靜態注冊的位置是在listener.ora參數文件,下面是一個典型參數文件的結構。
# listener.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = D:\oracle)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
)
其中,SID_LIST配置節點中的SID_DESC就是配置靜態注冊的節點項目。SID_LIST里用來配置當前監聽器注冊的服務項目,通過多個SID_DESC進行配置,每個SID_DESC基本上就是一個配置項目。默認是動態注冊的時候,只有PLSExtProc項目。
靜態配置項目中,通過GLOBAL_NAME配置服務項目,通過SID_NAME指定數據庫實例的名稱,通過ORACLE_HOME配置Oracle數據庫軟件安裝的基本目錄。
動態注冊是與靜態注冊相對應的一種注冊方法。同樣也是通過listener.ora進行配置。下面是一個典型的配置參數文件。
# listener.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = www-0e6111dff74)(PORT = 1521))
)
)
對比上面的靜態注冊文件,可以發現顯示指定服務名稱和數據庫實例名的項目不見了。只有本地地址和監聽器端口信息。
動態注冊的動作是監聽器所在主機上數據庫實例完成。動態注冊是Oracle上一個不能關閉的功能。實例的background process PMON,每隔一段時間(一到兩分鐘)就會將實例的參數信息注冊到監聽器上,實現動態注冊。
注冊的信息是數據庫參數service_name和instance_name。可以通過Show Parameter命令查看。
SQL> show parameter instance_name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string orcl
SQL> show parameter service_names;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string orcl
一般數據庫在建立的時候,這兩個參數都是已經設置好的,不會輕易的發生變化。
如果instance_name參數沒有設置,則系統會選取參數db_name作為實例名稱返回。如果service_names沒有設置,則會將db_name和db_domain兩個參數組合成服務名實現注冊。
值得注意的一個問題是,service_names參數是一個可以指定多個服務名稱的參數,以逗號分隔。也就是說,一個Oracle實例時可以同時作為多個服務名向外提供服務的。Service_name是Oracle在新近版本中提出,替代SID_NAME的概念。使用Service的指定方式,多個Oracle實例就可以統一提供一致的數據訪問服務(也就是RAC)。
通常,對instance_name和service_name兩個參數,還是建議設置上。因為會在一定程度上影響到動態注冊的效果。
如果沒有顯示的指定這兩個參數,那么只有在數據庫實例啟動在監聽器實例之后的時候,才會一次動態注冊。一旦之后監聽器重新啟動,動態注冊的信息就不會存在,而且很難再次注冊上。所以,我們是推薦將這兩個參數設置上的。
只有顯示設置兩個值的情況下,PMON才會周期性的將注冊信息加以注冊。通過命令行,也可以強迫PMON立即執行一次注冊操作。
SQL> alter system register
2 ;
System altered
最后,我們聊一聊動態注冊的作用,支持錯誤轉移failover。注冊操作的發動方是PMON后臺進程,PMON是Oracle實例最重要的后臺進程,很多資料和DBA都是以該進程的狀態確定數據庫實例的狀態。PMON負責動態注冊,如果不能進行動態注冊,說明PMON已經失去了工作能力,也就意味著監聽程序所服務的實例已經不能工作。
通過動態注冊的機制,監聽程序是可以知道所服務的服務器實例已經崩潰,對于客戶端的請求,可以實現錯誤轉移。
當然,我們這里談到的崩潰是實例的崩潰。如果監聽器程序崩潰了,情況又是另一種樣子了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。