Oracle RAC 11gR2 SCAN IP和VIP共用1521监听端口引发的ORA-12520问题

问题现象:
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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31840/viewspace-1127876/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值