1)用dba用戶執(zhí)行以下語句
創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今,先為蠡縣等服務建站,蠡縣等地企業(yè),進行企業(yè)商務咨詢服務。為蠡縣企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
select username,lockwait,status,machine,programfrom v$session where sid in
(select session_id from v$locked_object);
如果有輸出的結果,則說明有死鎖,且能看到死鎖的機器是哪一臺。字段說明:
Username:死鎖語句所用的數(shù)據(jù)庫用戶;
Lockwait:死鎖的狀態(tài),如果有內容表示被死鎖。
Status: 狀態(tài),active表示被死鎖
Machine: 死鎖語句所在的機器。
Program: 產(chǎn)生死鎖的語句主要來自哪個應用程序。
2)用dba用戶執(zhí)行以下語句,可以查看到被死鎖的語句。
select sql_text from v$sql where hash_valuein (select sql_hash_value from v$session where sid in
(select session_id from v$locked_object));
四、死鎖的解決方法
一般情況下,只要將產(chǎn)生死鎖的語句提交就可以了,但是在實際的執(zhí)行過程中。用戶可能不知道產(chǎn)生死鎖的語句是哪一句。可以將程序關閉并重新啟動就可以了。經(jīng)常在Oracle的使用過程中碰到這個問題,所以也總結了一點解決方法。
1)查找死鎖的進程:
SELECTs.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESSFROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
2)kill掉這個死鎖的進程:
alter system kill session ‘sid,serial#’; (其中sid=l.session_id)
3)如果還不能解決:
select pro.spid from v$sessionses,v$process pro where ses.sid=XX and ses.paddr=pro.addr;
其中XX用死鎖的sid替換:
ps -ef|grep spid
其中spid是這個進程的進程號,kill掉這個Oracle進程
select A.SQL_TEXT, B.USERNAME, C.OBJECT_ID,C.SESSION_ID, B.SERIAL#,C.ORACLE_USERNAME,C.OS_USER_NAME,C.Process,''''||C.Session_ID||','||B.SERIAL#||'''from v$sql A, v$session B, v$locked_object C where A.HASH_VALUE =B.SQL_HASH_VALUE and B.SID = C.Session_ID
用戶被鎖了?
FAILED_LOGIN_ATTEMPTS參數(shù)默認是10,即:用戶連續(xù)輸入10次錯誤密碼,用戶會被鎖?。?/p>
可以使用其他擁有DBA權限的用戶進行解鎖;
alter user username account unlock;
如果是數(shù)據(jù)庫內部出現(xiàn)死鎖或阻塞會話,可以先查出阻塞的會話,
select * from dba_waiters;
在殺掉阻塞的會話
alter system kill session 'sid,serial#';
測試環(huán)境,可以直接重啟數(shù)據(jù)庫!
1、生成Kill Session語句
select?'alter?system?kill?session?'''?||?SID?||','?||?SERIAL#?||?''';'?from
(
select?distinct?a.sid,?a.Serial#,?status,?machine,?LOCKWAIT,?logon_time
from?v$session?a,?v$locked_object?b
where?(a.status?=?'ACTIVE'?or?a.status?=?'INACTIVE')
and?a.sid?=?b.session_id
and?b.ORACLE_USERNAME='XYHISTEST'--加上用戶名是避免把其他系統(tǒng)的會話也關閉,以免傷及無辜
)
2、批量執(zhí)行第一步生成的語句
alter?system?kill?session?'sid,serial#';
--alter?system?kill?session?'6976,33967';
3、查詢oracle用戶名,機器名,鎖表對象
SELECT?l.session_id?sid,?s.serial#,?l.locked_mode,l.oracle_username,
l.os_user_name,s.machine,?s.terminal,?o.object_name,?s.logon_time
FROM?v$locked_object?l,?all_objects?o,?v$session?s
WHERE?l.object_id?=?o.object_id
AND?l.session_id?=?s.sid
ORDER?BY?sid,?s.serial#?;
/*或者
select?s.SID,?s.OSUSER,?p.spid?as?OSPID,?s.MACHINE,?s.TERMINAL,?s.PROGRAM
from?v$session?s,?v$process?p
where?s.sid?=?6??--session_id
and?s.paddr?=?p.addr;
*/
4、查詢是執(zhí)行何sql語句導致鎖表的
select?b.sql_text
from?v$session?a,?v$sql?b
where?a.sid?=?6?--session_id
and?a.SQL_ADDRESS?=?b.ADDRESS(+);
/*--或者
SELECT?l.session_id?sid,?s.serial#,?l.locked_mode,?l.oracle_username,?s.user#,
l.os_user_name,s.machine,?s.terminal,a.sql_text,?a.action
FROM?v$sqlarea?a,v$session?s,?v$locked_object?l
WHERE?l.session_id?=?s.sid
AND?s.prev_sql_addr?=?a.address
ORDER?BY?sid,?s.serial#;
*/
1.數(shù)據(jù)庫死鎖的現(xiàn)象程序在執(zhí)行的過程中,點擊確定或保存按鈕,程序沒有響應,也沒有出現(xiàn)報錯。
2.死鎖的原理當對于數(shù)據(jù)庫某個表的某一列做更新或刪除等操作,執(zhí)行完畢后該條語句不提交,另一條對于這一列數(shù)據(jù)做更新操作的語句在執(zhí)行的...
3.死鎖的定位方法通過檢查數(shù)據(jù)庫表,能夠檢查出是哪一條語句被死鎖,產(chǎn)生死鎖的機器是哪一臺。 ...
4.死鎖的解決方法 一般情況下,只要將產(chǎn)生死鎖的語句提交就可以了,但是在實際的執(zhí)行過程中.
oracle死鎖時殺進程的方法:
第一步:嘗試在sqlplus中通過sql命令進行刪除,如果能夠刪除成功,則萬事大吉。但通常情況下,出現(xiàn)死鎖時,想通過命令行或者通過oracle的管理工具刪除有死鎖的session,oracle只會將該session標記為killed,但無法清除掉,往往需要通過第二步在操作系統(tǒng)層級進行刪除。
第二步:
1、select xidusn, object_id, session_id, locked_mode from v$locked_object; --查死鎖的對象,獲取其SESSION_ID。
2、select username,sid,serial# from v$session where sid=29; --根據(jù)上步獲取到的sid查看其serial#號。
3、alter system kill session '29,57107'; --刪除進程,如已經(jīng)刪除過,則會報ora-00031的錯誤;否則oracle會將該session標記為killed狀態(tài),等待一段時間看能否會自動消失,如長時間消失不掉,則需要做后續(xù)步驟。
一些ORACLE中的進程被殺掉后,狀態(tài)被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟數(shù)據(jù)庫。現(xiàn)在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
沒有具體的解鎖時間。
oracle沒有具體的解鎖時間??梢宰詣訖z測死鎖并解決它們,如果還不行,就只能人為去做了。
兩個用戶互相等待對方釋放資源時,oracle認定為產(chǎn)生了死鎖,在這種情況下,將以犧牲一個用戶作為代價。