`
acboy025
  • 浏览: 6842 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

oracle库的表被锁解决办法

 
阅读更多

1).查询是哪些表被锁了

SELECT A.OWNER,
A.OBJECT_NAME,
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID,
B.ORACLE_USERNAME,
B.OS_USER_NAME,
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE,
C.STATUS,
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM
FROM ALL_OBJECTS A,
V$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE ( A.OBJECT_ID = B.OBJECT_ID )
AND (B.PROCESS = C.PROCESS )
ORDER BY 1,2

 

或者用

 

  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;

 

 

 

(2).释放session Sql:

 

alter system kill session 'sid, serial#'
例:
alter system kill session '379, 21132'
alter system kill session '374, 6938'

 

可以用如下查询批量得到上面类似的语句:

 

  select 'alter system kill session '''   ||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;

 

 

 

(3).如果利用上面的命令杀死一个进程后,进程状态被置为 "killed", 但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先获得进程(线程)号:

 

  select spid, osuser, s.program

 

  from v$session s,v$process p

 

  where s.paddr=p.addr and s.sid=#sid; (#sid是上面的sid)

 

(4).在操作系统中杀掉相应的进程(线程):

 

  1)在Linux上,用root身份执行命令:

  kill -9 12345(12345是第3步查询出的spid)

  2)在windows 用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:orakill sid thread 免费网页模版下载

 

  其中:

 

  sid:表示要杀死的进程属于的实例名

 

  thread:是要杀掉的线程号,即第3步查询出的spid。

 

  例:c:>orakill orcl 12345

  完全可以写一个组合查询的存储过程来自动执行上述四步操作,方便地杀光所有不自动释放资源的进程,但一般情况下不推荐这样做,毕竟在系统中用root用户kill进程本身就是带有一定风险的!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics