ORA-00030: 用户会话 ID 不存在
1、1、找出sid
select l.session_id,o.owner,o.object_name
from v$locked_object l,dba_objects o
where l.object_id=o.object_id
如果是rac:
select l.session_id,o.owner,o.object_name
from gcv$locked_object l,dba_objects o
where l.object_id=o.object_id
查看所有占有锁的会话和对象
比如update更新语句是clfxx表,通过以上SQL语句,找出clfxx占有锁的所有会话。
2、2、找出pid和实例
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
如果是rac:
select t2.username,t2.sid,t2.serial#,t2.logon_time
from gv$locked_object t1,gv$session t2
where t1.session_id=t2.sid order by t2.logon_time;
查看所有占有锁的会话ID和serial#
第一步已经确定了所有相关sid,那么通过sid找出serial#,然后执行
alter system kill session 'sid,serial#'
如查询结果:
username sid serial# logon_time
SA 158 15184 2014/12/4 14:55:59
SA 146 8229 2014/12/4 15:23:22
SA 136 14314 2014/12/4 16:09:59
SA 131 54 2014/12/4 16:10:06
alter system kill session '146,8229';
3、3、kill -9 进程号 杀掉进程
如果在执行alter system kill session '146,8229'的时候报错ORA-00030: 用户会话 ID 不存在,那么可以通过如下SQL语句:
select * from gv$process
where addr in (
select paddr from gv$session where sid =146
);
查看进程号和实例名,因为如果是rac的话,需要进入对应的服务器中杀掉相关进程。
ps -ef | grep 进程号 查看是否有相关进程号
kill -9 进程号 使用root用户杀掉进程
注意:
通过上面的SQL语句查看,可以看到是集群用户grid分配的数据库前段进程资源,也就是说进群进程管理监听
4、4、我的处理情况
找到了2个会话占有clfxx对象的锁,但是通过第3步骤的SQL只能找到其中的一个sid会话的pid,且这个进程在节点2上,杀掉之后,第二天再次查找到另外一个sid的pid,杀掉执行,update更新语句执行正常了