oracle ORA-00031:session marked for kill(标记要终止的会话)解决方法
今天碰到一个问题,有一张表不能操作,很可能是被锁了,首先想到的是killsession,于是执行了下列的脚本找到是哪个session有问题:
查看表是否被锁
SELECT/*+rule*/ a.sid,b.owner,object_name,object_type FROMv$locka,all_objectsb WHERETYPE='TM' anda.id1=b.object_id;
根据上面查询出的sid,找出对应的serial#:
SELECTsid,serial#FROMv$sessionWHEREsid=&sid;
发现有一个会话有锁sid197,serial#17,于是执行altersystemkillsession‘197,17';大概等了30s中,pl/sqldeveloper报出一个错误:ora-00031:标记要终止的会话。
解决方法:查出session的spid
selectspid,osuser,s.programfromv$sessions,v$processpwheres.paddr=p.addrands.sid=197;
1.在linux上,kill-912345
2.在windows上,C:\DocumentsandSettings\gg>orakillorcl12345
orcl:表示要杀死的进程属于的实例名
12345:是要杀掉的线程号
ORA-00031:sessionmarkedforkill
Cause:ThesessionspecifiedinanALTERSYSTEMKILLSESSIONcommandcannotbekilledimmediately(becauseitisrollingbackorblockedonanetworkoperation),butithasbeenmarkedforkill.Thismeansitwillbekilledassoonaspossibleafteritscurrentuninterruptibleoperationisdone.
Action:Noactionisrequiredforthesessiontobekilled,butfurtherexecutionsoftheALTERSYSTEMKILLSESSIONcommandonthissessionmaycausethesessiontobekilledsooner.
下面是补充:
oracle中编译一个包的时候发现,只要一编译就卡死了,后来使用《oracle查询、Kill锁资源的SQL语句》方法查锁的时候发现包中用到的一些资源一直处于死锁状态。后来通过altersystemkillsession的方法去解锁,却发现出现如下图1所示的问题:
ORA-00031:标记要终止的会话
ORA-00031:标记要终止的会话
后来通过连接上oracle数据库所在的系统,然后kill掉进程解决,方法如下:
(1)查询被锁资源的sid、serial#:
SELECTs.sid, s.serial#, v.*, ao.* FROMv$locked_objectv, all_objectsao, v$sessions WHEREv.object_id=ao.object_id ANDs.sid=v.session_id;
(2)利用上面的SQL查询出sid和serial#以后,利用下面SQL去killsession:
--如有记录则表示lock,记录下SID和serial#,将记录下的SID和serial#替换下面的738,1429,即可接触lock。
ALTERSYSTEMKILLSESSION'738,1429';
(3)如果上面的killsession报如上图1的错误,那么再用下面的SQL去查处session对应的spid:
SELECTp.spid, s.osuser, s.program FROMv$sessions, v$processp WHEREs.paddr=p.addr ANDs.sid=37;--替换成相应的session_id
(4)连上oracle数据库所在的系统(我这里是Linux系统),记录下上面查到的spid(假设这里查到的是1133),然后使用下面语句来kill掉进程:
kill-91133
等待一会,等进程kill成功以后,再去查锁即可发现资源已经被释放。如果oracle安装在Windows系统上,请使用Windows系统的kill进程的方式去杀掉进程。