中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

說說Oracle監聽器(二)

發布時間:2020-08-07 15:32:42 來源:ITPUB博客 閱讀:167 作者:平平_淡淡 欄目:建站服務器

監聽器工作過程

 

下面我們談談監聽器的工作過程。一般,監聽器作為一個獨立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_nameinstance_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_namedb_domain兩個參數組合成服務名實現注冊。

 

值得注意的一個問題是,service_names參數是一個可以指定多個服務名稱的參數,以逗號分隔。也就是說,一個Oracle實例時可以同時作為多個服務名向外提供服務的。Service_nameOracle在新近版本中提出,替代SID_NAME的概念。使用Service的指定方式,多個Oracle實例就可以統一提供一致的數據訪問服務(也就是RAC)。

 

 

通常,對instance_nameservice_name兩個參數,還是建議設置上。因為會在一定程度上影響到動態注冊的效果。

 

如果沒有顯示的指定這兩個參數,那么只有在數據庫實例啟動在監聽器實例之后的時候,才會一次動態注冊。一旦之后監聽器重新啟動,動態注冊的信息就不會存在,而且很難再次注冊上。所以,我們是推薦將這兩個參數設置上的。

 

只有顯示設置兩個值的情況下,PMON才會周期性的將注冊信息加以注冊。通過命令行,也可以強迫PMON立即執行一次注冊操作。

 

SQL> alter system register

  2  ;

 

System altered

 

 

最后,我們聊一聊動態注冊的作用,支持錯誤轉移failover。注冊操作的發動方是PMON后臺進程,PMONOracle實例最重要的后臺進程,很多資料和DBA都是以該進程的狀態確定數據庫實例的狀態。PMON負責動態注冊,如果不能進行動態注冊,說明PMON已經失去了工作能力,也就意味著監聽程序所服務的實例已經不能工作。

 

通過動態注冊的機制,監聽程序是可以知道所服務的服務器實例已經崩潰,對于客戶端的請求,可以實現錯誤轉移。

 

當然,我們這里談到的崩潰是實例的崩潰。如果監聽器程序崩潰了,情況又是另一種樣子了。

 

 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

惠安县| 宝清县| 南宫市| 丁青县| 宜州市| 白水县| 含山县| 渭源县| 鱼台县| 新丰县| 荔波县| 天长市| 菏泽市| 田林县| 和田县| 普洱| 正镶白旗| 巨野县| 广丰县| 南平市| 广昌县| 方城县| 广饶县| 西昌市| 九寨沟县| 武定县| 鹿邑县| 沅江市| 衢州市| 安义县| 乌兰县| 安丘市| 巴彦县| 鹿泉市| 巴中市| 临高县| 凤阳县| 浪卡子县| 信丰县| 周至县| 北京市|