一、问题描述
2019-06-12 9:56 应用负责人打电话告知一个环境应用非常卡,单据无法保存。通过查看数据库等待事件,发现数据库有大量的行锁阻塞,和应用负责人确认后,手动结束掉产生锁,会话状态是INACTIVE,并阻塞其他会话的会话。
语法如下:
alter system disconnect session '451,327' immediate;
alter system disconnect session '572,23161' immediate;
执行语句后,发现会话的状态变成KILLED的,资源长时间不释放,锁依然阻塞其他会话。
通过v$session 关联v$process 找到os进程编号,通过 ps -ef 查看os进程,发现操作系统上没有该进程。
查看pmon进程状态,只有空闲的等待:
查看数据库的alert日志,发现pmon进程回收进程失败:
查看pmon的trace文件,没有有用的信息:
再次观察killed的会话,发现一个现象:这些会话的SID是固定的,但是serial#会依次增加。说明该会话一直被重用,因此怀疑是否因为会话重用,导致PMON无法回收资源。
此时没有更好的处理方式,只能重启产生锁的应用程序,当同事重启该程序后,数据库的锁资源已经释放,PMON也正常的回收了资源。
这次事情虽然重启应用得到解决,但是还是有一个疑问存在:什么情况下serail#会重用,操作系统上进程以及看不到了,为何serail#还会自动重用。。。