首先你要知道表鎖住了是不是正常鎖?因?yàn)槿魏蜠ML語(yǔ)句都會(huì)對(duì)表加鎖。

成都創(chuàng)新互聯(lián)10多年成都企業(yè)網(wǎng)站建設(shè)服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及高端網(wǎng)站定制服務(wù),成都企業(yè)網(wǎng)站建設(shè)及推廣,對(duì)LED顯示屏等多個(gè)方面擁有豐富的網(wǎng)站推廣經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。
你要先查一下是那個(gè)會(huì)話那個(gè)sql鎖住了表,有可能這是正常業(yè)務(wù)需求,不建議隨便KILL session,如果這個(gè)鎖表是正常業(yè)務(wù)你把session kill掉了會(huì)影響業(yè)務(wù)的。
建議先查原因再做決定。
(1)鎖表查詢的代碼有以下的形式:
select count(*) from v$locked_object;
select * from v$locked_object;
(2)查看哪個(gè)表被鎖
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
(3)查看是哪個(gè)session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
(4)查看是哪個(gè)sql引起的
select b.username,b.sid,b.serial#,c.* from v$locked_object a,v$session b,v$sql c where a.session_id = b.sid
and b.SQL_ID = c.sql_id and c.sql_id = ''
order by b.logon_time;
(5)殺掉對(duì)應(yīng)進(jìn)程
執(zhí)行命令:alter system kill session'1025,41';
其中1025為sid,41為serial#.
用戶被鎖了?
FAILED_LOGIN_ATTEMPTS參數(shù)默認(rèn)是10,即:用戶連續(xù)輸入10次錯(cuò)誤密碼,用戶會(huì)被鎖住;
可以使用其他擁有DBA權(quán)限的用戶進(jìn)行解鎖;
alter user username account unlock;
如果是數(shù)據(jù)庫(kù)內(nèi)部出現(xiàn)死鎖或阻塞會(huì)話,可以先查出阻塞的會(huì)話,
select * from dba_waiters;
在殺掉阻塞的會(huì)話
alter system kill session 'sid,serial#';
測(cè)試環(huán)境,可以直接重啟數(shù)據(jù)庫(kù)!
SQLselect session_id from v$locked_object;
49
SQLSELECT sid, serial#, username ?FROM v$session where sid = 49;
49 ?554 ?system
SQLALTER SYSTEM KILL SESSION '49, 554';
用的是客戶端登錄,直接關(guān)掉客戶端就可以了,因?yàn)槟愕目蛻舳艘彩莻€(gè)session
普通用戶也可以,因?yàn)槭悄氵@個(gè)用戶開(kāi)啟這個(gè)進(jìn)程,那么你也可以關(guān)閉這個(gè)進(jìn)程。
3.盡量用dba權(quán)限的用戶操作,還有可以到主機(jī)上 kill -9 spid 會(huì)更快。
ORACLE鎖具體分為以下幾類:
1.按用戶與系統(tǒng)劃分,可以分為自動(dòng)鎖與顯示鎖
自動(dòng)鎖:當(dāng)進(jìn)行一項(xiàng)數(shù)據(jù)庫(kù)操作時(shí),缺省情況下,系統(tǒng)自動(dòng)為此數(shù)據(jù)庫(kù)操作獲得所有有必要的
顯示鎖:某些情況下,需要用戶顯示的鎖定數(shù)據(jù)庫(kù)操作要用到的數(shù)據(jù),才能使數(shù)據(jù)庫(kù)操作執(zhí)行得更好,顯示鎖是用戶為數(shù)據(jù)庫(kù)對(duì)象設(shè)定的。
2.按鎖級(jí)別劃分,可分為共享鎖與排它鎖
共享鎖:共享鎖使一個(gè)事務(wù)對(duì)特定數(shù)據(jù)庫(kù)資源進(jìn)行共享訪問(wèn)——另一事務(wù)也可對(duì)此資源進(jìn)行訪問(wèn)或獲得相同共享鎖。共享鎖為事務(wù)提供高并發(fā)性,但如拙劣的事務(wù)設(shè)計(jì)+共享鎖容易造成死鎖或數(shù)據(jù)更新丟失。
排它鎖:事務(wù)設(shè)置排它鎖后,該事務(wù)單獨(dú)獲得此資源,另一事務(wù)不能在此事務(wù)提交之前獲得相同對(duì)象的共享鎖或排它鎖。
3.按操作劃分,可分為DML鎖、DDL鎖
+DML鎖又可以分為,行鎖、表鎖、死鎖
-行鎖:當(dāng)事務(wù)執(zhí)行數(shù)據(jù)庫(kù)插入、更新、刪除操作時(shí),該事務(wù)自動(dòng)獲得操作 表中操作行的排它鎖。
-表級(jí)鎖:當(dāng)事務(wù)獲得行鎖后,此事務(wù)也將自動(dòng)獲得該行的表鎖(共享鎖),以防止其它事務(wù)進(jìn)行DDL語(yǔ)句影響記錄行的更新。事務(wù)也可以在進(jìn)行 過(guò)程中獲得共享鎖或排它鎖,只有當(dāng)事務(wù)顯示使用LOCK TABLE語(yǔ) 句顯示的定義一個(gè)排它鎖時(shí),事務(wù)才會(huì)獲得表上的排它鎖,也可使用
LOCK TABLE顯示的定義一個(gè)表級(jí)的共享鎖(LOCK TABLE具體用法請(qǐng)參 考相關(guān)文檔)。
-死鎖:當(dāng)兩個(gè)事務(wù)需要一組有沖突的鎖,而不能將事務(wù)繼續(xù)下去的話,就 出現(xiàn)死鎖。
如事務(wù)1在表A行記錄#3中有一排它鎖,并等待事務(wù)2在表A中記錄#4 中排它鎖的釋放,而事務(wù)2在表A記錄行#4中有一排它鎖,并等待事務(wù) 1在表A中記錄#3中排它鎖的釋放,事務(wù)1與事務(wù)2彼此等待,因此就造 成了死鎖。死鎖一般是因拙劣的事務(wù)設(shè)計(jì)而產(chǎn)生。
死鎖只能使用SQL下:alter system kill session 'sid,serial#';
或者使用相關(guān)操作系統(tǒng)kill進(jìn)程的命令,如UNIX下kill -9 sid,或者 使用其它工具殺掉死鎖進(jìn)程。
+DDL鎖又可以分為:排它DDL鎖、共享DDL鎖、分析鎖
-排它DDL鎖:創(chuàng)建、修改、刪除一個(gè)數(shù)據(jù)庫(kù)對(duì)象的DDL語(yǔ)句獲得操作對(duì)象的 排它鎖。
如使用alter table語(yǔ)句時(shí),為了維護(hù)數(shù)據(jù)的完成性、一致性、
合法性,該事務(wù)獲得一排它DDL鎖。
-共享DDL鎖:需在數(shù)據(jù)庫(kù)對(duì)象之間建立相互依賴關(guān)系的DDL語(yǔ)句通常需共享
獲得DDL鎖。
如創(chuàng)建一個(gè)包,該包中的過(guò)程與函數(shù)引用了不同的數(shù)據(jù)庫(kù)表,
當(dāng)編譯此包時(shí),該事務(wù)就獲得了引用表的共享DDL鎖。
-分析鎖:ORACLE使用共享池存儲(chǔ)分析與優(yōu)化過(guò)的SQL語(yǔ)句及PL/SQL程序,使
運(yùn)行相同語(yǔ)句的應(yīng)用速度更快。一個(gè)在共享池中緩存的對(duì)象獲得
它所引用數(shù)據(jù)庫(kù)對(duì)象的分析鎖。分析鎖是一種獨(dú)特的DDL鎖類型,
ORACLE使用它追蹤共享池對(duì)象及它所引用數(shù)據(jù)庫(kù)對(duì)象之間的依賴 關(guān)系。當(dāng)一個(gè)事務(wù)修改或刪除了共享池持有分析鎖的數(shù)據(jù)庫(kù)對(duì)象
時(shí),ORACLE使共享池中的對(duì)象作廢,下次在引用這條SQL/PLSQL語(yǔ) 句時(shí),ORACLE重新分析編譯此語(yǔ)句。
4.內(nèi)部閂鎖
內(nèi)部閂鎖:這是ORACLE中的一種特殊鎖,用于順序訪問(wèn)內(nèi)部系統(tǒng)結(jié)構(gòu)。
當(dāng)事務(wù)需向緩沖區(qū)寫(xiě)入信息時(shí),為了使用此塊內(nèi)存區(qū)域, ORACLE首先必須取得這塊內(nèi)存區(qū)域的閂鎖,才能向此塊內(nèi)存寫(xiě)入
信息。
在pl/sql Developer工具的的菜單“tools”里面的“sessions”可以查詢現(xiàn)在存在的會(huì)話,但是我們很難找到那個(gè)會(huì)話被鎖定了,想找到所以被鎖的會(huì)話就更難了,下面這叫查詢語(yǔ)句可以查詢出所以被鎖的會(huì)話。如下:
SELECT sn.username, m.SID,sn.SERIAL#, m.TYPE,
DECODE (m.lmode,
0, 'None',
1, 'Null',
2, 'Row Share',
3, 'Row Excl.',
4, 'Share',
5, 'S/Row Excl.',
6, 'Exclusive',
lmode, LTRIM (TO_CHAR (lmode, '990'))
) lmode,
DECODE (m.request,
0, 'None',
1, 'Null',
2, 'Row Share',
3, 'Row Excl.',
4, 'Share',
5, 'S/Row Excl.',
6, 'Exclusive',
request, LTRIM (TO_CHAR (m.request, '990'))
) request,
m.id1, m.id2
FROM v$session sn, v$lock m
WHERE (sn.SID = m.SID AND m.request != 0) --存在鎖請(qǐng)求,即被阻塞
OR ( sn.SID = m.SID --不存在鎖請(qǐng)求,但是鎖定的對(duì)象被其他會(huì)話請(qǐng)求鎖定
AND m.request = 0
AND lmode != 4
AND (id1, id2) IN (
SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0 AND s.id1 = m.id1
AND s.id2 = m.id2)
)
ORDER BY id1, id2, m.request;
通過(guò)以上查詢知道了sid和 SERIAL#就可以開(kāi)殺了
alter system kill session 'sid,SERIAL#';
希望對(duì)你有所幫助。我也是不太懂,是在網(wǎng)上了解的。努力學(xué)習(xí)ing~~~
分享題目:oracle如何殺鎖 oracle kill鎖
分享地址:http://chinadenli.net/article30/hjosso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、定制網(wǎng)站、App開(kāi)發(fā)、搜索引擎優(yōu)化、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)