Oracle RAC 11g 通过SCAN连接遇到ORA-12170错误的解决办法

来源:互联网 发布:软件开发毕业设计题目 编辑:程序博客网 时间:2024/05/10 04:51

最近使用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

添加后再次连接成功。

 

0 0