记一次会话重用导致kill的资源不释放问题

一、问题描述

2019-06-12 9:56 应用负责人打电话告知一个环境应用非常卡,单据无法保存。通过查看数据库等待事件,发现数据库有大量的行锁阻塞,和应用负责人确认后,手动结束掉产生锁,会话状态是INACTIVE,并阻塞其他会话的会话。

语法如下:

alter system disconnect session '451,327' immediate;
alter system disconnect session '572,23161' immediate;

执行语句后,发现会话的状态变成KILLED的,资源长时间不释放,锁依然阻塞其他会话。

记一次会话重用导致kill的资源不释放问题

通过v$session 关联v$process 找到os进程编号,通过 ps -ef 查看os进程,发现操作系统上没有该进程。

查看pmon进程状态,只有空闲的等待:

记一次会话重用导致kill的资源不释放问题

查看数据库的alert日志,发现pmon进程回收进程失败:

记一次会话重用导致kill的资源不释放问题

查看pmon的trace文件,没有有用的信息:

记一次会话重用导致kill的资源不释放问题

再次观察killed的会话,发现一个现象:这些会话的SID是固定的,但是serial#会依次增加。说明该会话一直被重用,因此怀疑是否因为会话重用,导致PMON无法回收资源。

此时没有更好的处理方式,只能重启产生锁的应用程序,当同事重启该程序后,数据库的锁资源已经释放,PMON也正常的回收了资源。

记一次会话重用导致kill的资源不释放问题

记一次会话重用导致kill的资源不释放问题

记一次会话重用导致kill的资源不释放问题

这次事情虽然重启应用得到解决,但是还是有一个疑问存在:什么情况下serail#会重用,操作系统上进程以及看不到了,为何serail#还会自动重用。。。

 

上一篇:无线局域网怎么设置,更安全?


下一篇:迅为2K1000龙芯开发板-pmon 下常用命令