现象:开发人员抱怨RAC数据库出现了时连得上时连不上的情况,用SQLPLUS一试,果然有这样的情况:
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
ERROR:
ORA-12170: TNS: 连接超时
警告: 您不再连接到 ORACLE。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> select instance_name from sys.v_$instance;
INSTANCE_NAME
----------------
rac1
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
ERROR:
ORA-12170: TNS: 连接超时
警告: 您不再连接到 ORACLE。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL> conn system/*******@bjyd
已连接。
SQL>
检查两个节点主机和网络,均未开启防火墙:
[oracle@BJYD01 trace]$ su -
[root@BJYD01 ~]# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@BJYD02 ~]# service iptables status
Firewall is stopped.
[root@BJYD02 ~]#
sqlnet开启16级别的trace:
Fatal NI connect error 12170.
VERSION INFORMATION:
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
Windows NT TCP/IP NT Protocol Adapter for 32-bit Windows: Version 10.2.0.1.0 - Production
Time: 10-7?? -2013 09:03:38
Tracing not turned on.
Tns error struct:
ns main err code: 12535
TNS-12535: TNS: 2ù×÷3?ê±
ns secondary err code: 12560
nt main err code: 505
TNS-00505: 2ù×÷3?ê±
nt secondary err code: 60
nt OS err code: 0
Client address: <unknown>
[10-7?? -2013 09:13:58:741] ntt2err: entry
[10-7?? -2013 09:13:58:741] ntt2err: soc 284 error - operation=1, ntresnt[0]=505, ntresnt[1]=60, ntresnt[2]=0
[10-7?? -2013 09:13:58:741] ntt2err: exit
[10-7?? -2013 09:13:58:841] nttcni: exit
[10-7?? -2013 09:13:58:841] nttcon: exit
[10-7?? -2013 09:13:58:841] nserror: entry
[10-7?? -2013 09:13:58:841] nserror: nsres: id=0, op=65, ns=12535, ns2=12560; nt[0]=505, nt[1]=60, nt[2]=0; ora[0]=0, ora[1]=0, ora[2]=0
分析:
通常说来,ORA-12535/TNS-12535意味着在client和server之间的通讯时存在超时现象,有以下几种原因:
1.client和server之间设置了防火墙(包括OS层面的和网络层面的)
2.网速较慢导致出现超时
3.网卡故障
4.无法将主机名解释为IP地址也会导致超时
已经知道可能的原因了,那么可以通过排除法进行判断:
1,4经过检查可以排除,
2,3都存在可能。
首先我假定2--是网速较慢导致timeout,所以我在在sqlnet.ora中设置
SQLNET.INBOUND_CONNECT_TIMEOUT=180
(180秒我们认为是一个足够大的时间了,在慢速网络中基本可以排除超时的情况)
但设置了这个参数之后,问题依旧,再加之经过网络工程师的检查,没发现网络有异常的现象。
所以,我认为基本可以排除原因2。
那么进一步推测,是原因3导致的吗?
1)我发现了偶尔从节点1到节点2(Public IP)SSH不通的现象:
[oracle@BJYD01 ~]$
[oracle@BJYD01 ~]$ ssh BJYD02
ssh: connect to host BJYD02 port 22: Connection timed out
[oracle@BJYD01 ~]$
[oracle@BJYD01 ~]$ ssh BJYD02
Last login: Thu Jul 11 17:10:49 2013 from BJYD01
[oracle@BJYD02 ~]$
但SSH Private IP没这个问题。
从节点2到节点1SSH无论Public IP还是Private IP都没问题。
2)ifconfig查看,发现节点2的Public IP所在的eth0网卡有较严重的drop包现象(该处未截屏记录下来),
其它网卡以及节点1上的2个网卡均正常。
怀疑eth0网卡问题,尝试通过换掉eth0网卡解决问题。
解决方法:
最终将节点2的eth0网卡换掉之后,问题成功解决。
推断根本原因可能是:
1.节点2的eth0网卡老化导致故障;
2.节点2的eth0网口松动。