ORA-00031:标记要终止的会话
现象描述:oracle客户端plsql更新大数据量表,由于速度很慢,中途进行中断处理操作,甚至在任务管理器中杀掉了plsql进程。之后重启plsql客户端,对该大数据量表进行操作(查询,更新,删除)均出现等待现象。查询锁表sql,发现该表依旧是锁定状态,同时杀锁:alter system kill session’sid,serial#’,报错:标记要终止的会话。
问题原因:一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放。
此时有两种方法处理:
方法一:重启数据库服务。由于数据库中有“killded”状态的进程,一直杀不掉,shutdown immediate命令可能会一直停留在shutdown immediate过程,而使用shutdown abort 会损坏数据库。
方法二:在数据库服务器层面杀掉“killded”状态的进程。
解决方法二步骤如下:
查锁表sql:
select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo,
dba_objects ao,
v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.sid;
一.查询killded状态的进程,结果与查锁sql对应
select a.spid,b.sid,b.serial#,b.username
from v$process a,v$session b
where a.addr=b.paddr
and b.status='KILLED';
二.找到对应的进行,查询对应进程在数据库服务器(操作系统)的进程号
select b.spid,a.osuser,b.program
from v$session a,v$process b
where a.paddr=b.addr
and a.sid=? --sid来源于步骤一
三·.在数据库服务器上杀进程
1)、在unix上,用root身份执行命令:#kill -9 spid(spid 由步骤二·查询)
2)、在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
orakill sid thread
其中:
sid:表示要杀死的进程属于的实例名
thread:是要杀掉的线程号,即步骤二·查询出的spid。
例:c:>orakill orcl 12345
注意:这里要注意的是kill OS进程是在服务端操作,而不是你程序所在客户机。
本文主要参考资料:http://blog.sina.com.cn/s/blog_5ceb51480102w8et.html