错误信息

【汉】ORA-12170:TNS:连接超时

【英】ORA-12170:TNS:Connect timeout occurred

报错

已经启动成功的数据库,在使用PLSQL Developer工具连接时报错。

ORA-12170:连接超时_ORA-12170

版本

Oracle 【11.2.0.3.0】、【11.2.0.4.0】

原因

Oracle客户端在连接到服务端时,如果不能在指定的时间内建立连接并验证身份,就会抛出连接超时。指定的时间是由sqlnet.ora文件中的【SQLNET.INBOUND_CONNECT_TIMEOUT】参数决定的,它的意思是指定客户端和服务端连接并验证身份的时间(以秒为单位),默认值是60。

解决方法

既然已经知道是因为没有成功连接引起的问题,那么解决起来也就简单很多了。首先是排查导致客户端没有成功连接到服务端的原因,再就是找到原因后的解决了。

排查

先说排查,虽然Oracle有提供很多连接方式,但我们常用的客户端连接方式就是使用IP+端口去连接到服务端。这种方式排查起来是最简单的,首先检查IP能不能进行连接,如果连接不到就定位到问题是服务端和客户端的IP不能互通;如果能够进行连接,就再检查端口能不能连接。

通常情况下,原因会出现在服务器端口上。

检查ip通信

C:\Users\Administrator>ping 192.168.3.85

ORA-12170:连接超时_ORA-12170_02

从图上看,发送4个,接收4个,没人任何丢包情况,说明客户端和服务端的IP通信没有问题。

检查端口

如果在执行telnet命令时报错命令找不到,就说明你的Windows操作系统中没有启用Telnet客户端。要启用Telnet客户端也很简单,找到控制面板->程序->启用或关闭Windows功能,勾选上Telnet客户端,确定就行了。

C:\Users\Administrator>telnet 192.168.3.85 1521

ORA-12170:连接超时_ORA-12170_03

从图中看到,客户端无法通过1521端口连接到服务器。

解决

排查完后,如果确定问题是出现在IP地址上,那么就得找相关人员或自己去处理IP通信问题。这个就不写具体流程了,因为我也不懂,就不误人子弟了。如果是出现在端口上,那么就轮到我来哔哔几句了。

CentOS 7及以上的版本将firewalld作为默认的防火墙,而之前版本的防火墙是iptables。因此,如果你的服务器上的操作系统版本是CentOS7以上,就检查firewalld的规则;如果是CentOS7以下的版本,就检查iptables的规则。

我这里以CentOS7为例,CentOS7以下的操作系统暂时就不写了,感觉没怎么接触过。另外,如果你的CentOS7系统使用的防火墙是iptables,也不需要再向下看了,下面只写了firewalld的解决方法。

查看firewalld状态

[root@localhost ~]# systemctl status firewalld

ORA-12170:连接超时_ORA-12170_04

firewalld的状态为Active: active (running),则说明已启用。

查看firewalld规则

[root@localhost ~]# firewall-cmd --zone=public --list-ports

ORA-12170:连接超时_ORA-12170_05

执行到这里,看到列表没有任何规则,就已经证实是客户端无法连接到服务端是因为服务器firewalld已启用,但并没有将Oracle数据库监听的端口1521开放。原因找到了,解决方法就无非是要么开放1521端口,要么关闭firewalld。我个人建议你是开放1521端口,而不是关闭firewalld。

关闭firewalld解决

如果你能保证服务器是内网,不会因为防火墙的问题导致安全系数下降,就可以执行关闭。

关闭firewalld

[root@localhost ~]# systemctl stop firewalld.service

禁用firewalld开机

[root@localhost ~]# systemctl disable firewalld.service

开放端口解决

如果你觉得关闭防火墙,操作系统的安全系数会降低,则可以开放端口。

永久开放1521端口

[root@localhost ~]# firewall-cmd --permanent --zone=public --add-port=1521/tcp

重启firewalld

[root@localhost ~]# systemctl restart firewalld.service

重启后,再次使用命令进行测试。

测试端口

C:\Users\Administrator>telnet 192.168.3.85 1521

ORA-12170:连接超时_ORA-12170_06

看到端口能够正常通过,再次测试tnsping。

测试tnsping

C:\Users\Administrator>tnsping 192.168.3.85/orcl

ORA-12170:连接超时_ORA-12170_07

到这里,就彻底解决此问题了。