Oracleデータ・ロックのクイック・チェック

3929 ワード

ネット上にはこのような文章がたくさんあります.私が望んでいるのは、テーブルのすべての行レベルのロックを迅速に見つけて、それらを一緒に処理することです.そこで改善しました
 
kill-9 sessionPidでビューV$PROCESSを使用したい場合は、クエリーの速度が遅いです.
まず、テーブルを作成できます.
 
/*     
 create table b_session_process nologging as
 select * from V$PROCESS D
 where 1=0;
 */
 truncate table b_session_process;
 
 insert into b_session_process 
 select * from V$PROCESS D;
 commit;
--     
select d.SPID,--       
       c.object_name,
       a.CTIME,--         ( ) ,      :     ,       。
       b.STATUS,--     (ACTIVE/INACTIVE/Killed)。ACTIVE:sql    (        ,         )。--INACTIVE:      ,   sql       (  sql    ,        :     ,     。)。---Killed:      
       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,
       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 ,
  --V$PROCESS D
  b_session_process 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_TYPE='TABLE'--         。
   --and c.object_name = 'LOCKED_TABLE'
   --and a.CTIME > 120 --          120 
   and b.STATUS='INACTIVE'--           sql   ,     。
   order by a.CTIME desc
   ;

 
 
 
以上のsqlに条件を加える:and c.object_name = 'LOCKED_TABLE'は、あなたが望むデータロックが属するセッションのオペレーティングシステムプロセス番号を2秒以内に見つけることができます.この条件をつけないと時間が長くなり、2分かかる可能性があります.
そのうちLOCKED_TABLEとは、検索するロックが存在するテーブルの名前です.
 
非アクティブで長時間ロックを占有するプロセス番号が見つかった後.(アクティブでないのはロック待ちのセッションではないと思います.逆に、ロック待ちのセッションは実行中のアクティブなセッションであるべきです)
ダイレクトkill-9$spid
 
ネット上では、alter system kill session'sid、serial#'という方法がありますが、私には向いていないと思います.主にこの文は時間がかかりすぎます.重要な鍵を1つだけ殺せばいい.
 
 
クエリー・データの所有者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はoracle 9で使いました.
 
 
 
注エラー:
1.v$locked_objectのSESSION_IDは、ロックを持つセッションIdではなく、そのロックを待つセッションIdも含まれる.
2.v$sessionのLOGON_TIMEは意味がありません.多くの場合、接続プールの影響を受け、この時間は意味を失います.