oracle死鎖問題一直困擾著我們,下面就教您一個oracle死鎖的檢查方法,如果您之前遇到過oracle死鎖方面的問題,不妨一看。 一、數(shù)據(jù)庫死鎖的現(xiàn)象 程序在執(zhí)行的過程中,點(diǎn)擊確定或保存按鈕,程序沒有響應(yīng),也沒有出現(xiàn)報錯。 二、oracle死鎖的原理 當(dāng)對于數(shù)據(jù)庫某個表的某一列做更新或刪除等操作,執(zhí)行完畢后該條語句不提交,另一條對于這一列數(shù)據(jù)做更新操作的語句在執(zhí)行的時候就會處于等待狀態(tài),此時的現(xiàn)象是這條語句一直在執(zhí)行,但一直沒有執(zhí)行成功,也沒有報錯。 三、oracle死鎖的定位方法 通過檢查數(shù)據(jù)庫表,能夠檢查出是哪一條語句被死鎖,產(chǎn)生死鎖的機(jī)器是哪一臺。 1)用dba用戶執(zhí)行以下語句 以下是代碼片段: select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object) 如果有輸出的結(jié)果,則說明有死鎖,且能看到死鎖的機(jī)器是哪一臺。字段說明: Username:死鎖語句所用的數(shù)據(jù)庫用戶; Lockwait:死鎖的狀態(tài),如果有內(nèi)容表示被死鎖。 Status: 狀態(tài),active表示被死鎖 Machine: 死鎖語句所在的機(jī)器。 Program: 產(chǎn)生死鎖的語句主要來自哪個應(yīng)用程序。 2)用dba用戶執(zhí)行以下語句,可以查看到被死鎖的語句。 以下是代碼片段:
成都創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、成都做網(wǎng)站網(wǎng)站策劃,項目實(shí)施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元花垣做網(wǎng)站,已為上家服務(wù),為花垣各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
在對指定表做append操作,其他再做truncate時候,會產(chǎn)生鎖表,如下驗證步驟,
1、創(chuàng)建測試表,
create table test_lock(id number, value varchar2(200));
2、執(zhí)行append語句;并且不做提交,insert /*+append*/ into test_lock values(1,1);
3、再次執(zhí)行清表語句,truncate table test_lock;報鎖表錯誤,
4、查看鎖表語句,發(fā)現(xiàn)被鎖表,
select b.object_name, t.*
from v$locked_object t, user_objects b
where t.object_id = b.object_id
1.創(chuàng)建測試表,如下圖。
createtabletest_lock(idnumber,valuevarchar2(200));
2.執(zhí)行append語句;并且不做提交,insert/*+append*/intotest_lockvalues(1,1)如下圖。
3.再次執(zhí)行清表語句,truncatetabletest_lock;報鎖表錯誤,如下圖。
4.查看鎖表語句,發(fā)現(xiàn)被鎖表
selectb.object_name,t.*
fromv$locked_objectt,user_objectsb
wheret.object_id=b.object_id
注意事項:
簡化數(shù)據(jù):可以將復(fù)雜的查詢創(chuàng)建為其他人可以使用的視圖,而不必了解復(fù)雜的業(yè)務(wù)或邏輯關(guān)系。這簡化并掩蓋了視圖用戶數(shù)據(jù)的復(fù)雜性。
表結(jié)構(gòu)設(shè)計的補(bǔ)充:在設(shè)計的系統(tǒng)才剛剛開始,大部分的程序直接訪問數(shù)據(jù)表結(jié)構(gòu),但是隨著業(yè)務(wù)的變化,系統(tǒng)更新,等等,引起了一些表結(jié)構(gòu)不適用,這次修改系統(tǒng)的表結(jié)構(gòu)太大,開發(fā)成本較高的影響。
這個時候可以創(chuàng)建一個視圖來補(bǔ)充表結(jié)構(gòu)設(shè)計,降低開發(fā)成本。程序可以通過查詢視圖直接獲得它想要的數(shù)據(jù)。
添加安全性:視圖可以向用戶顯示表中的指定字段,而不是向用戶顯示表中的所有字段。在實(shí)際開發(fā)中,視圖通常作為提供數(shù)據(jù)的一種方式提供,并將只讀權(quán)限提供給第三方以供查詢使用。
下面3個語句是我經(jīng)常使用來解決oracle鎖問題的 -- 注意你的用戶有沒有權(quán)限問題
1. 查看被鎖的表
SELECT p.spid, a.serial#, 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
WHERE p.addr = a.paddr AND a.process = b.process
AND c.object_id = b.object_id
2. 查看是哪個進(jìn)程鎖的
SELECT sid, serial#, username, osuser FROM v$session where osuser = 'tangpj'
3. 殺掉這個進(jìn)程 alter system kill session 'sid,serial#';
1、在做Oracle監(jiān)聽程序測試時,發(fā)現(xiàn)帳戶已經(jīng)被鎖定。
2、在數(shù)據(jù)庫安裝電腦上,點(diǎn)擊開始打開運(yùn)行窗口。
3、在運(yùn)行窗口輸入CMD,調(diào)出命令提示符界面。
3、在命令提示符下面,用管理員身份登入到數(shù)據(jù)庫sqlplus / as sysdba。
4、輸入解鎖命令alter user Scott account unlock后回車。
5、看見用戶已更改的字樣,表示命令已成功執(zhí)行。
6、再切換到監(jiān)聽程序驗證,原來的ora-28000帳戶被鎖定的提示已經(jīng)不存在了。用戶解鎖成功。
1. 先通過top命令查看產(chǎn)用資源較多的spid號
2.查詢當(dāng)前耗時的會話ID,用戶名,sqlID等:
select sid,serial#,machine,username,program,sql_hash_value,sql_id,
? to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') as login_time from v$session
where paddr in (select addr from v$process where spid in ('5648612','256523'));
3. 如果上一步sql_id或者 hash_value不為空,則可用v$sqlarea查出當(dāng)前正在使用的sql
select sql_text
from v$sqltext_with_newlines
where hash_value = hash_value
order by piece;
也可直接使用:
select a.*,b.SQL_TEXT from (
select sid,serial#,machine,username,program,sql_hash_value,sql_id,
? to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') as login_time from v$session
where paddr in (select addr from v$process where spid in ('23226'))
) a,v$sql b
where a.sql_id? = b.SQL_ID(+)
4.kill占用大資源的session
Alter system kill session 'SID,SERIAL#'
解鎖:
1.查詢哪些對象被鎖:
select object_name,machine,s.sid,s.serial#
from v$locked_object l,dba_objects o ,v$session s
where l.object_id = o.object_id and l.session_id=s.sid;
2.下面的語句用來殺死一個進(jìn)程:
alter system kill session '524,1095'; (其中24,111分別是上面查詢出的sid,serial#)
3.再一次查詢目前鎖定的對象,若發(fā)現(xiàn)以上方法不能解除鎖定的表,則用以下方法:
3.1 執(zhí)行下面的語句獲得進(jìn)程(線程)號:
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=524 (524是上面的sid)
新聞名稱:如何查看oracle鎖,oracle鎖表查詢和解鎖方法
URL標(biāo)題:http://chinadenli.net/article4/hdogie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站收錄、用戶體驗、網(wǎng)站改版、響應(yīng)式網(wǎng)站、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)