溫馨提示×

溫馨提示×

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

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

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

發(fā)布時間:2020-08-07 18:30:43 來源:ITPUB博客 閱讀:318 作者:darren__chan 欄目:關(guān)系型數(shù)據(jù)庫

因剛好遇到12c 監(jiān)聽注冊的問題,現(xiàn)將以前關(guān)于oracle 12c lreg進程的一些學(xué)習(xí)文章分享下:

oracle 數(shù)據(jù)庫中 pmon  進程一直承擔(dān)著較多的工作,例如清理進程以及監(jiān)聽注冊等 , 這相當(dāng)于一個人需要同時做好幾件工作, 而當(dāng)其中一件讓他應(yīng)接不暇時,也許這會影響它負責(zé)的其他工作,曾經(jīng)在 11g r2 版本的數(shù)據(jù)庫遇到過 pmon  進程因忙于清理異常中斷的會話而導(dǎo)致服務(wù)更新 和服 務(wù) 注冊出現(xiàn)異常的情況。

oracle12c 以前的版本中服務(wù)注冊一直都是由 PMON 進程負責(zé) , 12c oracle 引入了 LREG (listener registration) 后臺進程接管了這部分工作從而減輕 PMON 的工作。

一. Oracle 監(jiān)聽及服務(wù)注冊:

Oracle 中,監(jiān)聽器是一個監(jiān)測連入客戶端連接請求并建立和管理會話的服務(wù)器端進程。這在當(dāng)數(shù)據(jù)庫實例啟動后不同時間里,數(shù)據(jù)庫實例與監(jiān)聽器聯(lián)系并建立了一條到該實例的通信路徑。

服務(wù)注冊讓監(jiān)聽器能夠確定數(shù)據(jù)庫服務(wù)及其 service handlers (服務(wù)處理程序)是否可用。在注冊期間,服務(wù)注冊進程向 listener 提供實例名稱,數(shù)據(jù)庫服務(wù)名稱以及 service handlers 的類型 ( 專用或共享 ) 和地址。

oracle 12c 以前,負責(zé)服務(wù)注冊的是 pmon 進程:

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

而在 12c 以后,負責(zé)服務(wù)注冊的換成了 LREG 進程:

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

監(jiān)聽沒有啟動 LREG 進程不能注冊服務(wù) , 但是 LREG 進程會定時嘗試注冊 , 如果 local_listener 沒有配置 ,LREG 會嘗試連接默認(rèn)的 1521 端口 , 直到監(jiān)聽進程啟動 在監(jiān)聽啟動后 LREG 進行周期注冊前 , 同樣也可以使用 ”alter system register” 立即注冊服務(wù) .litener 的注冊信息。實際這個過程是動態(tài)注冊的過程。

另一個需要注意的是如果 LREG  進程死了,會同樣和 pmon  一樣,數(shù)據(jù)庫實例也會 crash 。 12c  直接報出的 ora-500,ora-500 則是監(jiān)聽注冊進程死掉。

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

二.動態(tài)注冊的工作過程研究:

1. 使用 oradebug Event 10257 trace name context forever, level 1 6   來將 lreg dump 出來。可以初步看出 lreg 的工作過程:

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

dump  出來的信息可以看出, lreg 進程每 3 秒更新一次狀態(tài),而到約每 60 秒時便會實例信息進行注冊。以下在監(jiān)聽沒有啟動的情況下, LREG woken up to process network events after 0 cs 之后成功的數(shù)量依然為 0 ,說明此時無法注冊成功。

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

   而當(dāng)將監(jiān)聽啟動后,在 60 秒后的下一個注冊是便可以成功注冊。

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

2. 使用 strace  追蹤 lreg 進程的工作過程

當(dāng)數(shù)據(jù)庫運作時其背后發(fā)生了很多事,數(shù)據(jù)庫也是一個應(yīng)用軟件,其背后的這一切都可以追溯到操作系統(tǒng)的工作原理。 在對 lreg 進程進行追蹤可能需要先了解 orcle 監(jiān)聽動態(tài)注冊中的兩個概念:文件描述符和   Sockets 文件 。

當(dāng)監(jiān)聽進程啟動時,它會在 /var/tmp/.oracle 下創(chuàng)建兩個套接字文件。  

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

這些文件均是  socket  文件, 且 s#12214.1  中的 12214  為進程號,則應(yīng)為監(jiān)聽的進程號,這些 socket  文被用作本地客戶端使用進程間通信協(xié)議( ipc )和不同的 oracle 的進程通信,而這些進程包括: tns  監(jiān)聽, css  , crs , evm  守護進程;甚至數(shù)據(jù)庫和 asm  實例。這些 socket  主動監(jiān)聽 的進程創(chuàng)建。在這里 oracle  監(jiān)聽創(chuàng)建這些 socket  文件主要使用用作 lreg 和  tnslsnr   通信。

   同時,會在 /proc 目錄下相應(yīng)進程號文件下創(chuàng)建幾個文件描述符,這些文件描述符( file descriptor )是內(nèi)核為了高效管理已被打開的文件所創(chuàng)建的索引,其是一個非負整數(shù)(通常是小整數(shù)),用于指代被打開的文件,所有執(zhí)行 I/O 操作的系統(tǒng)調(diào)用都通過文件描述符。

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

