天天看點

Oracle RAC 11g 通過SCAN連接配接遇到ORA-12170錯誤的解決辦法

最近使用VirtualBox搭建了RAC測試環境,一共建立了4個虛拟機,如下:

vm1: RouterOS,路由系統,虛拟機通路外網的網關,同時支援不同内網中的虛拟機互訪

    網卡1, 橋接網卡, 連接配接主控端網卡, 192.168.31.88/24

    網卡2, 内部網絡, 連接配接LAN01, 用于RAC Public網絡, 172.16.1.254/24

    網卡3, 内部網絡, 連接配接LAN02, 用于RAC Private網絡, 10.0.0.254/24

vm2:Openfiler, iSCSI共享存儲服務

    網卡1, 内部網絡, 連接配接LAN01, 172.16.1.99/24

    網卡2, 内部網絡, 連接配接LAN02, 10.0.0.99/24

vm3: OEL-6.8_x86-64, 安裝Oracle RAC 節點1

    網卡1, 内部網絡, 連接配接LAN01, 172.16.1.1/24

    網卡2, 内部網絡, 連接配接LAN02, 10.0.0.1/24

vm4: OEL-6.8_x86-64, 安裝Oracle RAC 節點2

    網卡1, 内部網絡, 連接配接LAN01, 172.16.1.2/24

    網卡2, 内部網絡, 連接配接LAN02, 10.0.0.2/24

節點1  VIP 172.16.1.11

節點2  VIP 172.16.1.22

SCAN  IP  172.16.1.100

與RouterOS網卡1橋接的主控端網卡IP位址為192.168.31.40

RAC測試環境部署完成後,檢查各項服務和監聽均運作正常,之後進行用戶端連接配接測試:

1.  在RouterOS中添加DST-NAT條目

    192.168.31.88:15211 -->172.16.1.11:1521

    192.168.31.88:15212 -->172.16.1.22:1521

    192.168.31.88:15210--> 172.16.1.100:1521

2.  在主控端上安裝了PL/SQL程式,修改tnsnames.ora檔案,通過Connect TimeConnection Failover方式連接配接:

mydb =

(DESCRIPTION=

    (FAILOVER=ON)

    (ADDRESS_LIST=

      (LOAD_BALANCE=OFF)

     (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.31.88)(PORT=15211))

     (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.31.88)(PORT=15212))

    )

    (CONNECT_DATA=(SERVICE_NAME=mydb))

    )

連接配接成功。

修改tnsnames.ora,通過Runtime Connection Failover方式連接配接:

mydb-scan =

 (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST=192.168.31.88)(PORT=15210))

   )

   (CONNECT_DATA =

     (SERVICE_NAME = mydb)

     (FAILOVER_MODE =

          (TYPE = session)

          (METHOD = basic)

          (RETRIES = 180)

          (DELAY = 5)

     )

   )

 )

無論是SQL*PLUS還是PL/SQL均連接配接失敗,提示資訊為:連接配接逾時,ORA-12170,Google了半天,幾乎把所有解決方法都試了一遍,仍然沒找到問題所在,看來很可能是目前測試環境造成的,沒辦法先開個Server2008的虛拟機(Oracle伺服器,IP位址172.16.1.30),由于這台伺服器屬于内部網絡LAN01,不通過RouterOS進行位址映射,需要對tnsnames.ora稍做改動:

mydb-scan =

 (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST=172.16.1.100)(PORT=1521))

   )

   (CONNECT_DATA =

     (SERVICE_NAME = mydb)

     (FAILOVER_MODE =

          (TYPE = session)

          (METHOD = basic)

          (RETRIES = 180)

          (DELAY = 5)

     )

   )

 )

使用SQL*PLUS連接配接成功,看來十有八九和網絡環境有關了。

使用指令tcpdump –nn port 1521 看了下連接配接成功的資料包,發現前幾個資料包是172.16.1.30和172.16.1.100收發的,第14個包是用戶端(172.16.1.30)向172.16.1.11發送的SYN包,之後的資料包都是這兩個位址在傳輸。

同樣指令檢視了下通過主控端連接配接,并且失敗情況下傳輸的資料,發現前13個資料包是主控端和172.16.1.100收發的,之後再無捕獲資料包,仔細想了下,如果存在第14個資料包,應該是主控端向172.16.1.11或172.16.1.22發送的SYN包,但主控端上并沒有到172.16.1.0/24這個網絡的路由存在,肯定會發送失敗了,使用以下指令在主控端上添加路由即可:

    C:\>route –p add 172.16.1.0 mask 255.255.255.0 192.168.31.88

添加後再次連接配接成功。