当前位置:数据库 > Oracle >>

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里面使用的。
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,