代码改变世界

Oracle如何诊断远程访问数据库慢/超时等问题小结

2024-05-29 17:03  潇湘隐者  阅读(544)  评论(0编辑  收藏  举报

管理维护Oracle数据库的时候,有时候会碰到用户(应用程序)远程连接/访问数据库非常慢,甚至连接超时的问题。这里简单总结一下遇到这类问题的方法,仅供参考,如有疏漏或不足之处,敬请指正。文中部分内容来自官方文档Doc ID 1679567.1[1]

遇到这类问题,首先应该检查/排除网络问题,一般来说,有一定概率是网络问题或防火墙问题引起的。可以使用下面命令进行验证

ping <server_ip>
tnsping <service_name>

如果这里上面两种操作都非常慢/耗时,那边基本可以判断是网络的问题了,如果上面两种操作都正常,那么一般我们需要在客户端和服务端开启SQL*Net trace来诊断问题。这个也是最有效的方法。

开启SQL*Net trace

客户端:

在客户端的sqlnet.ora中添加下面参数,就可以在客户端开启SQL*Net trace(即时生效)。就能收集客户端的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
  • 注意事项1:设置trace文件目录时,trace文件路径最后部分千万不要加上反斜杠"/",例如"/tmp/client_trace/",这样会导致无法trace文件无法生成。
  • 注意事项2:在完成跟踪采集后,应该立即在客户端&服务器端关闭trace选项,避免生成大量trace文件,既影响性能,又可能导致空间问题。

分析跟踪事件

一般来说,需要将trace文件打包发给Oracle Supprot技术支持人员分析诊断,当然,除非你有实力能够自己分析诊断。不过一般可以自己分析定位哪一步比较耗时,至于这一步是做啥操作,往往需要专业人员的分析与支持。

还有一种方式就是使用strace分析跟踪,不过这种跟踪方式有时候你都没法进一步定位,如下截图所示

strace -T -t -f -o strace_slow.log sqlplus username/password@xxx.xxx.xxx.xxx:port/service_name

如上截图所示,这个案例中,可以看到下面这一步耗时105.788238秒,但是从这里只知道它是一个read操作,其它无法分析。

3250503 16:21:57 read(9, "\0\10\0\0\v\0\0\0", 8208) = 8 <105.788238>

参考资料

[1]

1679567.1: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=273660316994015&id=1679567.1&_afrWindowMode=0&_adf.ctrl-state=u275i4zw4_80