事務槽引起的 ORA-600 事件
問題描述
執行 update 時出現告警:
ORA-00600: 內部錯誤程式碼, 引數: [4521], [11], [18446744073606860068], [11], [399824003], [18446744073709551615], [18446744073709551615], [], [], [], [], []
問題資訊獲取
一般ORA-600的錯誤都會在後臺進行記錄,下面是我們找到的記錄內容
根據記錄內容,我們可以獲取到相應的trace檔案,仔細檢視可知如下資訊
-
異常語句(紅色遮住的部分為語句,由於涉及的客戶語句,且與本部落格無關,所以此處不顯示)
-
涉及到的函式
-
ERROR的原因
-
ITL 槽被佔用了 24 個
-
產生了大量的行鎖
問題分析
相關概念
ITL描述
ITL(Interested Transaction List) 是 Oracle 資料塊內部的一個組成部分,位於資料塊頭(block header),itl 由 xid,uba,flag,lck 和 scn/fsc 組成,用來記錄該塊所有發生的事務,一個 itl 可以看作是一條事務記錄。當然,如果這個事務已經提交,那麼這個 itl 的位置就可以被反覆使用了,因為 itl 類似記錄,所以,有的時候也叫itl槽位。如果一個事務一直沒有提交,那麼,這個事務將一直佔用一個itl槽位,itl裡面記錄了事務資訊,回滾段的入口,事務型別等等。如果這個事務已經提交,那麼,itl 槽位中還儲存的有這個事務提交時候的 SCN 號。
ITL個數其最小值為 1,由引數 initrans 控制(由於相容性的原因,oracle 會在物件的儲存塊分配兩個itl,所以 initrans 的最小值實際上為 2),最大值為 255,由引數 maxtrans 控制,最大值引數在 10g 以後不能被修改,itl 是 block 級的概念,一個 itl 佔用塊 46B 的空間,引數 initrans 意味著塊中除去 block header 外一部分儲存空間無法被記錄使用(46B*initrans),當塊中還有一定的 free space 時,oracle 可以使用 free space 構建 itl 供事務使用,如果沒有了 free space,那麼,這個塊因為不能分配新的 itl,所以就可能發生 itl 等待。
簡述一下事務的流程
-
開始一個事務,首先Oracle給這個事務分配XID,並找到一個回滾段,在回滾段頭塊將事務資訊存放在事務表中,並給這個事務分配undo塊,並將undo塊的地址也寫入事務表中(UBA地址) 。
-
事務準備修改一個資料塊,在該資料塊的頭部的事務槽中寫入事務資訊(XID ,UBA(這個UBA指向相對應的undo塊))。
-
開始修改資料,將資料塊修改的前映像存放在 undo 塊中。
原因分析
根據 mos,比對現象發現
-
版本複合,錯誤一致
-
函式呼叫一致
-
原因則是ITL事務槽滿造成的該事件
解決方案
透過重新建立表或索引並修改 INITRANS 或 PCTFREE 引數來增加表或索引的ITL能力,以便能夠處理更多併發事務。
-
增加INITRANS
-
根據表中事務的數量,我們需要改變初始值。這裡改為 50:
alter table <表名> INITRANS 50;
-
然後使用move重新組織表(alter table move;)
-
然後重新構建這個表的所有索引,如下所示
alter index <索引名> rebuild INITRANS 50;
-
增加 PCTFREE
如果增加 INITRANS 不能解決這個問題,那麼嘗試增加 PCTFREE。增加 PCTFREE 會保留更多的空間,因此將相同數量的行分散到更多的塊上。總的來說,這意味著有更多的 ITL 插槽可用。 -
將行擴充套件到更多的塊中也有助於減少這個等待事件。
alter table <表名> PCTFREE 20
-
然後使用move重新組織表(alter table move;)
-
重建索引
alter index <索引名> rebuild PCTFREE 20
-
增加 INITRANS 和 PCTFREE 的組合
-
將 INITRANS 設定為 50,pct_free 設定為 20
alter table <表名> PCTFREE 20 INITRANS 50
-
使用 move 重新組織表(alter table move;)
-
然後重新構建表的所有索引,如下所示
alter index <index_name> rebuild PCTFREE 20 INITRANS 50;
參考
-
ORA-00600: Internal Error Code, Arguments: [4521] (Doc ID 2648741.1)
-
Troubleshooting waits for 'enq: TX - allocate ITL entry' (Doc ID 1472175.1)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31490526/viewspace-2709933/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- open session in view引起的事務問題SessionView
- 事件與事務事件
- goldengate中長事務引起的問題Go
- Laravel eloquent 的事務與事件Laravel事件
- ITL事務槽記載-01
- 事務註解(@Transactional)引起的資料覆蓋故障
- 未提交事務造成的等待事件事件
- Spring中的事務提交事件Spring事件
- Oracle ITL (Interested Transaction List) - 事務槽OracleREST
- Spring事務事件監控Spring事件
- 事務上的等待事件 —— enq: UL - contention事件ENQ
- 記一次 Redis 的事務引起的訊息佇列報錯Redis佇列
- 技術探究:Apache Pulsar 的事務型事件流Apache事件
- NOSQL儲存的基於事件的事務實現SQL事件
- Redis的KEYS命令引起當機事件Redis事件
- Calvin:分割槽資料庫系統的快速分散式事務資料庫分散式
- DG備庫未啟動SCN 新特性引起ORA-600 2252
- 客戶遭遇ORA-600 [Kjbrchkpkeywait:Timeout]引起例項downAI
- oracle自治事務引起的死鎖Oracle
- 事務、全域性索引、透明分散式,再見,分割槽健!索引分散式
- 由row cache lock等待事件引起的效能問題事件
- 編輯 Java 中的事務 — JDBC 事務和 JTA 事務JavaJDBC
- 資料塊內事務槽不足導致資料塊鎖
- ORACLE 分割槽索引UNUSABLE導致的DML操作失敗引起的血案Oracle索引
- 查詢引起Oracle阻塞事件的源頭語句的方法Oracle事件
- 在 WMB中生成用於事務監控和審計的事件事件
- oracle交換分割槽所引起的索引失效問題探究測試Oracle索引
- Oracle 12.2 BUG :分割槽維護導致的 ORA-600 KKPOFPCD3Oracle
- Redis的事務Redis
- 事務的使用
- 本地事務和分散式事務的區別分散式
- 分散式事務(一)—分散式事務的概念分散式
- 網站執行中最容易引起使用者反感的事件網站事件
- 十、Redis事務、事務鎖Redis
- Spring的事務管理(二)宣告式事務管理Spring
- 資料庫事務以及事務的四個特性資料庫
- Spring事務專題(三)事務的基本概念,Mysql事務處理原理SpringMySql
- 分散式事務之Spring事務與JMS事務(二)分散式Spring