• 关于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

    搞定。

  • 相关阅读:
    2019.1.8兔子问题和汉诺塔问题的解决代码
    REST
    存储过程和函数练习
    十六、性能优化
    十五、MySQl日志
    Shell入门
    十四、数据备份
    十三、MySQL触发器
    十二、视图
    十一、MySQL锁
  • 原文地址:https://www.cnblogs.com/Springmoon-venn/p/8400491.html
Copyright © 2020-2023  润新知