久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

數據庫中分區維護DDL導致DML異常中斷舉例分析

185次閱讀
沒有評論

共計 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 小編將為大家推送更多相關知識點的文章,歡迎關注!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-19發表,共計2273字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 邵阳市| 武陟县| 扎鲁特旗| 嵊州市| 吉水县| 霞浦县| 东至县| 涡阳县| 望谟县| 晋城| 绿春县| 西宁市| 甘孜| 阳朔县| 甘洛县| 昭平县| 深州市| 襄樊市| 峨边| 集安市| 十堰市| 毕节市| 庄河市| 渭南市| 姚安县| 霍州市| 瑞安市| 江西省| 景德镇市| 咸丰县| 茂名市| 怀化市| 台安县| 高雄市| 西贡区| 洛川县| 信丰县| 元氏县| 石嘴山市| 屯门区| 五河县|