如何处理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

数据运维技术 » 如何处理oracle的锁表session marked for kill的问题