共計 2273 個字符,預計需要花費 6 分鐘才能閱讀完成。
這篇文章主要講解了“數據庫中分區維護 DDL 導致 DML 異常中斷舉例分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“數據庫中分區維護 DDL 導致 DML 異常中斷舉例分析”吧!
今天有同事反饋一個 insert 語句執行時異常中斷,報錯信息是:ERROR at line 1:
ORA-12805: parallel query server died unexpectedly
這個報錯可能的原因很多,沒太多價值,檢查對應時間點的后臺 alert 和 trace 文件,發現有 7445 報錯
ORA-07445: exception encountered: core dump [kdzt_acmp_project()+124] [SIGSEGV] [ADDR:0x0] [PC:0x308DF84] [SI_KERNEL(general_protection)] []
第一反應是遇到 BUG 了,上 MOS 查了下,發現 Bug 24301654 的報錯信息和我這個有點像,貼一部分出來, 除了內存地址不同別的基本相同
Problem Key: ORA-7445 [kdzt_acmp_project()+124]
Error: ORA-7445 [kdzt_acmp_project()+124] [SIGSEGV] [ADDR:0x0] [PC:0x2DB1BB0]
[SI_KERNEL(general_protection)] [] [] [] [] [] [] []
但看了下 SR 的回復 - Bug 21097914 is similar, but CT s case doesn t have = rowid predicates. 我這個語句也沒用到 rowid 范圍掃,又看了下 trace 文件,看到一些類似如下的內容
true _is_lock_table_for_ddl_wait_lock= 1
true _is_lock_table_for_ddl_wait_lock= 1
true _is_lock_table_for_ddl_wait_lock= 1
true _is_lock_table_for_ddl_wait_lock= 1
true _is_lock_table_for_ddl_wait_lock= 1
true _is_lock_table_for_ddl_wait_lock= 1
true _is_lock_table_for_ddl_wait_lock= 1
true _is_lock_table_for_ddl_wait_lock= 1
true _is_lock_table_for_ddl_wait_lock= 1
true _is_lock_table_for_ddl_wait_lock= 1
true _is_lock_table_for_ddl_wait_lock= 1
true _is_lock_table_for_ddl_wait_lock= 1
遂懷疑是當時該表或分區有 DDL 操作導致,INSERT 的目標表是分區表,并且每個小時都會有分區維護操作,檢查對應時間點前后的分區維護日志,看到時間確實有重合的地方,又看了一下當時的等待事件,
library cache lock 65
library cache: mutex X 23
平時這個等待事件很低,這里確實比平時高了
于是做了一下測試:
1. 新建一個測試分區表,并建立少量相同命名的分區
2.A 窗口執行當時的 insert 語句
3. 很快在另個窗口(B 窗口) 執行分區維護語句,包括 1 個 add partition,1 個 truncate partition 和 1 個 drop partition 操作
4. 如預期一樣,A 窗口出現了
insert /*+APPEND */ into xxxxx PARTITION(xxxxxxx) NOLOGGING
*
ERROR at line 1:
ORA-12805: parallel query server died unexpectedly
然后在 A 窗口執行一段時間后再執行分區維護語句,發現 A 窗口是可以正常執行結束的,之后又試了將 3 個分區維護命令分開操作,對 A 窗口的語句也不會有影響,結合以上情況個人判斷是:
當 DML sql 語句還處于解析階段時 (該語句很長,并包含大量的聚合函數):
如果發起耗時稍長的 DDL 語句,會導致解析失敗并報錯,
如果解析結束再執行 DDL,就不會導致 DML 語句中斷,
如果 DDL 時間很短,也可以完成解析并正常執行 DML
本來還想做個 trace,時間有限就不繼續研究了,先提醒研發盡量先執行分區維護再執行 DML(都放在同個存儲過程里),應該就可以避免這個問題了,之前還遇到很多 ORA-07445 都是 BUG 導致,難得遇到一個應該不是 BUG 的 07445,感覺值得記錄一下
180507update:
最后 ORACLE 原廠的結論是命中了 BUG 21097914,打對應 patch 或升級到 12.1.0.2.170418 之后的版本均可修復
感謝各位的閱讀,以上就是“數據庫中分區維護 DDL 導致 DML 異常中斷舉例分析”的內容了,經過本文的學習后,相信大家對數據庫中分區維護 DDL 導致 DML 異常中斷舉例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!