背景
在告警日志中出现了大量 ORA-3136
的报错。本文将详细介绍如何解决这一问题。
问题描述
告警日志
在告警日志中发现了如下错误信息:
ORA-3136: WARNING Inbound Connection Timed Out
MOS 文档
根据 MOS 文档 (Doc ID 465043.1)《Troubleshooting ORA-3136: WARNING Inbound Connection Timed Out》,这个报错指出客户端连接没有在规定的时间内通过认证,这个时间是由 SQLNET.INBOUND_CONNECT_TIMEOUT
参数决定的。
日志文件
在 $ORACLE_HOME/network/log/sqlnet.log
中可以看到有 ORA-12170
或 TNS-12535
的报错信息,其中包含连接的客户端地址,这将有助于判断问题。
问题原因
- 服务器接收到来自于不支持连接此数据库的大量客户端恶意请求:这种情况下,需要抛出这种错误以及相应的行为。通过
sqlnet.log
中记录的客户端地址,找到错误根源。 - 服务器接收到一个合法的客户端连接请求,但客户端花费了比默认60秒更长的时间来完成验证。
- 数据库服务器当前负载很重,以至于不能在规定的时间内完成客户端登录验证。
检查步骤
- 检查数据库服务器的本地连接是否正常,速度是否合适。
- 在网络管理员的帮助下检查网络延迟。
- 检查数据库性能是否下降。
- 检查告警日志中是否有其他严重的报错,例如
ORA-600
或ORA-7445
,如果有,先解决这些严重的报错。
解决方案
1. 修改 listener.ora
和 sqlnet.ora
文件
方法一:通过 lsnrctl
修改 listener.ora
-
sh打开
lsnrctl
工具[/home/oracle]> lsnrctl LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 01-SEP-2009 16:28:06 Copyright (c) 1991, 2007, Oracle. All rights reserved. Welcome to LSNRCTL, type "help" for information.
-
查看当前
inbound_connect_timeout
参数LSNRCTL> show inbound_connect_timeout Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) LISTENER parameter "inbound_connect_timeout" set to 60 The command completed successfully
-
设置
inbound_connect_timeout
为 0LSNRCTL> set inbound_connect_timeout 0 Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) LISTENER parameter "inbound_connect_timeout" set to 0 The command completed successfully
-
保存配置
LSNRCTL> set save_config_on_stop on
-
退出
lsnrctl
LSNRCTL> exit
方法二:编辑 listener.ora
和 sqlnet.ora
文件
-
编辑
listener.ora
文件INBOUND_CONNECT_TIMEOUT_<listenername> = 0
-
编辑
sqlnet.ora
文件SQLNET.INBOUND_CONNECT_TIMEOUT = 0
2. 重启监听器和数据库
-
停止监听器
lsnrctl stop
-
启动监听器
lsnrctl start
-
重启数据库
SQL> shutdown immediate ORA-01507: database not mounted ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 7532736512 bytes Fixed Size 2267912 bytes Variable Size 2097153272 bytes Database Buffers 5419040768 bytes Redo Buffers 14274560 bytes Database mounted. Database opened.
问题解决
1. 检查 trc
文件
如果数据库仍然无法启动,检查最新的 udump
目录下的 trc
文件,查找错误信息。
2. 杀死锁定进程
根据 trc
文件中的进程信息,杀死锁定的进程。
kill -9 422264
3. 重新登录并启动数据库
[oracle@localhost oracle]$ sqlplus "/as sysdba"
SQL> startup
总结
通过上述步骤,我们成功地排查并解决了 ORA-3136
错误,即客户端连接超时的问题。