Oracle監聽器listener是一個重要的數據庫服務器組件,在整個Oracle體系結構中,扮演着重要的作用。
監聽器Lisener功能
從當前的Oracle版本看,Listener主要負責下面的幾方面功能:
1、 監聽客戶端請求。監聽器運行在數據庫服務器之上,與Oracle實例(可爲多個)相關關聯,是一個專門的進程process,在windows的服務項目或者Linux的運行進程列表中,都會看到對應的運行進程。Windows上名爲TNSLSNR,Linux/Unix平臺上是lsnrctl。監聽器守候在服務器制定端口(默認爲:1521),監聽客戶端的請求。
2、 爲客戶端請求分配Server Process。監聽器只負責接聽請求,之後將請求轉接給Oracle Server Process。在Oracle的服務模式下,客戶端進程是不允許直接操作數據庫實例和數據,而是通過一個服務進程Server Process(也稱爲影子進程)作爲代理。監聽器接受到請求之後,就向操作系統(或者Dispatcher組件)要求fork(或分配)一個Server Process與客戶端相連。
3、 註冊實例服務。本質上將,listener是建立實例和客戶端進程之間聯繫的橋樑。Listener與實例之間的聯繫,就是通過註冊的過程來實現的。註冊的過程就是實例告訴監聽器,它的數據庫數據庫實例名稱instance_name和服務名service_names。監聽器註冊上這樣的信息,對客戶端請求根據監聽註冊信息,找到正確的服務實例名稱。目前Oracle版本中,提供動態註冊和靜態註冊兩種方式。
4、 錯誤轉移failover。Failover是RAC容錯的一個重要方面功能,其功能是在數據庫實例崩潰的時候,可以自動將請求轉移到其他可用實例上的一種功能。可以提供很大程度上的可用性(Availability)功能。這個過程中,發現實例已經崩潰,並且將請求轉移到其他實例上,就屬於是listener的功能。
5、 負載均衡衡量。在RAC架構中,Oracle實現了負載均衡。當一個客戶請求到來時,Oracle會根據當前RAC集羣環境中所有實例的負載情況,避開負載較高的實例,將請求轉移到負載較低的實例進行處理。在早期RAC版本中,負載輕重的衡量是根據監聽器當前維護連接數目來確定的,而不是實時查看多實例的負載。RAC環境中的監聽器之間進行溝通通信。
下面的部分,會從幾個方面對監聽器進行簡單介紹。
監聽器操作
監聽器在Windows和Linux/Unix平臺上,都是可以直接操作的。下面以Windows平臺操作爲例,其他平臺類似。
在命令行窗口(CMD),輸入lsnrctl,就可以進入監聽器控制窗口。
C:\Documents and Settings\Administrator>lsnrctl
LSNRCTL for 32-bit Windows: Version10.2.0.1.0 - Production on 26-12月-2010 21:5
3:04
Copyright (c) 1991, 2005, Oracle. All rights reserved.
歡迎來到LSNRCTL,請鍵入"help"以獲得信息。
LSNRCTL>
通過輸入命令help,可以查看支持的監聽器操作。下面僅介紹常用的幾個。
1、 查看當前監聽器狀態
敲入status,可以查看當前監聽器的狀態,對應操作日誌信息和服務註冊信息等內容。如下:
LSNRCTL> status
//連接監聽器的名稱和信息:主機名+監聽端口號
正在連接到(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=www-0e6111dff74)(PORT=1521)
))
LISTENER的STATUS
------------------------
別名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version10.2.0.1.0 – Production//Listener版本信息,在一臺機器多實例的情況下,很重要!因爲版本對應向下兼容
啓動日期 26-12月-2010 19:38:03//啓動服務時間
正常運行時間 天2小時23分51秒
跟蹤級別 off //調試信息,可以設置針對監聽器的跟蹤
安全性 ON: Local OS Authentication //表明啓動、關閉監聽器的操作權限是通過OS驗證實現的。也就意味着,可以對監聽器設置密碼項目,也是Oracle安全配置的一個重要方面;
SNMP OFF//SNMP協議開啓情況
監聽程序參數文件 D:\oracle\network\admin\listener.ora//使用的參數
監聽程序日誌文件 D:\oracle\network\log\listener.log//操作日誌位置
監聽端點概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=www-0e6111dff74)(PORT=1521)))
服務摘要..//當前已經註冊在監聽器中的服務列表
服務"PLSExtProc"包含1個例程。
例程"PLSExtProc",狀態UNKNOWN,包含此服務的1個處理程序...
服務"orcl"包含1個例程。
例程"orcl",狀態READY,包含此服務的1個處理程序...
服務"orclXDB"包含1個例程。
例程"orcl",狀態READY,包含此服務的1個處理程序...
服務"orcl_XPT"包含1個例程。
例程"orcl",狀態READY,包含此服務的1個處理程序...
命令執行成功
上面通過紅字,已經對結果進行一定程度說明。其中,需要額外注意的下面幾項內容。
監聽程序參數文件 D:\oracle\network\admin\listener.ora//使用的參數
監聽器啓動時依據參數文件的,當然沒有參數文件監聽器也是可以啓動,那時監聽器依據默認的行爲操作。這個參數指定了監聽器參數文件的位置,listener.ora。這個文件是一個文本類型參數文件,描述了監聽器監聽端口,主機名稱和靜態註冊信息。Listener.ora是隨着數據庫實例的建立之後,建立監聽器的過程中動態配置的。
監聽程序日誌文件 D:\oracle\network\log\listener.log//操作日誌位置
監聽器日誌,是一個記錄和描述監聽器工作和錯誤的信息庫。通過仔細研究日誌內容,可以幫助我們發現當前的監聽器的問題、解決連接故障和深入理解監聽器工作原理。
服務"orcl"包含1個例程。
例程"orcl",狀態READY,包含此服務的1個處理程序...
上文中已經說明,監聽器有註冊功能,通過status命令(services命令同樣效果)。可以查看到當前有什麼服務被註冊上,用來檢查連接服務失敗,是常用的工具。
2、開啓/關閉監聽器
監聽器的行爲受到參數文件的控制,我們有時候需要調整監聽器的參數。調整監聽參數的方法,可以通過Oracle提供的GUI界面完成,還可以通過手工修改listener.ora來完成。
因爲參數文件listener.ora是一個文本文件。Oracle對於文本類型的參數文件,大多數情況下是不支持熱加載的。Pfile和listener.ora都是如此。
使用界面GUI,就是使用Net Configuration Assistant來配置。配置完成後,配置程序會自動重新啓動監聽器程序,來加載修改的參數文件。如果採用手工修改listener.ora,就必須要手工的進行監聽程序關閉和啓動。
LSNRCTL> stop
正在連接到(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=www-0e6111dff74)(PORT=1521)
))
命令執行成功
LSNRCTL> start
啓動tnslsnr:請稍候...
TNSLSNR for 32-bit Windows: Version10.2.0.1.0 - Production
系統參數文件爲D:\oracle\network\admin\listener.ora
寫入D:\oracle\network\log\listener.log的日誌信息
監聽: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=www-0e6111dff74)(PORT=1521)))
正在連接到(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=www-0e6111dff74)(PORT=1521)
))
LISTENER的STATUS
------------------------
別名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version10.2.0.1.0 - Production
啓動日期 26-12月-2010 22:32:34
正常運行時間 天小時分2秒
跟蹤級別 off
安全性 ON: Local OS Authentication
SNMP OFF
監聽程序參數文件 D:\oracle\network\admin\listener.ora
監聽程序日誌文件 D:\oracle\network\log\listener.log
監聽端點概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=www-0e6111dff74)(PORT=1521)))
服務摘要..
服務"PLSExtProc"包含1個例程。
例程"PLSExtProc",狀態UNKNOWN,包含此服務的1個處理程序...
命令執行成功
這裏多說一句關於監聽器的參數配置。使用GUI可以滿足大部分的情況,而且可以避免拼寫錯誤引發的監聽器故障(監聽器不會檢查配置項目的正確與否)。但是,在一些比較複雜的情況下,比如一臺機器綁定多個IP的情況,或者RAC的複雜功能配置上,還是傾向於使用手工編寫listener.ora的方法。
此外,lsnrctl提示行還提供了reload命令,可以在listener啓動的情況下,重新加載文件和SID信息。但是筆者還是比較喜歡stop+start的組合。
如果是在windows平臺下,啓動關閉監聽器還可以在系統服務項目列表中操作,效果是一樣的。