在v$lock中可以看到sid=11的会话有未提交的事务,引发了锁堵塞,导致其他update语句无法执行。
在v$session也可以找到sid=11的记录,同时也可查到该sid=11的会话是由machine=‘test'通过program='PLSqlDev.exe'的方式连接的,但是奇怪的,登录machine=‘test'的这个机器的时候,该机器上的PL Sql Develop根本不存在未提交的事务,而且通过v$mystat查看每个会话的sid,都找不到sid=11的会话。
目前只能通过执行'alter system kill session '11''的方式来释放该对话,但是找不到问题的原因。有没有什么办法可以追踪到这个问题的根本原因呢(例如定位到是网络问题还是程序假死问题等等),有没有什么监控方法来监控此类异常情况?
1.首先确认你的环境是不是RAC;
2.v$mystat是查看当前会话的统计信息的,里面是不会出现其它的会话的;
3.如果你想查看是什么语句造成的,可以用v$session和v$sql表关联来查看相应的sql;
ps:杀掉会话的语法应该是alter system kill session \'sid,serial\';
收起关于这个,我也做过相应的测试.但是没有得到想要的结果.
测试的大致结果如下:
1.通过 plsql dev 连接到 oracle 之后,执行一个长 select 语句,v$session可以监控到这个会话,并且会 active 的.但是 sql 执行完成之后, 会话的状态变为 inactive 了.在这里之前,我觉得都是正常的.也符合 oracle 的解释. 但是当我将 plsql dev 关闭之后,查询相应的会话,依然是存在的.
所以到这里,就感觉有点模糊了.
收起问题原因可能找到了,可能是plsql develop程序导致的,问题重现步骤如下
step1:比如在10:45时,打开plsql developer的sql window,执行\'select * from v$mystat\'语句,此时出现的结果是sid=26
ps:同时在v$session中也有sid=26的记录,program=plsqldev machine=xxx
Step2:过了一会儿,大约过15分钟左右,还是在原来的sql window,执行\'select * from v$mystat\'语句,此时plsql developer程序出现短暂的卡住(处于未响应状态),等待其相应成功时,结果sid=31(在同一个sql window中,2次执行v$mystat的sid不一样!!!!)
ps:此时在v$session中有sid=26和sid=31的记录,program=plsqldev machine=xxx,但是我在machine=xxx的机子上只开了一个sql window
所以根据以上步骤猜测:应该是plsql developer未响应导致的,所以如果对话中有未提交的事务时 可能也就会出问题了