plsql报tns关闭

来源:互联网 发布:淘宝全球直播是真的吗 编辑:程序博客网 时间:2024/05/23 11:08

现象:

用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关闭(不能连接)

0 0
原创粉丝点击