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