一.背景
在工作中,总是会碰到数据库连不上的问题,有很多原因会导致连接不上,例如网络限制、部分平台监听日志大于4G、防火墙、客户端问题、数据库异常、服务器主机资源不足等。《DBA攻坚指南》里面对连接问题提供了一个排查思路,我这里整理出来做个笔记。
二.几种连接异常的现象
- 之前连接正常,在无任何改动的情况下,所有客户端无法连接,如果网络是正常的则很有可能是服务器端的问题。
- 如果大部分连接正常,只有个别或新添加的客户端无法连接,则很有可能是客户端自身的问题。
- 若与服务器同网段的连接是正常的,而跨网段的连接出现异常,则有可能是网络限制(如没有正确添加路由等)问题。
- 连接缓慢或者间歇性无法连接,排除监听日志4GB的限制和资源不足的情况,在网络正常的情况下需要开启跟踪,以便有更多信息进行具体分析。
- 数据库连接模式有共享和独占两种模式,如果连接缓慢,而且tnsnames.ora里面描述连接模式为共享,那就需要检查shared_servers、max_shared_servers等参数的设置。 现在内存资源充足,一般都是使用独占模式,也建议使用独占模式。
三.排查思路
客户端网络–客户端防火墙–端口–监听–服务端监听–服务端数据库状态–服务端设置

四.sqlnet介绍
sqlnet是oracle提供的用于网络交互的一个工具,比如,解析客户端发起的连接、对连接进行辨别、特定连接的阻隔限制、启用日志跟踪等一系列功能。
4.1.sqlnet.ora默认内容
--SQLNET.ORA里面关于允许连接的默认内容:
windows:
SQLNET.AUTHENTICATION_SERVICES=(NTS)
--说明允许本地曹组系统用户认证。
linux:
NAMES.DIRECTORY_PATH=(TNSNAMES,EZCONNECT)
tnsnames和ezconnect表示允许的连接模式。
--连接串:sqlplus system/oracle@orcl180
--简易连接:sqlplus system/oracle@192.168.59.180:1521/orcl
4.2.sqlnet.ora常用参数
--客户端限制(default = no)
TCP.VALIDNODE_CHECKING
--指定不允许访问的客户端
--打开限制
TCP.VALIDNODE_CHECKING=yes
--可以使用主机名或者ip地址,用逗号分隔
TCP.EXCLUDED_NODES=(hostname | ip_address,hostname | ip_address,...)
--指定允许访问的客户端
--打开限制
TCP.VALIDNODE_CHECKING=yes
--可以使用主机名或者ip地址,用逗号分隔
--注意:TCP.INVATED_NODES优先级高于TCP.EXCLUDED_NODES
TCP.INVATED_NODES=(hostname | ip_address,hostname | ip_address,...)
--客户端超时时间设置(单位为秒)
SQLNET.INBOUND_CONNECT_TIMEOUT=10
--限制客户端版本
SQLNET_ALLOWED_LOGON_VERSIONS=n
--12c以上版本中格式为
SQLNET.ALLOWED_LOGON_VERSION_SERVER=n
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=n
如果我们升级到19c之后,部分客户端可能默认就无法连接了,我们可以改这里的客户端版本限制。
4.3.sqlnet开启跟踪
设置:
TRACE_LEVEL_CLIENT=16 TRACE_FILE_CLIENT=CLIENT TRACE_TIMESTAMP_CLIENT=ON TRACE_DIRECTORY_CLIENT=C:\app\Administrator\product\11.2.0\client_1\network\admin
- TRACE_LEVEL_CLIENT:开启客户端跟踪级别,取值为0-16,系统默认为0,即不生成。
- TRACE_FILE_CLIENT:设置是客户端还是服务端
- TRACE_TIMESTAMP_CLIENT:是否记录每条日志的时间戳
- TRACE_DIRECTORY_CLIENT:设置trace问题件的产生目录
4.4.防止攻击者利用远程注册攻击
很多攻击者会利用远程注册这一特性,在监听下远程注册同名数据库实例。新登入的用户,在TNS(透明网络底层)负载均衡的策略下,有可能会登录到伪造的监听服务上,攻击者会监控用户的登入过程,并将相关数据流量转发到真实的数据库上。利用CVE-2012-3137获得通信过程中的认证相关信息,并对认证相关信息进行离线的暴力破解,获得登入密码,最后完成对生产数据的访问。这就是OracleTNS监听远程注册投毒原理。
解决方法:
--在 Oracle11g11 .2.0.4及以上版本的所有节点的listener. ora文件中进行如下操作。
--对于单实例,添加以下命令:
VALID_NODE CHECKINGREGISTRATIONLISTENER =1
--对于RAC集群,添加以下命令:
VALID_NODE_CHECKING_ REGISTRATION _LISTENER=1
VALIDNODE_CHECKING_ REGISTRATIONLISTENERSCAN1 =1
REGISTRATIONINVITED _NODES_LISTENER_SCANl=(<list of publicip's of all nodes>)
--例如,对于拥有两个SCAN监听的RAC环境,先设置如下命令:
VALID_NODE_ CHECKINGREGISTRATIONLISTENER =1
VALID_NODE_CHECKING_ REGISTRATION _LISTENER_SCAN1=1
REGISTRATIONITED _ NODESLISTENERSCAN1 =(192.168.238.190, 192.168.238.191)
VALID_NODE_CHECKING_ REGISTRATIONLISTENER _SCAN2=1
REGISTRATIONIINVITED _NODES_LISTENER_SCAN2=(192.168.1390, 192.168.238.191
--最后,重新加载上述配置信息,使之生效,命令如下:
shell>Isnrctl reload
shell>Isnrctl reload listener scanl
shell>lsnrctl reload listener _scan2
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




