一、故障現(xiàn)象
周末接到一個(gè)CASE,故障描述是,當(dāng)時(shí)業(yè)務(wù)產(chǎn)生大量的TX鎖,DBA因?yàn)椴辉趺戳私?,鎖的原理,盲目的KILL 進(jìn)程,無法盡快的定位問題。為了不影響業(yè)務(wù),重啟了數(shù)據(jù)庫,導(dǎo)致大量的用戶投訴。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計(jì)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了北塔免費(fèi)建站歡迎大家使用!Fri Mar 13 15:05:17 2020
opiodr aborting process unknown ospid (33292328) as a result of ORA-28
Fri Mar 13 15:05:59 2020
opiodr aborting process unknown ospid (34668796) as a result of ORA-28
Fri Mar 13 15:06:11 2020
opiodr aborting process unknown ospid (33554618) as a result of ORA-28
Fri Mar 13 15:06:23 2020
opiodr aborting process unknown ospid (34471986) as a result of ORA-28
Fri Mar 13 15:06:45 2020
二、分析過程
從awr看當(dāng)時(shí)阻塞的應(yīng)該是insert語句導(dǎo)致,awr執(zhí)行語句比較長的
而awr中放在首位的是UPDATA及DELETE,沒有辦法繼續(xù)看ash一些內(nèi)容,發(fā)現(xiàn)如下表使用比較高,
而在awr中,無此表的相關(guān)語句,
從上邊分析看出,鎖住的有insert語句,因此懷疑為外鍵沒有索引導(dǎo)致。
查看表的結(jié)構(gòu)。
如下:
DELETE FROM bTT WHERE id_=:1 引起的,并且 在task_id 字段上不存在索引,
三、結(jié)論
添加表索引后問題解決,再也沒有出現(xiàn)過大量enq鎖
四、總結(jié)
在ORACLE數(shù)據(jù)庫中,定義外鍵約束時(shí),ORACLE是不會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)索引的,必須手動(dòng)在外鍵約束相關(guān)的列上創(chuàng)建索引。
外鍵列上缺少索引會(huì)帶來三個(gè)問題,限制并發(fā)性、影響性能、還有可能造成死鎖。所以對(duì)于絕大部分場(chǎng)景,我們應(yīng)該盡量考慮在外鍵上面創(chuàng)建索引
影響性能。如果子表外鍵沒有創(chuàng)建索引,那么當(dāng)父表查詢關(guān)聯(lián)子表時(shí),子表將進(jìn)行全表掃描。影響表連接方式。
影響并發(fā)。無論是更新父表主鍵,或者刪除一個(gè)父記錄,都會(huì)在子表中加一個(gè)表鎖(在這條語句完成前,不允許對(duì)子表做任何修改)。這就會(huì)不必要地鎖定更多的行,而影響并發(fā)性
3. 在特殊情況下,還有可能造成死鎖。
1. 不會(huì)刪除父表中的行。
2. 不論是有意還是無意,總之不會(huì)更新父表 的唯一 / 主鍵字段值。
3. 不會(huì)從父表聯(lián)結(jié)到子表, 或者更通俗的講,外鍵列不支持子表的一個(gè)重要訪問路徑,而且你在謂詞中沒有使用這些外鍵累從子表中選擇數(shù)據(jù) 。