oracle數(shù)據(jù)庫(kù)被鎖了怎么解鎖 查看oracle是否鎖表?
查看oracle是否鎖表?Oracle數(shù)據(jù)庫(kù)操作中,我們有時(shí)會(huì)用到鎖表查詢以及解鎖和kill進(jìn)程等操作,那么這些操作是怎么實(shí)現(xiàn)的呢?本文我們主要就介紹一下這部分內(nèi)容。(1)鎖表查詢的代碼有以下的形式:
查看oracle是否鎖表?
Oracle數(shù)據(jù)庫(kù)操作中,我們有時(shí)會(huì)用到鎖表查詢以及解鎖和kill進(jìn)程等操作,那么這些操作是怎么實(shí)現(xiàn)的呢?本文我們主要就介紹一下這部分內(nèi)容。(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)殺掉對(duì)應(yīng)進(jìn)程執(zhí)行命令:altersystemkillsession"1025,41"其中1025為sid,41為serial#.
oracle行級(jí)鎖和表級(jí)鎖的區(qū)別?
1. 程序中非數(shù)據(jù)庫(kù)交互操作導(dǎo)致事務(wù)掛起
將接口調(diào)用或者文件操作等這一類非數(shù)據(jù)庫(kù)交互操作嵌入在 SQL 事務(wù)代碼之中,那么整個(gè)事務(wù)很有可能因此掛起(接口不通等待超時(shí)或是上傳下載大附件)。
2. 事務(wù)中包含性能較差的查詢 SQL
事務(wù)中存在慢查詢,導(dǎo)致同一個(gè)事務(wù)中的其他 DML 無法及時(shí)釋放占用的行鎖,引起行鎖等待。
3. 單個(gè)事務(wù)中包含大量 SQL
通常是由于在事務(wù)代碼中加入 for 循環(huán)導(dǎo)致,雖然單個(gè) SQL 運(yùn)行很快,但是 SQL 數(shù)量一大,事務(wù)就會(huì)很慢。
4. 級(jí)聯(lián)更新 SQL 執(zhí)行時(shí)間較久
這類 SQL 容易讓人產(chǎn)生錯(cuò)覺,例如:update A set ... where ...in (select B) 這類級(jí)聯(lián)更新,不僅會(huì)占用 A 表上的行鎖,也會(huì)占用 B 表上的行鎖,當(dāng) SQL 執(zhí)行較久時(shí),很容易引起 B 表上的行鎖等待。
5. 磁盤問題導(dǎo)致的事務(wù)掛起
極少出現(xiàn)的情形,比如存儲(chǔ)突然離線,SQL 執(zhí)行會(huì)卡在內(nèi)核調(diào)用磁盤的步驟上,一直等待,事務(wù)無法提交。
綜上可以看出,如果事務(wù)長(zhǎng)時(shí)間未提交,且事務(wù)中包含了 DML 操作,那么就有可能產(chǎn)生行鎖等待,引起報(bào)錯(cuò)。
oracle頻繁鎖表,怎么查出原因?
通過下面的語(yǔ)句查看是否有引發(fā)鎖表的語(yǔ)句在執(zhí)行,找到執(zhí)行用戶,然后跟對(duì)應(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#如果一直沒有鎖表的語(yǔ)句出現(xiàn),那可能是對(duì)應(yīng)的表在做DDL操作,如添加索引,也可能引發(fā)鎖表,這個(gè)可以去alert日志里查看下是否有人在添加索引
查詢oracle哪個(gè)表被鎖了?
查v$locked_object和dba_ddl_locks這兩個(gè)前面是查詢dml鎖的后面是查詢ddl鎖的。然后利用查到的object_id進(jìn)行關(guān)聯(lián),找到object_name就是表名
查看oracle是否鎖表?
查看哪個(gè)表被鎖
selectb.owner,b.object_name,a.session_id,a.locked_mode
fromv$locked_objecta,dba_objectsb
whereb.object_id=a.object_id
查看是哪個(gè)session引起的
selectb.username,b.sid,b.serial#,logon_time
fromv$locked_objecta,v$sessionb
wherea.session_id=b.sidorderbyb.logon_time
oracle行級(jí)鎖和表級(jí)鎖的區(qū)別?
oracle 速度慢,很難評(píng)說,可能是因?yàn)橐韵略颍?br/>
- 對(duì)于并發(fā)訪問內(nèi)部管理數(shù)據(jù)結(jié)構(gòu)嚴(yán)謹(jǐn)性
 - 和對(duì)業(yè)務(wù)數(shù)據(jù)并發(fā)訪問嚴(yán)禁性高,要求ACID,如構(gòu)建一致性讀塊,保存回滾和日志信息
 - 維護(hù)各種 b-tree, bitmap index, 物化視圖等等
 - 處理各種trigger
 - 更新各種內(nèi)部性能統(tǒng)計(jì)
 - 檢查各種配合是否到限制
 
- 查詢優(yōu)化器的能力,包括數(shù)據(jù)分布統(tǒng)計(jì)數(shù)據(jù)的自動(dòng)采集和利用,對(duì)于復(fù)雜SQL這個(gè)是關(guān)鍵
 - 并發(fā)訪問的沖突粒度,是表級(jí)鎖,塊或頁(yè)級(jí)鎖,還是行級(jí)索,讀寫是否沖突等等,內(nèi)部數(shù)據(jù)結(jié)構(gòu)latch的應(yīng)用
 - 分區(qū)能力
 - 存儲(chǔ)過程支持程度,因?yàn)槭褂胹tored procedure 能顯著減低數(shù)據(jù)處理消耗