故障排除步骤(文档 ID 730066.1)
连接超时错误 ORA-3135 和 ORA-3136
当尝试连接到数据库时未在以下允许的时间段内完成其连接和身份验证阶段时,可能会发出连接超时错误:
SQLNET.INBOUND_CONNECT_TIMEOUT 和/或 INBOUND_CONNECT_TIMEOUT_ 服务器端参数。
从 Oracle 10.2 开始,这些参数的默认值为 60 秒,而在以前的版本中为 0,表示没有超时。
在超时时,客户端程序将收到 ORA-3135(或可能是 TNS-3135)错误:
ORA-3135 连接丢失
并且数据库将在其 alert.log 中记录 ORA-3136 错误:
... 2008 年 5 月 10 日星期六 02:21:38
警告:入站连接超时 (ORA-3136) ...
当数据库会话处于身份验证阶段时,它将发出一系列 SQL 语句。直到所有这些都被完全解析、执行、获取后,身份验证才完成。此列表中的一些 SQL 语句,例如在 10.2 上是:
select value$ from props$ where name = 'GLOBAL_DB_NAME'
select privilege#,level from sysauth$ connect by grantee#=prior privilege#
and privilege#>0 start with grantee#=:1 and privilege#>0
select SYS_CONTEXT('USERENV', 'SERVER_HOST'), SYS_CONTEXT('USERENV', 'DB_UNIQUE_NAME'),
SYS_CONTEXT('USERENV', 'INSTANCE_NAME'), SYS_CONTEXT('USERENV', 'SERVICE_NAME'),
INSTANCE_NUMBER, STARTUP_TIME, SYS_CONTEXT('USERENV', 'DB_DOMAIN')
from v$instance where INSTANCE_NAME=SYS_CONTEXT('USERENV', 'INSTANCE_NAME')
select privilege# from sysauth$ where (grantee#=:1 or grantee#=1) and privilege#>0
ALTER SESSION SET NLS_LANGUAGE= 'AMERICAN' NLS_TERRITORY= 'AMERICA' NLS_CURRENCY= '$'
NLS_ISO_CURRENCY= 'AMERICA' NLS_NUMERIC_CHARACTERS= '.,' NLS_CALENDAR= 'GREGORIAN'
NLS_DATE_FORMAT= 'DD-MON-RR' NLS_DATE_LANGUAGE= 'AMERICAN' NLS_SORT= 'BINARY' TIME_ZONE= '+02:00'
NLS_COMP= 'BINARY' NLS_DUAL_CURRENCY= '$' NLS_TIME_FORMAT= 'HH.MI.SSXFF AM' NLS_TIMESTAMP_FORMAT=
'DD-MON-RR HH.MI.SSXFF AM' NLS_TIME_TZ_FORMAT= 'HH.MI.SSXFF AM TZR' NLS_TIMESTAMP_TZ_FORMAT=
'DD-MON-RR HH.MI.SSXFF AM TZR'
注意:以上 SQL 列表不完整,不代表认证 SQL 的排序。版本之间也可能存在差异。
上述 SQL 语句需要像 Oracle 数据库中的所有 SQL 一样进行解析、执行和提取。因此,在这些阶段遇到的任何表现为挂起或性能严重下降的问题都可能导致超时。
身份验证会话将在等待时看到此类挂起的症状:
• 光标:引脚 S 在 X 上等待
• 闩锁:行缓存对象
• 行高速缓存锁
其他类型的等待事件是可能的;此列表可能不完整。
这里的问题是身份验证会话被阻止等待获取数据库中另一个会话持有的共享资源。该阻塞会话本身被长时间运行的活动(或它自己的挂起)占用,这会阻止它及时释放身份验证会话所需的共享资源。这会导致超时最终报告给身份验证会话。
在这种情况下,我们需要找出持有身份验证会话所需共享资源的阻塞进程,以了解它发生了什么。
在这种情况下使用的典型诊断如下:
- 在一个或多个身份验证会话被阻止期间,三个连续的系统状态转储级别为 266。阻塞会话可能会导致多次连接尝试超时。因此,即使生成它们所需的时间超过了单个超时的时间,系统状态转储也会很有用,例如60 秒:
$ sqlplus -prelim '/ as sysdba'
oradebug setmypid
oradebug unlimit
oradebug dump systemstate 266
...wait 90 seconds
oradebug dump systemstate 266
...wait 90 seconds
oradebug dump systemstate 266
quit
- ASH 报告涵盖例如10-15 分钟的时间段内出现多个超时错误。
- 如果可能,对 V$LATCHHOLDER 视图进行两次连续查询,以了解正在等待的共享资源是锁存器的情况。
从 v$latchholder 中选择 *;
系统状态转储应该有助于识别阻塞会话。
级别 266 将向我们展示它正在执行的代码,这可能有助于将任何现有的错误定位为根本原因。
可能导致身份验证挂起的问题示例
在某些情况下,可以通过在实例启动后不久将此类语句固定在共享池中来避免身份验证 SQL 的问题,并且这些语句是新加载的。您可以使用以下文章对此提供建议:
文档 726780.1 如何使用 DBMS_SHARED_POOL.KEEP 将光标固定在共享池中
固定将防止它们由于不活动和老化而被刷新,因此将防止它们在未来需要重新加载,即需要重新解析并容易受到身份验证挂起问题的影响。