管理维护Oracle数据库的时候,有时候会碰到用户(应用程序)远程连接/访问数据库非常慢,甚至连接超时的问题。这里简单总结一下遇到这类问题的方法,仅供参考,如有疏漏或不足之处,敬请指正。文中部分内容来自官方文档Doc ID 1679567.1[1] 遇到这类问题,首先应该检查/排除网络问题,一般来说,有一定概率是网络问题或防火墙问题引起的。可以使用下面命令进行验证 如果这里上面两种操作都非常慢/耗时,那边基本可以判断是网络的问题了,如果上面两种操作都正常,那么一般我们需要在客户端和服务端开启SQL*Net trace来诊断问题。这个也是最有效的方法。 在客户端的sqlnet.ora中添加下面参数,就可以在客户端开启SQL*Net trace(即时生效)。就能收集客户端的trace信息。 *最后两个参数是可选项。 一般来说,需要将trace文件打包发给Oracle Supprot技术支持人员分析诊断,当然,除非你有实力能够自己分析诊断。不过一般可以自己分析定位哪一步比较耗时,至于这一步是做啥操作,往往需要专业人员的分析与支持。 还有一种方式就是使用strace分析跟踪,不过这种跟踪方式有时候你都没法进一步定位,如下截图所示 如上截图所示,这个案例中,可以看到下面这一步耗时105.788238秒,但是从这里只知道它是一个read操作,其它无法分析。 1679567.1: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=273660316994015&id=1679567.1&_afrWindowMode=0&_adf.ctrl-state=u275i4zw4_80ping <server_ip>
tnsping <service_name>开启SQL*Net trace
客户端:
TRACE_LEVEL_CLIENT = 16
TRACE_FILE_CLIENT = client
TRACE_DIRECTORY_CLIENT = /tmp/client_trace
TRACE_TIMESTAMP_CLIENT = ON
TRACE_UNIQUE_CLIENT = ON
DIAG_ADR_ENABLED= OFF
#TRACE_FILELEN_CLIENT = 2048 #单位为KB
#TRACE_FILENO_CLIENT = 60服务器端:
TRACE_LEVEL_SERVER = 16
TRACE_FILE_SERVER = server
TRACE_DIRECTORY_SERVER = /tmp/server_trace #根据实际情况设置
TRACE_TIMESTAMP_SERVER = ON
TRACE_UNIQUE_SERVER = ON
DIAG_ADR_ENABLED= OFF
分析跟踪事件
strace -T -t -f -o strace_slow.log sqlplus username/[email protected]:port/service_name
3250503 16:21:57 read(9, "\0\10\0\0\v\0\0\0", 8208) = 8 <105.788238>
参考资料