說說Oracle監聽器(二)
監聽器工作過程
下面我們談談監聽器的工作過程。一般,監聽器作為一個獨立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已經失去了工作能力,也就意味著監聽程式所服務的例項已經不能工作。
透過動態註冊的機制,監聽程式是可以知道所服務的伺服器例項已經崩潰,對於客戶端的請求,可以實現錯誤轉移。
當然,我們這裡談到的崩潰是例項的崩潰。如果監聽器程式崩潰了,情況又是另一種樣子了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25097694/viewspace-2129624/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 說說Oracle監聽器(一)Oracle
- oracle 監聽器配置Oracle
- oracle 監聽器學習Oracle
- Oracle 監聽器日誌解析Oracle
- oracle例項和監聽器Oracle
- 說一說Oracle的最佳化器(Optimizer) (轉)Oracle
- 說說我和Mac(二)Mac
- Oracle 監聽器日誌解析(續)Oracle
- 【Oracle】修改scan監聽器埠號Oracle
- 如何更改oracle監聽器的埠Oracle
- Oracle 監聽Oracle
- 聽說你會 Python ?Python
- 聽,是版本在說話
- 聽說這四個概念,很多 Java 老手都說不清Java
- 說說 方舟編譯器編譯
- Oracle 監聽器日誌配置與管理Oracle
- 設定 Oracle 監聽器密碼(LISTENER)Oracle密碼
- 說說密碼檔案Passwordfile(二)密碼
- Oracle監聽(1)Oracle
- ORACLE動態監聽與靜態監聽Oracle
- oracle靜態監聽和動態監聽Oracle
- 【oracle】動態監聽與靜態監聽Oracle
- 說說Oracle Bind Graduation(上)Oracle
- 說說Oracle Bind Graduation(下)Oracle
- 聽說"快應用"了沒?
- 聽說,阿里“拆中臺”了?阿里
- 聽說這個榜單火了?
- 【Oracle】修改oracle監聽埠Oracle
- 聽說諦聽鬧退休?感知網路接班啦!
- oracle 各資料型別dump說明(二)Oracle資料型別
- oracle靜態監聽Oracle
- JMS監聽Oracle AQOracle
- Oracle監聽的作用Oracle
- ORACLE監聽簡介Oracle
- oracle 監聽重啟Oracle
- 監聽乙太網(三) Packet32資料結構說明 (轉)資料結構
- [譯] 聽說你想學 React.js ?ReactJS
- 聽說你的爬蟲被封了?爬蟲