现象:
用pl/sql工具连接数据库报tns关闭。
第一次处理:
1.用oracle登陆到服务器,查看监听状态、并重启,依然无效
2.重启数据库,plsql可以登录数据库,大约半小时后又报tns关闭错误
第二次处理:
1.用oracle登陆到数据库,使用sqlplus / as sysdba登陆数据库,直接报达到最大连接数。
但目前的数据库设置的最大连接数已经很高了,不可能再通过修改最大连接数来达到连接数不够的目的
2.在root用户下查看oracle相关的进程(ps aux | grep ora),发现有很多远程的连接(LOCAL=NO)的进程,
通过kill -9 pid 进行杀死其中几个,pl/sql可以连接了,sqlplus / as sysdba也可以连接了。
3.杀死其他远程oracle的进程
ps -efww|grep LOCAL=NO|grep -v grep|cut -c 9-15|xargs kill -9
管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。下面说说用管道符联接起来的几个命令:
“ps - efww”是Red Hat 7.0里查看所有进程的命令。这时检索出的进程将作为下一条命令“grep LOCAL=NO”的输入。
“grep LOCAL=NO”的输出结果是,所有含有关键字“LOCAL=NO”的进程,这是Oracle数据库中远程连接进程的共同特点。
“grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。
“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。
“xargs kill -9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -9”命令的参数,并执行该命令。“kill -9”会强行杀掉指定进程,这样就成功清除了oracle的所有远程连接进程。其它类似的任务,只需要修改“grep LOCAL=NO”中的关键字部分就可以了。
4.创建一个追踪客户端IP地址的触发器
create or replace trigger on_logon_trigger after logon on database
begin
dbms_application_info.set_client_info(sys_context('userenv', 'ip_address'));
end;
/
5.重启数据库,追踪客户端连接情况
6.显示客户端信息
select sid,serial#,username,program,machine,client_info
from v$session
where username is not null
order by username,program,machine;
7.找到迅速增长的连接客户端,进行相关处理。
注:pl/sql等工具报的错误不一定是数据库的实际错误,比如本次故障其实是由于连接数达到最大而导致tns关闭(不能连接)