記得之前Oracle原廠的工程師在例行檢查時發(fā)現(xiàn)一臺Oracle數(shù)據(jù)庫服務(wù)器的上啟動了兩個監(jiān)聽,分別監(jiān)聽的是1521和1581端口,而且兩個端口都在用,當時當作一個比較奇怪的現(xiàn)象,沒有能理解原因是什么。最近幾天在看Oracle網(wǎng)絡(luò)配置的文檔,無意間在虛擬機上啟動了兩個監(jiān)聽,就又想起了之前的問題。到底是因為什么原因呢?
目前創(chuàng)新互聯(lián)已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計、通州網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。下面先來還原一下整個過程。
當時是在做配置靜態(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
遠程測試連接成功
這時不小時敲了lsnrctl start命令,“神奇”的事情發(fā)生了,又一個監(jiān)聽起來了:
使用netstat -nltp查端口,兩個端口都是被監(jiān)聽的狀態(tài):
現(xià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)聽。我也做了實驗,即使是在沒有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進程會向本地的端口注冊服務(wù)信息,默認是向本地地址的1521端口注冊。而前面啟動的對1521端口的監(jiān)聽正符合默認的注冊方式,所以直接可以注冊成功,數(shù)據(jù)庫也可以對外提供服務(wù)。
而最開始配置的靜態(tài)監(jiān)聽的目的就是代替PMON進程注冊的工作,直接把數(shù)據(jù)庫的服務(wù)強制綁定到監(jiān)聽上,即使數(shù)據(jù)庫沒有啟動,這個數(shù)據(jù)庫的服務(wù)名還是會在監(jiān)聽中顯示的。
了解了這些之前,就不難理解為什么兩個監(jiān)聽可以同時使用了:數(shù)據(jù)庫默注冊到了1521端口的監(jiān)聽上了,而靜態(tài)監(jiān)聽又強制數(shù)據(jù)庫綁定到了1581端口上,所以兩個監(jiān)聽端口都是可以通的。
所以出現(xiàn)這種情況的原因是配置靜態(tài)監(jiān)聽的時候,使用了是1581端口而非默認的1521端口,而且又啟動了默認的監(jiān)聽。如果靜態(tài)監(jiān)聽使用的1521端口,也不會出現(xiàn)這樣的情況。
那如何能避免使用非默認監(jiān)聽端口時出現(xiàn)這種情況呢?可以在數(shù)據(jù)庫中配置local_listener參數(shù),詳細參考之前的博客:http://hbxztc.blog.51cto.com/1587495/1890055
官方文檔:http://docs.oracle.com/cd/E11882_01/network.112/e41945/listenercfg.htm#NETAG292
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。