错误信息
【汉】ORA-12170:TNS:连接超时
【英】ORA-12170:TNS:Connect timeout occurred
序
已经启动成功的数据库,在使用PLSQL Developer工具连接时报错。
版本
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
从图上看,发送4个,接收4个,没人任何丢包情况,说明客户端和服务端的IP通信没有问题。
检查端口
如果在执行telnet命令时报错命令找不到,就说明你的Windows操作系统中没有启用Telnet客户端。要启用Telnet客户端也很简单,找到控制面板->程序->启用或关闭Windows功能,勾选上Telnet客户端,确定就行了。
C:\Users\Administrator>telnet 192.168.3.85 1521
从图中看到,客户端无法通过1521端口连接到服务器。
解决
排查完后,如果确定问题是出现在IP地址上,那么就得找相关人员或自己去处理IP通信问题。这个就不写具体流程了,因为我也不懂,就不误人子弟了。如果是出现在端口上,那么就轮到我来哔哔几句了。
CentOS 7及以上的版本将firewalld作为默认的防火墙,而之前版本的防火墙是iptables。因此,如果你的服务器上的操作系统版本是CentOS7以上,就检查firewalld的规则;如果是CentOS7以下的版本,就检查iptables的规则。
我这里以CentOS7为例,CentOS7以下的操作系统暂时就不写了,感觉没怎么接触过。另外,如果你的CentOS7系统使用的防火墙是iptables,也不需要再向下看了,下面只写了firewalld的解决方法。
查看firewalld状态
[root@localhost ~]# systemctl status firewalld
firewalld的状态为Active: active (running),则说明已启用。
查看firewalld规则
[root@localhost ~]# firewall-cmd --zone=public --list-ports
执行到这里,看到列表没有任何规则,就已经证实是客户端无法连接到服务端是因为服务器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
看到端口能够正常通过,再次测试tnsping。
测试tnsping
C:\Users\Administrator>tnsping 192.168.3.85/orcl
到这里,就彻底解决此问题了。
评论区