Oracle数据锁快速查杀
Oracle数据锁快速查杀
网上有很多这样的文章,我希望的是迅速找到一张表的所有的行级锁,并把它们一并处理掉。所以改进了一下:
要是想用kill -9 sessionPid的方式就会用到视图V$PROCESS,但这样查询速度很慢。
于是可以先建表:
Sql代码
/*
create table session_process_table nologging as
select * from V$PROCESS D
where 1=0;
*/
truncate table session_process_table;
insert into session_process_table
select * from V$PROCESS D;
commit;
--查看数据锁
select d.SPID,--操作系统进程号
A.sid,
b.serial#,
decode(A.type,'MR','MediaReco-very','RT','RedoThread','UN','UserName','TX','Transaction','TM','DML','UL','PL/SQLUserLock','DX','DistributedXaction','CF','ControlFile','IS','InstanceState','FS','FileSet',-'IR','InstanceRecovery','ST','DiskSpaceTransaction','TS','TempSegment','IV','LibraryCacheInvalida-tion','LS','LogStartorSwitch','RW','RowWait','SQ','SequenceNumber','TE','ExtendTable','TT','TempTable','Unknown') LockType,
c.object_name,
b.username,
decode(a.lmode,0,'None',1,'Null',2,'Row-S',3,'Row-X',4,'Share',5,'S/Row-X',6,'Exclusive','Unknown') LockMode,
b.LOGON_TIME,
B.MACHINE,
b.PADDR
from v$lock a, all_objects c, v$session b ,session_process_table D
where 1 = 1
and d.ADDR=b.PADDR
and a.sid = b.sid
and a.type in ('TM', 'TX')
and a.id1 = c.object_id
and c.object_name = 'LOCKED_TABLE'
;
--shell中杀锁
--kill -9 spid
以上的sql能在2秒内找到你想要的数据锁所属的session的操作系统进程号。
其中LOCKED_TABLE是指要查询的锁所在的表名。
网上有说用这个方式:alter system kill session 'sid,serial#',我觉得不适合我,主要是这句耗时太长。如果只杀一个重要的锁还可以。
附上查询数据的所有者sql,可能对某些人有用:
Sql代码
--查询数据锁所属
select command_type,
sql_text,
sharable_mem,
persistent_mem,
runtime_mem,
sorts,
version_count,
loaded_versions,
open_versions,
users_opening,
executions,
users_executing,
loads,
first_load_time,
invalidations,
parse_calls,
disk_reads,
buffer_gets,
rows_processed,
sysdate start_time,
sysdate finish_time,
address sql_address,
'N' status
from v$sqlarea
where address = (select sql_address from v$session where sid = $sid);
--$sid是上一个sql查询的a.sid
对了以上sql我是在oracle9里面使用的。