oracle 解锁不释放的解决方法
(2016-04-29 00:05:52)
标签:
oracleit |
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.以系统管理登录查杀!
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;
后一篇:oracle查分区与非分区表

加载中…