溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

說(shuō)說(shuō)Oracle監(jiān)聽(tīng)器(二)

發(fā)布時(shí)間:2020-08-07 15:32:42 來(lái)源:ITPUB博客 閱讀:157 作者:平平_淡淡 欄目:建站服務(wù)器

監(jiān)聽(tīng)器工作過(guò)程

 

下面我們談?wù)劚O(jiān)聽(tīng)器的工作過(guò)程。一般,監(jiān)聽(tīng)器作為一個(gè)獨(dú)立process在操作系統(tǒng)中運(yùn)行,守候在特定網(wǎng)絡(luò)端口(默認(rèn)為:1521),等待客戶端請(qǐng)求的到來(lái)。注意:我們?cè)诳蛻舳伺渲妹?wù)的時(shí)候,輸入的1521也就是為了與監(jiān)聽(tīng)器程序建立連接。

 

當(dāng)一個(gè)請(qǐng)求“如期而至”,監(jiān)聽(tīng)器對(duì)照已經(jīng)注冊(cè)的服務(wù)列表,查找對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)例信息,獲取到指定實(shí)例的ORACLE_HOME路徑。相當(dāng)于表明可以進(jìn)行連接。

 

客戶端與實(shí)例的交互不是直接的,是通過(guò)Server Process作為代理中介來(lái)實(shí)現(xiàn)的。所有指令SQL都是客戶端通過(guò)Server Process發(fā)送到實(shí)例中,這種體系結(jié)構(gòu)是Oracle對(duì)于實(shí)例和數(shù)據(jù)庫(kù)文件一種保護(hù)機(jī)制。

 

當(dāng)監(jiān)聽(tīng)器獲得請(qǐng)求之后,要從Oracle實(shí)例中分配一個(gè)Server Process與之對(duì)應(yīng)。這里不同的Oracle連接方式存在一些差別。

 

如果是專(zhuān)用連接模式,也就是一個(gè)客戶端連接對(duì)應(yīng)一個(gè)Server Process。監(jiān)聽(tīng)器就會(huì)向OS請(qǐng)求fork(創(chuàng)造)出一個(gè)Server Process,與監(jiān)聽(tīng)器嘗試交互。

 

如果是共享連接模式,也就是多個(gè)客戶端共享一個(gè)Server Process(注意:這里還不是連接池)。監(jiān)聽(tīng)器就會(huì)向Dispatcher進(jìn)程(管理共享模式連接的進(jìn)程)請(qǐng)求一個(gè)Server Process與之交互。

 

Server Process與監(jiān)聽(tīng)器的連接,實(shí)際上就是相互信息的交換。Server Process將自身在OS中的進(jìn)程編號(hào)、連接地址信息發(fā)給監(jiān)聽(tīng)器。監(jiān)聽(tīng)器將客戶端信息傳遞給Server Process。

 

監(jiān)聽(tīng)器獲取到Server Process的信息之后,將其返回給客戶端連接程序。客戶端獲取到信息之后,進(jìn)行重連接,根據(jù)返回的信息與Server Process在制定的服務(wù)器端口進(jìn)行聯(lián)系。

 

直到這個(gè)時(shí)候,客戶端程序才將連接用戶名、密碼等信息發(fā)給Server Process,進(jìn)行登錄驗(yàn)證等操作。監(jiān)聽(tīng)器的工作也就到此結(jié)束。

 

這里面有一個(gè)技術(shù)細(xì)節(jié),就是Server Process與客戶端連接的時(shí)候,是允許不使用1521端口的。具體連接的端口,是帶有隨機(jī)因素的。在9i版本Windows平臺(tái)下,如果安裝了防火墻,只允許1521端口通信,是會(huì)帶來(lái)一些連接問(wèn)題。好在在其他平臺(tái)上和之后的版本中,實(shí)現(xiàn)了一種端口共享技術(shù),連接可以和監(jiān)聽(tīng)器一起使用1521端口。

 

介紹了監(jiān)聽(tīng)器工作原理,下面我們說(shuō)說(shuō)動(dòng)靜態(tài)注冊(cè)的機(jī)制。

 

 

 

動(dòng)靜態(tài)注冊(cè)機(jī)制

 

在上面的內(nèi)容中,我們已經(jīng)初步了解了注冊(cè)的作用,就是實(shí)現(xiàn)數(shù)據(jù)庫(kù)實(shí)例名和服務(wù)名注冊(cè)到運(yùn)行的監(jiān)聽(tīng)器程序中。目前的Oracle,支持靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)兩種注冊(cè)方式。

 

靜態(tài)注冊(cè)顧名思義,就是顯示的指定出監(jiān)聽(tīng)器程序要為那個(gè)實(shí)例以哪個(gè)服務(wù)名做監(jiān)聽(tīng)。在啟動(dòng)監(jiān)聽(tīng)器的時(shí)候,監(jiān)聽(tīng)程序是不知道所監(jiān)聽(tīng)實(shí)例服務(wù)是否存在。直到有客戶端請(qǐng)求指定的服務(wù)。

 

指定靜態(tài)注冊(cè)的位置是在listener.ora參數(shù)文件,下面是一個(gè)典型參數(shù)文件的結(jié)構(gòu)。

 

# 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配置節(jié)點(diǎn)中的SID_DESC就是配置靜態(tài)注冊(cè)的節(jié)點(diǎn)項(xiàng)目。SID_LIST里用來(lái)配置當(dāng)前監(jiān)聽(tīng)器注冊(cè)的服務(wù)項(xiàng)目,通過(guò)多個(gè)SID_DESC進(jìn)行配置,每個(gè)SID_DESC基本上就是一個(gè)配置項(xiàng)目。默認(rèn)是動(dòng)態(tài)注冊(cè)的時(shí)候,只有PLSExtProc項(xiàng)目。

 

靜態(tài)配置項(xiàng)目中,通過(guò)GLOBAL_NAME配置服務(wù)項(xiàng)目,通過(guò)SID_NAME指定數(shù)據(jù)庫(kù)實(shí)例的名稱(chēng),通過(guò)ORACLE_HOME配置Oracle數(shù)據(jù)庫(kù)軟件安裝的基本目錄。

 

動(dòng)態(tài)注冊(cè)是與靜態(tài)注冊(cè)相對(duì)應(yīng)的一種注冊(cè)方法。同樣也是通過(guò)listener.ora進(jìn)行配置。下面是一個(gè)典型的配置參數(shù)文件。

 

# 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))

    )

  )

 

對(duì)比上面的靜態(tài)注冊(cè)文件,可以發(fā)現(xiàn)顯示指定服務(wù)名稱(chēng)和數(shù)據(jù)庫(kù)實(shí)例名的項(xiàng)目不見(jiàn)了。只有本地地址和監(jiān)聽(tīng)器端口信息。

 

動(dòng)態(tài)注冊(cè)的動(dòng)作是監(jiān)聽(tīng)器所在主機(jī)上數(shù)據(jù)庫(kù)實(shí)例完成。動(dòng)態(tài)注冊(cè)是Oracle上一個(gè)不能關(guān)閉的功能。實(shí)例的background process PMON,每隔一段時(shí)間(一到兩分鐘)就會(huì)將實(shí)例的參數(shù)信息注冊(cè)到監(jiān)聽(tīng)器上,實(shí)現(xiàn)動(dòng)態(tài)注冊(cè)。

 

注冊(cè)的信息是數(shù)據(jù)庫(kù)參數(shù)service_nameinstance_name。可以通過(guò)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

 

一般數(shù)據(jù)庫(kù)在建立的時(shí)候,這兩個(gè)參數(shù)都是已經(jīng)設(shè)置好的,不會(huì)輕易的發(fā)生變化。

 

如果instance_name參數(shù)沒(méi)有設(shè)置,則系統(tǒng)會(huì)選取參數(shù)db_name作為實(shí)例名稱(chēng)返回。如果service_names沒(méi)有設(shè)置,則會(huì)將db_namedb_domain兩個(gè)參數(shù)組合成服務(wù)名實(shí)現(xiàn)注冊(cè)。

 

值得注意的一個(gè)問(wèn)題是,service_names參數(shù)是一個(gè)可以指定多個(gè)服務(wù)名稱(chēng)的參數(shù),以逗號(hào)分隔。也就是說(shuō),一個(gè)Oracle實(shí)例時(shí)可以同時(shí)作為多個(gè)服務(wù)名向外提供服務(wù)的。Service_nameOracle在新近版本中提出,替代SID_NAME的概念。使用Service的指定方式,多個(gè)Oracle實(shí)例就可以統(tǒng)一提供一致的數(shù)據(jù)訪問(wèn)服務(wù)(也就是RAC)。

 

 

通常,對(duì)instance_nameservice_name兩個(gè)參數(shù),還是建議設(shè)置上。因?yàn)闀?huì)在一定程度上影響到動(dòng)態(tài)注冊(cè)的效果。

 

如果沒(méi)有顯示的指定這兩個(gè)參數(shù),那么只有在數(shù)據(jù)庫(kù)實(shí)例啟動(dòng)在監(jiān)聽(tīng)器實(shí)例之后的時(shí)候,才會(huì)一次動(dòng)態(tài)注冊(cè)。一旦之后監(jiān)聽(tīng)器重新啟動(dòng),動(dòng)態(tài)注冊(cè)的信息就不會(huì)存在,而且很難再次注冊(cè)上。所以,我們是推薦將這兩個(gè)參數(shù)設(shè)置上的。

 

只有顯示設(shè)置兩個(gè)值的情況下,PMON才會(huì)周期性的將注冊(cè)信息加以注冊(cè)。通過(guò)命令行,也可以強(qiáng)迫PMON立即執(zhí)行一次注冊(cè)操作。

 

SQL> alter system register

  2  ;

 

System altered

 

 

最后,我們聊一聊動(dòng)態(tài)注冊(cè)的作用,支持錯(cuò)誤轉(zhuǎn)移failover。注冊(cè)操作的發(fā)動(dòng)方是PMON后臺(tái)進(jìn)程,PMONOracle實(shí)例最重要的后臺(tái)進(jìn)程,很多資料和DBA都是以該進(jìn)程的狀態(tài)確定數(shù)據(jù)庫(kù)實(shí)例的狀態(tài)。PMON負(fù)責(zé)動(dòng)態(tài)注冊(cè),如果不能進(jìn)行動(dòng)態(tài)注冊(cè),說(shuō)明PMON已經(jīng)失去了工作能力,也就意味著監(jiān)聽(tīng)程序所服務(wù)的實(shí)例已經(jīng)不能工作。

 

通過(guò)動(dòng)態(tài)注冊(cè)的機(jī)制,監(jiān)聽(tīng)程序是可以知道所服務(wù)的服務(wù)器實(shí)例已經(jīng)崩潰,對(duì)于客戶端的請(qǐng)求,可以實(shí)現(xiàn)錯(cuò)誤轉(zhuǎn)移。

 

當(dāng)然,我們這里談到的崩潰是實(shí)例的崩潰。如果監(jiān)聽(tīng)器程序崩潰了,情況又是另一種樣子了。

 

 

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI