oracle表為什么老是被鎖 oracle經(jīng)常死鎖,鎖定數(shù)據(jù)庫的一些表,導(dǎo)致oracle死鎖的原因一般有那些?
oracle經(jīng)常死鎖,鎖定數(shù)據(jù)庫的一些表,導(dǎo)致oracle死鎖的原因一般有那些?一般情況只發(fā)生鎖超時(shí),就是一個(gè)進(jìn)程需要訪問數(shù)據(jù)庫表或者字段的時(shí)候,另外一個(gè)程序正在執(zhí)行帶鎖的訪問(比如修改數(shù)據(jù)),那么這
oracle經(jīng)常死鎖,鎖定數(shù)據(jù)庫的一些表,導(dǎo)致oracle死鎖的原因一般有那些?
一般情況只發(fā)生鎖超時(shí),就是一個(gè)進(jìn)程需要訪問數(shù)據(jù)庫表或者字段的時(shí)候,另外一個(gè)程序正在執(zhí)行帶鎖的訪問(比如修改數(shù)據(jù)),那么這個(gè)進(jìn)程就會等待,當(dāng)?shù)攘撕芫面i還沒有解除的話就會鎖超時(shí),報(bào)告一個(gè)系統(tǒng)錯(cuò)誤,拒絕執(zhí)行相應(yīng)的SQL操作。發(fā)生死鎖的情況比較少,比如一個(gè)進(jìn)程需要訪問兩個(gè)資源(數(shù)據(jù)庫表或者字段),當(dāng)獲取一個(gè)資源的時(shí)候進(jìn)程就對它執(zhí)行鎖定,然后等待下一個(gè)資源空閑,這時(shí)候如果另外一個(gè)進(jìn)程也需要兩個(gè)資源,而已經(jīng)獲得并鎖定了第二個(gè)資源,那么就會死鎖,因?yàn)楫?dāng)前進(jìn)程鎖定第一個(gè)資源等待第二個(gè)資源,而另外一個(gè)進(jìn)程鎖定了第二個(gè)資源等待第一個(gè)資源,兩個(gè)進(jìn)程都永遠(yuǎn)得不到滿足。
erp100.com
oracle鎖表、解鎖的語句?
一些ORACLE中的進(jìn)程被殺掉后,狀態(tài)被置為"killed",但是鎖定的資源很長時(shí)間不釋放,有時(shí)實(shí)在沒辦法,只好重啟數(shù)據(jù)庫?,F(xiàn)在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
1.下面的語句用來查詢哪些對象被鎖:selectobject_name,machine,s.sid,s.serial#fromv$locked_objectl,dba_objectso,v$sessionswherel.object_id = o.object_idandl.session_id=s.sid
2.下面的語句用來殺死一個(gè)進(jìn)程:altersystemkillsession"24,111"(其中24,111分別是上面查詢出的sid,serial#)【注】以上兩步,可以通過Oracle的管理控制臺來執(zhí)行。
3.如果利用上面的命令殺死一個(gè)進(jìn)程后,進(jìn)程狀態(tài)被置為"killed",但是鎖定的資源很長時(shí)間沒有被釋放,那么可以在os一級再殺死相應(yīng)的進(jìn)程(線程),首先執(zhí)行下面的語句獲得進(jìn)程(線程)號:selectspid,osuser,s.programfromv$sessions,v$processpwheres.paddr=p.addrands.sid=24(24是上面的sid)4.在OS上殺死這個(gè)進(jìn)程(線程):1)在unix上,用root身份執(zhí)行命令:#kill-912345(即第3步查詢出的spid)2)在windows(unix也適用)用orakill殺死線程,orakill是oracle提供的一個(gè)可執(zhí)行命令,語法為:orakillsidthread其中:sid:表示要?dú)⑺赖倪M(jìn)程屬于的實(shí)例名thread:是要?dú)⒌舻木€程號,即第3步查詢出的spid。例:c:>orakillorcl12345
oracle數(shù)據(jù)庫鎖表怎么解決?
首先你要知道表鎖住了是不是正常鎖?因?yàn)槿魏蜠ML語句都會對表加鎖。你要先查一下是那個(gè)會話那個(gè)sql鎖住了表,有可能這是正常業(yè)務(wù)需求,不建議隨便KILLsession,如果這個(gè)鎖表是正常業(yè)務(wù)你把sessionkill掉了會影響業(yè)務(wù)的。建議先查原因再做決定。(1)鎖表查詢的代碼有以下的形式:selectcount(*)fromv$locked_objectselect*fromv$locked_object(2)查看哪個(gè)表被鎖selectb.owner,b.object_name,a.session_id,a.locked_modefromv$locked_objecta,dba_objectsbwhereb.object_id=a.object_id(3)查看是哪個(gè)session引起的selectb.username,b.sid,b.serial#,logon_timefromv$locked_objecta,v$sessionbwherea.session_id=b.sidorderbyb.logon_time(4)查看是哪個(gè)sql引起的selectb.username,b.sid,b.serial#,c.*fromv$locked_objecta,v$sessionb,v$sqlcwherea.session_id=b.sidandb.SQL_ID=c.sql_idandc.sql_id=""orderbyb.logon_time(5)殺掉對應(yīng)進(jìn)程執(zhí)行命令:altersystemkillsession"1025,41"其中1025為sid,41為serial#.
oracle表在什么情況下會被鎖?。?/h2>
在對指定表做append操作,其他再做truncate時(shí)候,會產(chǎn)生鎖表,如下驗(yà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報(bào)鎖表錯(cuò)誤,4、查看鎖表語句,發(fā)現(xiàn)被鎖表,select b.object_name, t.* from v$locked_object t, user_objects b where t.object_id = b.object_id
平時(shí)使用oracle時(shí),為什么會鎖表?
簡單地說,鎖是為了保證數(shù)據(jù)的一致性,鎖不止存在于oracle,其他數(shù)據(jù)庫一樣有,只不過機(jī)制上可能大相徑庭。至于什么樣的操作會鎖表,其實(shí)鎖的種類很多,你所說的鎖表大概說的是行級鎖——也就是事務(wù)鎖吧。比如一個(gè)update語句,被update的行上會有鎖——能阻塞其他事務(wù)對這些行進(jìn)行修改的鎖,雖然這時(shí)候這張表上也有表級鎖,但這個(gè)表級鎖并不影響其他事務(wù)對表中的其他行進(jìn)行修改,只是會阻礙對這張表的DDL操作。
oracle頻繁鎖表,怎么查出原因?
通過下面的語句查看是否有引發(fā)鎖表的語句在執(zhí)行,找到執(zhí)行用戶,然后跟對應(yīng)的用戶溝通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#如果一直沒有鎖表的語句出現(xiàn),那可能是對應(yīng)的表在做DDL操作,如添加索引,也可能引發(fā)鎖表,這個(gè)可以去alert日志里查看下是否有人在添加索引