加载中…
个人资料
杨济忠
杨济忠
  • 博客等级:
  • 博客积分:0
  • 博客访问:346,830
  • 关注人气:36
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

oracle 解锁不释放的解决方法

(2016-04-29 00:05:52)
标签:

oracle

it

select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time;

查死锁,kill死锁
select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time
然后用
alter system kill session '1569,64410';         
1645        720
alter system kill session '2963,34935';
将死锁杀掉

3.如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:                                                                                                                          
select spid, osuser, s.program  from v$session s,v$process p  where s.paddr=p.addr and s.sid=2963; (24是上面的sid)                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                                        
4.在OS上杀死这个进程(线程):                                                                                                                                                                                                                                                                          
1)在unix上,用root身份执行命令:                                                                                                                                                                                                                                                                         
#kill -9 12345(即第3步查询出的spid)                                                                                                                                                                                                                                                                   
2)在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:                                                                                                                                                                                                               
orakill sid thread                                                                                                                                                                                                                                                                                      
其中:                                                                                                                                                                                                                                                                                                  
sid:表示要杀死的进程属于的实例名                                                                                                                                                                                                                                                                       
thread:是要杀掉的线程号,即第3步查询出的spid。                                                                                                                                                                                                                                                         
例:c:>orakill orcl 12345                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                        
ORA-00031: session marked for kill                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                        
Cause: The session specified in an ALTER SYSTEM KILL SESSION command cannot be killed immediately (because it is rolling back or blocked on a network operation), but it has been marked for kill. This means it will be killed as soon as possible after its current uninterruptible operation is done.以系统管理登录查杀!
                                                                                                                                                                                                                                                                                                        Oracle表被锁的解决方案
Action: No action is required for the session to be killed, but further executions of the ALTER SYSTEM KILL SESSION command on this session may cause the session to be killed sooner.                                                                                                                  2009-03-02 10:28
由于各种原因,Oracle 中经常会出现表被锁定的现象,使的操作无法进行。

查看被锁的表: 
select a.sid,p.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_name,a.SERIAL# from v$process p,v$session a, v$locked_object b,all_objects c where p.addr=a.paddr and a.process=b.process and c.object_id=b.object_id 

SELECT s.username, 
decode(l.type,'TM','TABLE LOCK', 
'TX','ROW LOCK', 
NULL) LOCK_LEVEL, 
o.owner,o.object_name,o.object_type, 
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser 
FROM v$session s,v$lock l,dba_objects o 
WHERE l.sid = s.sid 
AND l.id1 = o.object_id(+) 
AND s.username is NOT Null


解锁: 
alter system kill session 'sid,serial#'; 

【注】以上两步,可以通过Oracle的管理控制台来执行。 
如果出现题目的错误,可以 
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' ;

如果还不行,找到锁的表的进程号,直接到服务器上执行kill -9 spid, 搞定。


理论依据:

第一、与表锁有关的系统视图:

A : v$lock

SQL> desc v$lock;
Name Type Nullable Default Comments 
------- ----------- -------- ------- -------- 
ADDR RAW(8) Y 
KADDR RAW(8) Y 
SID NUMBER Y 
TYPE VARCHAR2(2) Y 
ID1 NUMBER Y 
ID2 NUMBER Y 
LMODE NUMBER Y 
REQUEST NUMBER Y 
CTIME NUMBER Y 
BLOCK NUMBER Y 

该视图说明当前锁定的所有对象,锁定都的SID号,锁定类型等信息;

B: v$locked_object

SQL> desc v$locked_object;
Name Type Nullable Default Comments 
--------------- ------------ -------- ------- -------- 
XIDUSN NUMBER Y 
XIDSLOT NUMBER Y 
XIDSQN NUMBER Y 
OBJECT_ID NUMBER Y 
SESSION_ID NUMBER Y 
ORACLE_USERNAME VARCHAR2(30) Y 
OS_USER_NAME VARCHAR2(30) Y 
PROCESS VARCHAR2(12) Y 
LOCKED_MODE NUMBER Y 

用以详细的描述了当前锁定对象的详细信息,OBJECT_ID 为对象ID,SESSION_ID为当前登录用户Session号,ORACLE_USERNAME 为Oracle的用户名,OS_USER_NAME 为操作系统用户名等等。

针对以上两个系统视图,相应的有两种查询当前表锁的方法:

SQL> select all_objects.object_name,
S.SID,
s.serial#,
s.osuser,
s.PROGRAM,
s.machine,
s.CLIENT_INFO
from v$lock k, v$session s, ALL_OBJECTS
where k.SID = s.SID
and k.TYPE IN ('TX', 'TM')
and k.id1 = all_objects.object_id;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有