可以看到有幾個文件描述符,因此,確定有 為進 創(chuàng) 建的文件描述符和 sockets 。

那么 LREG 過程(以前的版本 PMON 行的 動態(tài) 注冊與文件描述符和 sockets 文件相關(guān)的 程是怎 的呢?

這些進程通過系統(tǒng)調(diào)用來查看監(jiān)聽器是否啟動,如果沒有發(fā)現(xiàn)監(jiān)聽進程,則等待,并且在 3000 毫秒之后重新 嘗試 。直到 監(jiān) 聽啟 動時 ,文件描述符被 監(jiān) 聽打開,并被 定以建立彼此之 接。

要找到 LREG 程正在做什么,我使用 STRACE OS 用程序來跟蹤它的工作。  11g 中的 PMON 程的 出不是完全相同的,因 它不是一個 專門 用于在 監(jiān) 聽器中注冊 例的 程。另一方面, LREG 的唯一目的就是 動態(tài) 注冊, 這樣 可以解 兩個 程之 使用的系 統(tǒng)調(diào) 用之 的差異。

以下是 STRACE LREG 進程的日志:  

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

  從以上 strace 日志可以看到主要調(diào)用 epoll_wait()  函數(shù) 函數(shù)表示通 文件描述符來等待某個 I/O 事件發(fā)生的 時間 。 實際 就是一個持 續(xù) 等待某個 IO 事件的 發(fā) 生,而表 現(xiàn) 到數(shù)據(jù) 庫層 面, 應(yīng)該 就可以理解 為監(jiān)視監(jiān)聽進程是否啟動的過程,在 epoll_wait(7, {}, 1024, 3000) 的最后一個 參數(shù) 示的 時間 以毫秒 3000 毫秒 為單 位(也就是 3 秒)。

關(guān)于epoll_wait的解釋:

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

接下來的兩行 getrusage ()函數(shù)表示 源使用消耗,而后面 times() 時間 函數(shù)返回 時間 ,在前面的 時間 打印很明 可以看出是每 3 執(zhí) 行一次函數(shù)。

 再繼續(xù)往下看是 socket 函數(shù)其后面的值為 10 ,表示使用一個 socket 函數(shù)來處理文件描述符 10 。猜測這是用來與監(jiān)聽器進程建立連接的文件描述符。這里使用的套接字是 NETLINK ,用于創(chuàng)建內(nèi)核和網(wǎng)絡(luò)層之間的連接。

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

進一步查看下面的函數(shù), 是對前面函數(shù)返回的文件描述符 10 進行嘗試綁定。

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

在接下來的幾行中,這個文件描述符將被用于與 PID 2582 的連接,而這個 PID 2582 LREG 進程的 PID 。

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

正在嘗試與 IP 地址 127.0.0.1 建立 接,端口號是 1521 。

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

由于沒有啟動監(jiān)聽進程,并且還沒有文件描述符 10 與進程 LREG 相關(guān)聯(lián),因此連接被拒絕,即也沒有建立的連接。

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

而在啟動監(jiān)聽之后, lreg 發(fā)現(xiàn)監(jiān)聽,并可以正常建立連接后則沒有沒有報出被拒絕的錯誤 

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

oracle 12c 新增的LREG進程及其動態(tài)注冊的過程

在以上lreg進程活動的日志可以看出 較多的 epoll_ctl與 epoll_wait函數(shù)調(diào)用,epoll在這里epoll貌似一種不斷來觸發(fā)監(jiān)聽并操作某些文件描述的過程,lreg調(diào)用 epoll_wait  每3秒來監(jiān)測監(jiān)聽進程是否啟動,當(dāng)發(fā)生注冊時使用 epoll_ctl去添加刪除某個文件描述符。具體的確實一時 無法 了解清楚。

   

    在監(jiān)聽程序啟動后,可以使用 lsof –i TCP:1521 命令 來看 lreg 進程與tnslsnr進程的連接。

     ESTABLISHED的意思是建立連接。表示兩個進程正在通信。    ncube-lm是  nCube License Manager (即ncube管理的一個許可證明),意思是被允許,被認(rèn)證開放的意思,這是tnslnr開啟的并處于LISTEN狀態(tài)。

三.總結(jié):

      oracle 12c  除了服務(wù)注冊方面,其網(wǎng)絡(luò)服務(wù)架構(gòu)在數(shù)據(jù)庫并沒有變化。在以前的版本中,服務(wù)注冊是通過PMON進程來完成?,F(xiàn)在 由LREG(listener registration)來處理。LREG 是一個實例級別的后臺進程并且是非常重要, 一旦該進程被殺掉,將導(dǎo)致數(shù)據(jù)庫實例崩,它會 做一切 PMON 過去在實例注冊的方面執(zhí)行的,例如:在監(jiān)聽日志 listener.log 里 service_update, service_register, service_died 。

      由于工作被專屬化,這里我們可以更清晰的了解其工作的過程,例如每3秒一次的監(jiān)測,每60秒一次的嘗試注冊等,都可以清楚的看到。


向AI問一下細節(jié)

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

AI