如果一個(gè)數(shù)據(jù)庫(kù)insert update delete操作很長(zhǎng)時(shí)間沒(méi)有反應(yīng),就可能出現(xiàn)了沒(méi)有正常釋放的鎖。
創(chuàng)新互聯(lián)專(zhuān)注于阿城網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供阿城營(yíng)銷(xiāo)型網(wǎng)站建設(shè),阿城網(wǎng)站制作、阿城網(wǎng)頁(yè)設(shè)計(jì)、阿城網(wǎng)站官網(wǎng)定制、微信小程序定制開(kāi)發(fā)服務(wù),打造阿城網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供阿城網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
可以用以下SQL語(yǔ)句殺掉沒(méi)有正常釋放的鎖:
oracle死鎖時(shí)殺進(jìn)程的方法:
第一步:嘗試在sqlplus中通過(guò)sql命令進(jìn)行刪除,如果能夠刪除成功,則萬(wàn)事大吉。但通常情況下,出現(xiàn)死鎖時(shí),想通過(guò)命令行或者通過(guò)oracle的管理工具刪除有死鎖的session,oracle只會(huì)將該session標(biāo)記為killed,但無(wú)法清除掉,往往需要通過(guò)第二步在操作系統(tǒng)層級(jí)進(jìn)行刪除。
第二步:
1、select xidusn, object_id, session_id, locked_mode from v$locked_object; --查死鎖的對(duì)象,獲取其SESSION_ID。
2、select username,sid,serial# from v$session where sid=29; --根據(jù)上步獲取到的sid查看其serial#號(hào)。
3、alter system kill session '29,57107'; --刪除進(jìn)程,如已經(jīng)刪除過(guò),則會(huì)報(bào)ora-00031的錯(cuò)誤;否則oracle會(huì)將該session標(biāo)記為killed狀態(tài),等待一段時(shí)間看能否會(huì)自動(dòng)消失,如長(zhǎng)時(shí)間消失不掉,則需要做后續(xù)步驟。
一些ORACLE中的進(jìn)程被殺掉后,狀態(tài)被置為"killed",但是鎖定的資源很長(zhǎng)時(shí)間不釋放,有時(shí)實(shí)在沒(méi)辦法,只好重啟數(shù)據(jù)庫(kù)?,F(xiàn)在提供一種方法解決這種問(wèn)題,那就是在ORACLE中殺不掉的,在OS一級(jí)再殺。
1、在做Oracle監(jiān)聽(tīng)程序測(cè)試時(shí),發(fā)現(xiàn)帳戶(hù)已經(jīng)被鎖定。
2、在數(shù)據(jù)庫(kù)安裝電腦上,點(diǎn)擊開(kāi)始打開(kāi)運(yùn)行窗口。
3、在運(yùn)行窗口輸入CMD,調(diào)出命令提示符界面。
3、在命令提示符下面,用管理員身份登入到數(shù)據(jù)庫(kù)sqlplus / as sysdba。
4、輸入解鎖命令alter user Scott account unlock后回車(chē)。
5、看見(jiàn)用戶(hù)已更改的字樣,表示命令已成功執(zhí)行。
6、再切換到監(jiān)聽(tīng)程序驗(yàn)證,原來(lái)的ora-28000帳戶(hù)被鎖定的提示已經(jīng)不存在了。用戶(hù)解鎖成功。
1.查哪個(gè)過(guò)程被鎖\x0d\x0a查V$DB_OBJECT_CACHE視圖:SELECT*FROMV$DB_OBJECT_CACHEWHEREOWNER='過(guò)程的所屬用戶(hù)'ANDLOCKS!='0';\x0d\x0a2. 查是哪一個(gè)SID,通過(guò)SID可知道是哪個(gè)SESSION.\x0d\x0a查V$ACCESS視圖:SELECT*FROMV$ACCESSWHEREOWNER='過(guò)程的所屬用戶(hù)'ANDNAME='剛才查到的過(guò)程名';\x0d\x0a3. 查出SID和SERIAL#\x0d\x0a查V$SESSION視圖:SELECTSID,SERIAL#,PADDRFROMV$SESSIONWHERESID='剛才查到的SID'查V$PROCESS視圖:SELECTSPIDFROMV$PROCESSWHEREADDR='剛才查到的PADDR';\x0d\x0a4. 殺進(jìn)程(1).先殺ORACLE進(jìn)程:ALTERSYSTEMKILLSESSION'查出的SID,查出的SERIAL#';(2).再殺操作系統(tǒng)進(jìn)程:KILL-9剛才查出的SPID或ORAKILL剛才查出的SID剛才查出的SPID方法二:經(jīng)常在oracle的使用過(guò)程中碰到這個(gè)問(wèn)題,所以也總結(jié)了一點(diǎn)解決方法:)1)查找死鎖的進(jìn)程:sqlplus"/assysdba"SELECT\x0d\x0as.username,l.\x0d\x0aOBJECT_ID\x0d\x0a,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESSFROMV$LOCKED_OBJECTl,V$SESSIONSWHERE\x0d\x0al.SESSION_ID=\x0d\x0aS.SID;2)kill掉這個(gè)死鎖的進(jìn)程:altersystemkillsession‘sid,serial#’;(其中sid=\x0d\x0al.session_id)3)如果還不能解決,\x0d\x0aselectpro.spidfromv$sessionses,v$processprowhereses.sid=XXandses.paddr=pro.addr;其中sid用死鎖的sid替換。