问题现象:
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/