網上有很多這樣的文章,我希望的是迅速找到一張表的所有的行級鎖,並把它們一併處理掉。所以改進了一下:
要是想用kill -9 sessionpid的方式就會用到檢視v$process,但這樣查詢速度很慢。
於是可以先建表:
以上的sql加上條件:and c.object_name = 'locked_table'/*可以先建表
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
;
能在2秒
內找到你想要的資料鎖所屬的session的作業系統程序號。不加這個條件時間就長了,有可能需要2分鐘。
其中locked_table是指要查詢的鎖所在的表名。
找到不活的且長時間占有鎖的程序號後。(我認為:不活動的不可能是等待鎖的會話。反之,等待鎖的會話應該是正在執行中的活動會話)
直接kill -9 $spid
網上有說用這個方式:alter system kill session 'sid,serial#',我覺得不適合我,主要是這句耗時太長。如果只殺乙個重要的鎖還可以。
附上查詢資料的所有者sql,可能對某些人有用:
對了以上sql我是在oracle9裡面使用的。--查詢資料鎖所屬
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
注誤區:
1.v$locked_object的session_id並不是持有鎖的sessionid,也包括等待該鎖的sessionid。
2.v$session的logon_time是沒有意義的,因為多數會受連線池的影響,導致這個時間失去意義。
怎麼快速查詢鎖與鎖等待
怎麼快速查詢鎖與鎖等待 資料庫的鎖是比較耗費資源的,特別是發生鎖等待的時候,我們必須找到發生等待的鎖,有可能的話,殺掉該程序。這個語句將查詢到資料庫中所有的dml語句產生的鎖,還可以發現,任何dml語句其實產生了兩個鎖,乙個是表鎖,乙個是行鎖。可以通過alter system kill sessio...
快速查閱 SQLPLUS連線ORACLE
使用sqlplus連線oracle常用的有兩種方式。一 簡易方式 sqlplus 使用者名稱 密碼 ip或主機名 埠 資料庫服務名稱 二 預先配置tnsnames的方式 在 oracle home network admin 路徑下,有乙個tnsnames.ora檔案,用於註冊tnsname.註冊格...
快速查閱 SQLPLUS連線ORACLE
使用sqlplus連線oracle常用的有兩種方式。一 簡易方式 sqlplus 使用者名稱 密碼 ip或主機名 埠 資料庫服務名稱 二 預先配置tnsnames的方式 在 oracle home network admin 路徑下,有乙個tnsnames.ora檔案,用於註冊tnsname.註冊格...