重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 544|回复: 0
打印 上一主题 下一主题

[Oracle] ORA-00031:标记要终止的会话---Oracle锁Lock

[复制链接]
跳转到指定楼层
楼主
发表于 2024-9-1 19:21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、现象描述
      在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进程是在服务端操作,而不是你程序所在客户机。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-11-25 00:28 , Processed in 0.118785 second(s), 21 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表