【ASK_ORACLE】Oracle 12.2 Bug導致網路卡出現故障後RAC庫未向TCP註冊本地VIP監聽

Attack_on_Jager發表於2021-08-27

實驗環境

搭建平臺:VMware Workstation

OS:RHEL 7.6

Grid&DB:Oracle 12.2.0.1


問題描述

1. 網路卡NIC發生故障後,發現資料庫註冊不到本地監聽器(監聽使用的VIP):

$ lsnrctl status
##此處省略一部分輸出##
Listening Endpoints Summary...
 (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.xx.xx.165)(PORT=1521)))
 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.xx.xx.166)(PORT=1521)))
The listener supports no services  ##沒有服務被註冊

2. 手工強制註冊監聽:

SQL> alter system register;

再次檢查發現任然沒有註冊上


3. 檢查listener相關引數:

SQL> show parameter listener
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
listener_networks                    string
local_listener                       string       (ADDRESS=(PROTOCOL=TCP)(HOST=
                                                192.xx.xx.166)(PORT=1521))
remote_listener                      string       testdb-scan:1521

貌似也沒有什麼問題......


4. 檢查trace日誌跟蹤顯示傳送了正確的註冊資訊,但是監聽器似乎從未接收過服務資訊。

$ vim /oracle/app/oracle/diag/rdbms/testdb/testdb1/trace/testdb1_lreg_3891.trc
##此處省略一部分輸出##
Unix process pid: 3891, image: oracle@racdb01 (LREG)
##此處省略一部分輸出##
Local listeners:
  0 - (ADDRESS=(PROTOCOL=TCP)(HOST=192.xx.xx.166)(PORT=1521)) pdb 1 dci 0
       state=2, err=0
       nse[0]=0, nse[1]=0, nte[0]=0, nte[1]=0, nte[2]=0
       ncre=0
       endp=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.xx.xx.166)(PORT=1521)))
         flg=0x80000000 nse=0 pri=0x101815c75

日誌顯示註冊資訊已經傳送出去了,但是監聽卻收到過服務資訊。


5. 檢查scan的監聽:

$ lsnrctl status listener_scan1

發現scan沒問題,能看見服務註冊上去。


6. 最後再檢查VNCR(Valid Node Checking Registration)設定:

$ lsnrctl show valid_node_checking_registration
LSNRCTL for LINUX RISC System/6000: Version 12.2.0.1.0 - Production on 16-AUG-2021 10:25:57
Copyright (c) 1991, 2016, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
LISTENER parameter "valid_node_checking_registration" set to SUBNET  ##這裡顯示被設定為SUBNET(一般預設就是這個值)


解決辦法

諮詢了Oracle官方人員,這是一個未公開的 Bug 26739452 引起的,後來我查該Bug編號也確實查不出來。

該Bug與 CRS 自動將 VNCR設定為 SUBNET 值有關,即使在單節點環境中也是如此在這種情況下:當一個節點關閉時,如果沒有子網,資料庫仍在嘗試“SUBNET”安全設定,就會導致LOCAL註冊出現問題。 這個Bug在Oracle 18c修復了

所以,如果不想升級12c,那麼解決辦法如下:

將LOCAL_LISTENER設定為本地VIP監聽器的IPC地址,不再用TCP地址:

SQL> alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL= IPC)(KEY=LISTENER))' scope=both sid='*';

SQL> alter system register;

注:

1)KEY的值要與 listener.ora 檔案中的KEY的值相同

2) 用於 LOCAL 監聽器註冊的 IPC 地址實際上是首選,因為它更安全(IPC僅是“本地”協議),並且它更快(IPC 不容易發生 TCP 網路流量變化)


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

相關文章