Oracle資料鎖快速查殺

2021-09-01 18:12:10 字數 3008 閱讀 4973

網上有很多這樣的文章,我希望的是迅速找到一張表的所有的行級鎖,並把它們一併處理掉。所以改進了一下:

要是想用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秒

內找到你想要的資料鎖所屬的session的作業系統程序號。不加這個條件時間就長了,有可能需要2分鐘。

其中locked_table是指要查詢的鎖所在的表名。

找到不活的且長時間占有鎖的程序號後。(我認為:不活動的不可能是等待鎖的會話。反之,等待鎖的會話應該是正在執行中的活動會話)

直接kill -9 $spid

網上有說用這個方式:alter system kill session 'sid,serial#',我覺得不適合我,主要是這句耗時太長。如果只殺乙個重要的鎖還可以。

附上查詢資料的所有者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裡面使用的。

注誤區:

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.註冊格...