如何处理oracle的锁表session marked for kill的问题
oracle 使用的过程中,有时候会遇到锁表的情况,数据库增、删、改、查都是会锁表的,但是锁的类型会不同,
大多是行锁,部分会是表锁。
在oracle运行中,一直是有表在锁的,只不过很快一个操作结束,锁就释放了。
但是,总是有操作很慢的时候。
如:一张纪录用户实时数据的大表(1000W数据),为了查询快,加了好几个索引,导致,更新表很慢,一直锁表。
死锁的时候,数据库会一直打trace文件,文件的会比较大(100+M),
如果硬盘空间不足,会导致数据库进程沾满,无法正常使用。并且,死锁是很占用系统资源的。
这种时候,我们就需要将锁表的操作杀掉,以防影响数据库正常运行。
首先,需要查询出什么操作在锁表:
select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session s where l.object_id = o.object_id and l.session_id=s.sid;
然后我们就可以得到锁表的session id 和 serialid
使用如下命令可以杀掉session:
alter system kill session '222,333'; (其中222,333分别是上面查询出的sid,serial#)
这样是可以解决死锁的问题的,但是见效比较慢,因为这种做法,其实不会马上杀掉session,是把session标记为”kill”状态,一定时间后再清楚(2小时?)
还有一种见效特别快的操作:
查询session 的process id:
select s.sid,p.spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid = 222
spid 即为session的系统线程。
在unix、linux上,使用root用户,kill线程:
kill -9 5555 # 5555即为上面查询出的spid
在windos 上使用:
orakill orcl
5555 # 5555即为上面查询出的spid