ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

oracle update卡死ORA-00031:标记要终止的会话

2021-11-01 22:34:22  阅读:305  来源: 互联网

标签:update vn 进程 session kill sid oracle 线程 00031



一、现象描述      在ORACLE数据处理过程中,当某个PL/SQL developer正在运行创建一个临时表对大的数据进行暂存处理时,由于处理速度很慢,这时突然做了中断处理,甚至于直接从“任务管理器”中关掉PL/SQL developer。再次对该数据临时表进行处理时,会发现无论是删除、更新、查询等操作,都处于一直的执行等待状态。这种情况,很有可能是表已经被锁住了。但是当查询到死锁会话,采用alter system kill session'sid,serial#';来处理时,却提示报错,无法杀掉线程,只能到操作系统级杀掉线程了。下面就对这种情况的处理过程进行详细的说明。 二、解决方法       一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。但是shutdown immediate又怕可能进程杀不掉会一直停留在shutdown immediate,直接shutdown abort又怕损坏数据库。现在提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀。   1、下面的语句用来查询哪些对象被锁:  select a_s.owner,   a_s.object_name,   a_s.object_type,   vn.sid,   vn.serial#,   vs.spid "os_pid",   vn.process "client_pid",   vn.username,   vn.osuser,   vn.machine "hostname" ,   vn.terminal,   vn.program,   to_char(vn.logon_time,'yyyy-mm-dd hh24:mi:ss')"login_time",   'alter system kill session '''||vn.sid||','||vn.serial#||''';' "oracke_kill",   'kill -9 '|| vs.spid "os_kill" from all_objects a_s,   v$locked_object v_t,   v$session vn,   v$process vs where a_s.object_id=v_t.object_id and v_t.session_id =vn.sid and vs.addr=vn.paddr and vn.username not in('SYSMAN','SYS'); 2、查询该sid的sql语句 select *   from v$sql a,v$session b  where a.address =decode(b.sql_address, null, b.prev_sql_addr, b.sql_address)    and b.sid = &sid; 3、用下面的语句用来杀死引起死锁的进程:  alter system kill session 'sid,serial#';   注意: 如果出现题目的错误,则说明在数据库级不能杀掉该死锁进程,需要到操作系统级来处理了。如下图所示:

ORA-00031:标记要终止的会话


  可以通过下列语句查询:  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';   4、如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在OS级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:  select b.spid,a.osuser,b.program    from v$session a,v$process b   where a.paddr=b.addr     and a.sid=33     --33就是上面的sid 5、在OS上杀死这个进程(线程) 1)、在unix上,用root身份执行命令:#kill -9 12345(12345 即第4步查询出的spid)  2)、在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为: orakill sid thread  其中: sid:表示要杀死的进程属于的实例名  thread:是要杀掉的线程号,即第3步查询出的spid。  例:c:>orakill orcl 12345  注意: 这里要注意的是kill OS进程是在服务端操作,而不是你程序所在客户机。

标签:update,vn,进程,session,kill,sid,oracle,线程,00031
来源: https://blog.csdn.net/is___oneself/article/details/121090392

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有