一、故障現象
周末接到一個CASE,故障描述是,當時業務產生大量的TX鎖,DBA因為不怎么了解,鎖的原理,盲目的KILL 進程,無法盡快的定位問題。為了不影響業務,重啟了數據庫,導致大量的用戶投訴。
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看當時阻塞的應該是insert語句導致,awr執行語句比較長的
而awr中放在首位的是UPDATA及DELETE,沒有辦法繼續看ash一些內容,發現如下表使用比較高,
而在awr中,無此表的相關語句,
從上邊分析看出,鎖住的有insert語句,因此懷疑為外鍵沒有索引導致。
查看表的結構。
如下:

DELETE FROM bTT WHERE id_=:1 引起的,并且 在task_id 字段上不存在索引,
三、結論
添加表索引后問題解決,再也沒有出現過大量enq鎖
四、總結
在ORACLE數據庫中,定義外鍵約束時,ORACLE是不會自動創建對應索引的,必須手動在外鍵約束相關的列上創建索引。
外鍵列上缺少索引會帶來三個問題,限制并發性、影響性能、還有可能造成死鎖。所以對于絕大部分場景,我們應該盡量考慮在外鍵上面創建索引
影響性能。如果子表外鍵沒有創建索引,那么當父表查詢關聯子表時,子表將進行全表掃描。影響表連接方式。
影響并發。無論是更新父表主鍵,或者刪除一個父記錄,都會在子表中加一個表鎖(在這條語句完成前,不允許對子表做任何修改)。這就會不必要地鎖定更多的行,而影響并發性
3. 在特殊情況下,還有可能造成死鎖。
1. 不會刪除父表中的行。
2. 不論是有意還是無意,總之不會更新父表 的唯一 / 主鍵字段值。
3. 不會從父表聯結到子表, 或者更通俗的講,外鍵列不支持子表的一個重要訪問路徑,而且你在謂詞中沒有使用這些外鍵累從子表中選擇數據 。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。