記得之前Oracle原廠的工程師在例行檢查時發(fā)現(xiàn)一臺Oracle數(shù)據(jù)庫服務(wù)器的上啟動了兩個監(jiān)聽,分別監(jiān)聽的是1521和1581端口,而且兩個端口都在用,當(dāng)時當(dāng)作一個比較奇怪的現(xiàn)象,沒有能理解原因是什么。最近幾天在看Oracle網(wǎng)絡(luò)配置的文檔,無意間在虛擬機(jī)上啟動了兩個監(jiān)聽,就又想起了之前的問題。到底是因?yàn)槭裁丛蚰兀?/p>
公司主營業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出新民免費(fèi)做網(wǎng)站回饋大家。
下面先來還原一下整個過程。
當(dāng)時是在做配置靜態(tài)監(jiān)聽的練習(xí),在listener.ora中配置了一個靜態(tài)監(jiān)聽:
ORCL = (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.2)(PORT=1581)) SID_LIST_ORCL= (SID_LIST= (SID_DESC= (GLOBAL_DBNAME=orcl) (ORACLE_HOME=/u02/app/oracle/product/11.2.4/db1) (SID_NAME=orcl)))
啟動正常:
[oracle@rhel6 admin]$ lsnrctl start orcl LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 03-JUN-2017 16:22:41 Copyright (c) 1991, 2013, Oracle. All rights reserved. Starting /u02/app/oracle/product/11.2.4/db1/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 11.2.0.4.0 - Production System parameter file is /u02/app/oracle/product/11.2.4/db1/network/admin/listener.ora Log messages written to /u02/app/oracle/diag/tnslsnr/rhel6/orcl/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.2)(PORT=1581))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.2)(PORT=1581))) STATUS of the LISTENER ------------------------ Alias orcl Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production Start Date 03-JUN-2017 16:22:41 Uptime 0 days 0 hr. 0 min. 0 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u02/app/oracle/product/11.2.4/db1/network/admin/listener.ora Listener Log File /u02/app/oracle/diag/tnslsnr/rhel6/orcl/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.2)(PORT=1581))) Services Summary... Service "orcl" has 1 instance(s). Instance "orcl", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully
遠(yuǎn)程測試連接成功
這時不小時敲了lsnrctl start命令,“神奇”的事情發(fā)生了,又一個監(jiān)聽起來了:
使用netstat -nltp查端口,兩個端口都是被監(jiān)聽的狀態(tài):
現(xiàn)在遠(yuǎn)程測試連接,居然也可以連接成功
那么現(xiàn)在問題就來了,為什么可以啟動兩個監(jiān)聽,而兩個監(jiān)聽都可以用呢?而且我在listener.ora中并沒有配置1521端口的監(jiān)聽,為什么可以啟動1521的監(jiān)聽呢?
先來看第二個問題,為什么會啟動對1521端口的監(jiān)聽,從官方文檔中找到這樣一名話:
Because all of the configuration parameters have default values, it is possible to start
and use a listener with no configuration. This default listener has a name of LISTENER,
supports no services on startup, and listens on the following TCP/IP protocol address:
(ADDRESS=(PROTOCOL=tcp)(HOST=host_name)(PORT=1521))
這句話就能解釋為什么會啟動1521端口的監(jiān)聽。我也做了實(shí)驗(yàn),即使是在沒有l(wèi)istener.ora文件的情況下,也會可以啟動名為LISTENER的監(jiān)聽來監(jiān)聽1521端口。
解釋了監(jiān)聽起來的問題,再來看第一個問題,為什么兩個監(jiān)聽都可以用呢?
先了解一下動態(tài)監(jiān)聽和靜態(tài)監(jiān)聽:
動態(tài)監(jiān)聽是在數(shù)據(jù)庫啟動后,PMON進(jìn)程會向本地的端口注冊服務(wù)信息,默認(rèn)是向本地地址的1521端口注冊。而前面啟動的對1521端口的監(jiān)聽正符合默認(rèn)的注冊方式,所以直接可以注冊成功,數(shù)據(jù)庫也可以對外提供服務(wù)。
而最開始配置的靜態(tài)監(jiān)聽的目的就是代替PMON進(jìn)程注冊的工作,直接把數(shù)據(jù)庫的服務(wù)強(qiáng)制綁定到監(jiān)聽上,即使數(shù)據(jù)庫沒有啟動,這個數(shù)據(jù)庫的服務(wù)名還是會在監(jiān)聽中顯示的。
了解了這些之前,就不難理解為什么兩個監(jiān)聽可以同時使用了:數(shù)據(jù)庫默注冊到了1521端口的監(jiān)聽上了,而靜態(tài)監(jiān)聽又強(qiáng)制數(shù)據(jù)庫綁定到了1581端口上,所以兩個監(jiān)聽端口都是可以通的。
所以出現(xiàn)這種情況的原因是配置靜態(tài)監(jiān)聽的時候,使用了是1581端口而非默認(rèn)的1521端口,而且又啟動了默認(rèn)的監(jiān)聽。如果靜態(tài)監(jiān)聽使用的1521端口,也不會出現(xiàn)這樣的情況。
那如何能避免使用非默認(rèn)監(jiān)聽端口時出現(xiàn)這種情況呢?可以在數(shù)據(jù)庫中配置local_listener參數(shù),詳細(xì)參考之前的博客:http://hbxztc.blog.51cto.com/1587495/1890055
官方文檔:http://docs.oracle.com/cd/E11882_01/network.112/e41945/listenercfg.htm#NETAG292