Oracle RAC 11gR2 SCAN IP和VIP共用1521監聽埠引發的ORA-12520問題

CNL發表於2014-03-23

問題現象:
Oracle 11.2.0.4.0 RAC SCAN IP和VIP共用1521埠,則只有各個RAC節點上能同時通過scan ip或vip訪問資料庫。

版本:
Oracle:Oracle 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
OS: Linux ...  3.0.13-0.27-default #1 SMP Wed Feb 15 13:33:49 UTC 2012 (d73692b) x86_64 x86_64 x86_64 GNU/Linux

1. 測試場景:
/etc/hosts配置的一個scan ip: IP地址 10.229.174.172 / listener_scan1監聽埠1521, 名稱test_scan ;
兩個rac vip:IP地址分別為10.229.174.168, 10.229.174.169,  listener監聽埠1521, 測試資料庫服務test_db, 例項分別為test_db1,test_db2。

2. 登入rac2-vip: 10.229.174.169機器(listern_scan1在本節點上啟動),檢視listener引數:
SQL> show parameter lis;
NAME                                 TYPE        VALUE
---------------------------------- ----------- ------------------------------
listener_networks                string
local_listener                       string    
                      (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.229.174.169)(PORT=1521))))
remote_listener                    string     test_scan:1521

檢視本機啟動的listener_scan1狀態:

#> lsnrctl status listener_scan1
...
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER_SCAN1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.229.174.172)(PORT=1521)))
...

3. 登入rac1-vip: 10.229.174.168機器,檢視listener引數
SQL> show parameter lis;
NAME                                 TYPE        VALUE
---------------------------------- ----------- ------------------------------
listener_networks                string
local_listener                       string    
                      (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.229.174.168)(PORT=1521))))
remote_listener                    string     test_scan:1521


4. PC客戶端10.233.11.58連線rac1-vip:
C:> sqlplus sys/XXXX@10.229.174.168/test_db as sysdba
SQL> select instance_name from v$insance 顯示結果正確。

5. PC客戶端10.233.11.58連線rac2-vip:
C:> sqlplus sys/XXXX@10.229.174.169/test_db as sysdba
SQL> select instance_name from v$instance 顯示結果正確。

6. PC客戶端10.233.11.58連線scan ip: 
C:> sqlplus sys/XXXX@10.229.174.172/test_db as sysdba
顯示:
ORA-12520: TNS: 監聽程式無法為請求的伺服器型別找到可用的處理程式

檢視scan ip日誌檔案/oracle/app/grid/diag/tnslsnr/rac2/listener_scan1/trace/listener_scan1.log內容,有連續兩次客戶端連線請求資訊,

第一次連線的trace資訊如下:
23-MAR-2014 19:16:10 * (CONNECT_DATA=(SERVICE_NAME=test_db)(CID=(PROGRAM=f:\oracle\product\11.2.0\client_1\bin\sqlplus.exe)(HOST=CNL)(USER=zrlw))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.233.11.58)(PORT=1325)) * establish * test_db * 0
處理結果碼為0:成功。

第二次連線的trace資訊如下:
23-MAR-2014 19:16:10 * (CONNECT_DATA=(SERVICE_NAME=test_db)(CID=(PROGRAM=f:\oracle\product\11.2.0\client_1\bin\sqlplus.exe)(HOST=CNL)(USER=zrlw))(SERVER=dedicated)(INSTANCE_NAME=test_db2)) * (ADDRESS=(PROTOCOL=tcp) (HOST=10.233.11.58)(PORT=1326)) * establish * test_db * 12520
處理結果碼為12520:失敗。

其中第二次資訊中的test_db2是10.229.174.169上的資料庫例項,顯然第二個請求是發給10.229.174.169的1521埠的資料,但被同一機器上部署的listener_scan1(10.229.174.172 : 1521)截獲了。

個人推斷:
Oracle RAC 11g R2的endpoints_listener.ora引數檔案配置的private ip均自動帶有IP=FIRST限定引數,以限定在private ip的網路介面上監聽,從日誌資訊推斷,11.2.0.4.0版本的scan ip可能沒有做IP=FIRST的限制,不僅監聽了自己要監聽的網路介面,而且監聽了本機所有的網路介面(INADDR_ANY),當同機vip埠與其監聽埠相同的時候,scan listener直接截獲了本該由vip listener接收的資料。 如果上述推斷屬實,則本問題應是Oracle RAC 11.2.0.4.0版本的一處BUG。

應對辦法:
分離vip和scan ip的監聽埠,將各個vip的監聽埠改為1522,同時修改local_listener引數,為避免客戶端變動,scan ip埠維持1521不變。
完成埠分離之後經過測試,客戶端的sqlplus / odbc / jdbc 通過scan ip 還是通過vip現在均能正常訪問資料庫了。

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

相關文章