Oracle 修改預設監聽埠故障分析

chenoracle發表於2022-05-24

環境說明:

OS:Redhat 7.5

DB:Oracle 11.2.0.4.0 單例項

問題:

測試環境資料庫埠使用預設埠1521,嘗試修改預設埠為8821,修改成功後進行驗證。

發現透過8821可以登入到資料庫了,搞定,收工?

sqlplus cjc/******@10.0.0.10:8821/cjcdb

在驗證下1521是不是連線不上了,居然還能連線?

sqlplus cjc/******@10.0.0.10:1521/cjcdb

操作過程如下:

1.停止監聽

lsnrctl stop

2.修改監聽檔案listener.ora

cd $ORACLE_HOME/network/admin

cp listener.ora listener.ora.bak

vi listener.ora

LISTENER =
    (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
        (ADDRESS = (PROTOCOL = TCP)(HOST = myhostname)(PORT = myport))
    )

3.修改tnsnames.ora檔案

cd $ORACLE_HOME/network/admin

cp tnsnames.ora tnsnames.ora.bak

vi tnsnames.ora

(1)修改對應埠號

(2)檔案末尾新增如下內容

MYLISTENER =
    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = myserver )(PORT = myport))
)

4.修改LOCAL_LISTENER引數

show parameter local

ALTER SYSTEM SET LOCAL_LISTENER='MYLISTENER' SCOPE=BOTH;


5.啟動監聽檔案

lsnrctl start


6.驗證

sqlplus cjc/******@10.0.0.10:8821/cjcdb

成功!

sqlplus cjc/******@10.0.0.10:1521/cjcdb

成功?

sqlplus cjc/******@10.0.0.10:61521/cjcdb

隨便寫一個埠號,失敗

問題排查:

為什麼改完埠了透過1521還能遠端登入?

停止監聽

lsnrctl stop

測試,透過1521還能遠端登入

sqlplus cjc/******@10.0.0.10:1521/cjcdb


難道是配置了多個監聽?

全盤搜尋,只有一個listener.ora,而且配置沒問題

#find / -name listener.ora


檢查1521埠對應的程式

lsof -i:1521

找到1521對應程式pid

檢視程式資訊

ps -ef|grep pid

xxx/bin/tnslsnr listener -inherit 

已經停了監聽,為何還有監聽程式

手動殺掉這個程式,重啟監聽恢復正常。

問題原因:

Metalink上沒有找到對應版本的問題,

和Bug 4518443類似,但是版本對不上,這個bug描述如下:

The listener process can hang under load while spawning a process.  

The last process the listener spawned will have a stack which 

includes a mutex lock call in ons_atfork_prepare().


如何檢查你的資料庫是否有這個問題?

ps -ef|grep -i tnslsnr|grep -v grep

如果有2個程式,說明可能會有類似的問題。


解決方案:

臨時解決方案:

殺掉多餘的程式。

永久解決方案:

單例項下,將SUBSCRIBE_FOR_NODE_DOWN_EVENT_<listener_name>=OFF配置到監聽檔案彙總。

或者打補丁。

其他:如何修改RAC環境下預設監聽埠號?

1.檢視當前監聽配置

srvctl config listener

2.修改ocr中記錄的埠號

srvctl modify listener -l LISTENER -p "TCP:<new-listener-port>"

3.修改scan_listener埠號

srvctl modify scan_listener -p <new-scan-port>

4.修改LOCAL_LISTENER 

alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<Host-name>)(PORT=<new-port-number>))))' scope=both sid='[<your-chosen-instance> | * ] '

5.修改REMOTE_LISTENER

6.重啟監聽

參考:

Changing Default Listener Port Number (Doc ID 359277.1)

Changing Listener Ports On RAC/EXADATA (Doc ID 1473035.1)

Bug 4518443 - Listener hang under load (Doc ID 4518443.8)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29785807/viewspace-2896830/,如需轉載,請註明出處,否則將追究法律責任。

相關文章