首先,oracle死鎖進程是后臺自動發(fā)現(xiàn)自動殺掉的。
創(chuàng)新互聯(lián)擁有十余年成都網(wǎng)站建設(shè)工作經(jīng)驗,為各大企業(yè)提供網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計服務(wù),對于網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、成都app軟件開發(fā)公司、wap網(wǎng)站建設(shè)(手機版網(wǎng)站建設(shè))、程序開發(fā)、網(wǎng)站優(yōu)化(SEO優(yōu)化)、微網(wǎng)站、域名注冊等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了很多網(wǎng)站制作、網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等網(wǎng)站化運作于一體,具備承接各種規(guī)模類型的網(wǎng)站建設(shè)項目的能力。
其次,如果想要殺掉oracle的進程,可以殺程序的前臺進程,也可以殺數(shù)據(jù)庫的用戶連接進程,也可以在數(shù)據(jù)庫中執(zhí)行alter system kill session 'sid,serial'去殺
試試下面的方法: 第一步:查看是否有死鎖存在,查出有數(shù)據(jù)則代表有死鎖 select p.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_name from v$process p,v$session a,v$locked_object b,all_objects c
用戶被鎖了?
FAILED_LOGIN_ATTEMPTS參數(shù)默認是10,即:用戶連續(xù)輸入10次錯誤密碼,用戶會被鎖?。?/p>
可以使用其他擁有DBA權(quán)限的用戶進行解鎖;
alter user username account unlock;
如果是數(shù)據(jù)庫內(nèi)部出現(xiàn)死鎖或阻塞會話,可以先查出阻塞的會話,
select * from dba_waiters;
在殺掉阻塞的會話
alter system kill session 'sid,serial#';
測試環(huán)境,可以直接重啟數(shù)據(jù)庫!
1.查哪個過程被鎖
查V$DB_OBJECT_CACHE視圖:SELECT*FROMV$DB_OBJECT_CACHEWHEREOWNER='過程的所屬用戶'ANDLOCKS!='0';
2. 查是哪一個SID,通過SID可知道是哪個SESSION.
查V$ACCESS視圖:SELECT*FROMV$ACCESSWHEREOWNER='過程的所屬用戶'ANDNAME='剛才查到的過程名';
3. 查出SID和SERIAL#
查V$SESSION視圖:SELECTSID,SERIAL#,PADDRFROMV$SESSIONWHERESID='剛才查到的SID'查V$PROCESS視圖:SELECTSPIDFROMV$PROCESSWHEREADDR='剛才查到的PADDR';
4. 殺進程(1).先殺ORACLE進程:ALTERSYSTEMKILLSESSION'查出的SID,查出的SERIAL#';(2).再殺操作系統(tǒng)進程:KILL-9剛才查出的SPID或ORAKILL剛才查出的SID剛才查出的SPID方法二:經(jīng)常在oracle的使用過程中碰到這個問題,所以也總結(jié)了一點解決方法:)1)查找死鎖的進程:sqlplus"/assysdba"SELECT
s.username,l.
OBJECT_ID
,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESSFROMV$LOCKED_OBJECTl,V$SESSIONSWHERE
l.SESSION_ID=
S.SID;2)kill掉這個死鎖的進程:altersystemkillsession‘sid,serial#’;(其中sid=
l.session_id)3)如果還不能解決,
selectpro.spidfromv$sessionses,v$processprowhereses.sid=XXandses.paddr=pro.addr;其中sid用死鎖的sid替換。
Oracle數(shù)據(jù)庫出現(xiàn)死鎖的時候可以按照以下處理步驟加以解決:
第一步:嘗試在sqlplus中通過sql命令進行刪除,如果能夠刪除成功,則萬事大吉!但通常情況下,出現(xiàn)死鎖時,想通過命令行或者通過Oracle的管理工具刪除有死鎖的session,oracle只會將該session標記為killed,但無法清除掉,往往需要通過第二步在操作系統(tǒng)層級進行刪除!
Connected?to?Oracle9i?Enterprise?Edition?Release?9.2.0.1.0?
Connected?as?quik
SQL?select?xidusn,?object_id,?session_id,?locked_mode?from?v$locked_object;?--查死鎖的對象,獲取其SESSION_ID
XIDUSN?OBJECT_ID?SESSION_ID?LOCKED_MODE
----------?----------?----------?-----------
10?30724?29?3
10?30649?29?3
SQL?select?username,sid,serial#?from?v$session?where?sid=29;?--根據(jù)上步獲取到的sid查看其serial#號
USERNAME?SID?SERIAL#
------------------------------?----------?----------
QUIK?29?57107
SQL?alter?system?kill?session?'29,57107';?--刪除進程,如已經(jīng)刪除過,則會報ora-00031的錯誤;否則oracle會將該session標記為killed狀態(tài),等待一段時間看能否會自動消失,如長時間消失不掉,則需要做后續(xù)步驟
alter?system?kill?session?'29,57107'
ORA-00031:?session?marked?for?kill
SQL?select?pro.spid?from?v$session?ses,v$process?pro?where?ses.sid=29?and?ses.paddr=pro.addr;?--查看spid號,以便在操作系統(tǒng)中根據(jù)該進程號刪除進程
SPID
------------
2273286
第二步:進入操作系統(tǒng)進行刪除進程,本示例的操作系統(tǒng)是IBM aix。
login:?root?--錄入用戶名
root's?Password:?--錄入密碼
*******************************************************************************
*?*
*?*
*?Welcome?to?AIX?Version?5.3!?*
*?*
*?*
*?Please?see?the?README?file?in?/usr/lpp/bos?for?information?pertinent?to?*
*?this?release?of?the?AIX?Operating?System.?*
*?*
*?*
*******************************************************************************
Last?unsuccessful?login:?Fri?Apr?23?14:42:57?BEIDT?2010?on?/dev/pts/1?from?10.73
.52.254
Last?login:?Fri?Apr?23?15:27:50?BEIDT?2010?on?/dev/pts/2?from?10.73.52.254
#?ps?-ef|grep?2273286?--查看進程詳情
root?2289864?2494636?0?17:07:15?pts/1?0:00?grep?2273286
oracle?2273286?1?0?14:38:24?-?0:21?oracleQUIK?(LOCAL=NO)
#?kill?-9?2273286?--刪除進程,小心操作,別寫錯進程號,如果oracle的關(guān)鍵進程被刪,數(shù)據(jù)庫會崩潰的!
#?ps?-ef|grep?2273286?--再次查看
root?2289864?2494636?0?17:07:15?pts/1?0:00?grep?2273286
For?Windows,?at?the?DOS?Prompt:?orakill?sid?spid
For?UNIX?at?the?command?line?kill?–9?spid
估計你SQL 拼接錯了吧,建議打印一下;
我的測試過程;
--新建一個會話窗口,掛起一個會話;
SQL?create?table?test(col?varchar2(20));
Table?created
SQL?insert?into?test?values('test');
1?row?inserted?
--再新建一個會話窗口,殺掉鎖定test表的會話
SQL?declare
2??begin
3????for?vref?in?(select?t.sid,?t.serial#
4???????????????????from?v$session?t
5??????????????????where?sid?in
6????????????????????????(select?sid
7???????????????????????????from?v$lock
8??????????????????????????where?id1?in
9????????????????????????????????(select?object_id
10???????????????????????????????????from?user_objects?t
11??????????????????????????????????where?object_name?=?upper('test'))))?loop
12??????execute?immediate?'alter?system?kill?session??'''?||?vref.sid?||?','?||
13????????????????????????vref.serial#?||?'''';
14????end?loop;
15??end;
16??/
PL/SQL?procedure?successfully?completed
SQL?
SQL?select?t.sid,?t.serial#
2???????????????????from?v$session?t
3??????????????????where?sid?in
4????????????????????????(select?sid
5???????????????????????????from?v$lock
6??????????????????????????where?id1?in
7????????????????????????????????(select?object_id
8???????????????????????????????????from?user_objects?t
9??????????????????????????????????where?object_name?=?upper('test')))
10??/
SID????SERIAL#
----------?----------
SQL