Oracle資料庫出現WARNING: too many parse errors告警的分析思路

来源:https://www.cnblogs.com/kerrycode/p/18152970
-Advertisement-
Play Games

Oracle資料庫的告警日誌中出WARNING: too many parse errors這些告警信息的話,如果遇到這個問題,我們應該如何分析呢? 下麵簡單聊一下如何分析這個錯誤。該告警信息其實是12.2版本中的一個特性增強。在以前的Oracle版本中,資料庫出現瞭解析錯誤時,資料庫的alert日 ...


Oracle資料庫的告警日誌中出WARNING: too many parse errors這些告警信息的話,如果遇到這個問題,我們應該如何分析呢?

下麵簡單聊一下如何分析這個錯誤。該告警信息其實是12.2版本中的一個特性增強。在以前的Oracle版本中,資料庫出現瞭解析錯誤時,資料庫的alert日誌中不會有任何相關的提示,我們一般只能通過AWR報告才能瞭解資料庫出現瞭解析錯誤,例如,從"failed parse elapsed time" 和"parse count(failures)"指標中查看解析出錯信息,如下截圖所示:

.....................

如果資料庫中解析錯誤的次數非常頻繁時,可能會造成大量的Library Cache Lock等待,整個資料庫可能會處於hang死的狀態。要找出解析錯誤的root cause,則需要在資料庫中設置10035 event,如果再次出現解析錯誤時,會向資料庫的alert日誌中寫入解析錯誤的詳細信息。

ALTER SYSTEM SET EVENTS '10035 trace name context forever, level 1';
ALTER SESSION SET EVENTS '10035 trace name context forever, level 1';
EVENT="10035 trace name context forever, level 1"

Levels:
level 1+ Print out failed parses of SQL statements to

Note:
The event can be turned off as follows:

ALTER SYSTEM SET EVENTS '10035 trace name context off';
ALTER SESSION SET EVENTS '10035 trace name context off';

而從12.2版本開始,即使未設置10035 event,當資料庫出現解析錯誤的情況時,仍然會向資料庫的alert日誌中寫入一條解析錯誤的告警信息。

如下所示,你可能會看到類似這樣的報錯信息:

2024-04-18T00:26:00.288821+08:00
*******(3):WARNING: too many parse errors, count=592 SQL hash=0xd4b65b68
*******(3):PARSE ERROR: ospid=969851, error=903 for statement: 
*******(3):Additional information: hd=0x1c6a4c5b80 phd=0x1f598d0500 flg=0x28 cisid=290 sid=290 ciuid=290 uid=290 sqlid=9mj0cyvabcqv8
*******(3):...Current username=***
*******(3):...Application: IgniteMonitor Action: 

這裡比較關鍵的信息是第二行錯誤信息的錯誤代碼:"PARSE ERROR: ospid=969851, error=903 for statement",這個例子中,它提示SQL解析出錯是因為遇到了ORA-903這個錯誤

$ oerr ora 903
00903, 00000, "invalid table name"
// *Cause:     A table or cluster name was invalid or does not exist.
//             This message was also issued if an invalid cluster name or no
//             cluster name was specified in an ALTER CLUSTER or DROP CLUSTER
//             statement.
// *Action:    Check spelling. A valid table name or cluster name
//             must begin with a letter and may contain only alphanumeric
//             characters and the special characters $, _, and #. The name
//             must be less than or equal to 30 characters and cannot be a
//             reserved word.

我們可以嘗試通過SQL_ID找到對應的SQL,但是有時候,可能通過SQL_ID可能已無法找到SQL語句,只能等到下一次出現時及時定位。

SELECT c.username,
      ,a.program
      ,b.sql_text
      ,b.command_type
      ,a.sample_time
FROM dba_hist_active_sess_history a
JOIN dba_hist_sqltext b
ON a.sql_id = b.sql_id
JOIN dba_users c
ON a.user_id = c.user_id
WHERE a.sample_time BETWEEN SYSDATE - 1 AND SYSDATE
and a.sql_id='9mj0cyvabcqv8'
ORDER BY a.sample_time DESC;

這裡如果可以找出具體SQL語句,就可以找出SQL解析出錯的原因,跟開發人員一起修複這個問題,像官方文檔Doc ID 2649163.1[1]中提及的案例中

2020-01-07T11:35:33.918516+10:30
WARNING: too many parse errors, count=1091700 SQL hash=0xbbcb647d
PARSE ERROR: ospid=33376, error=923 for statement:
2020-01-07T11:35:33.918632+10:30
select 1
Additional information: hd=0xb336ab08 phd=0xb336af30 flg=0x28 cisid=120 sid=120 ciuid=120 uid=120
2020-01-07T11:39:04.673714+10:30
WARNING: too many parse errors, count=1091800 SQL hash=0xbbcb647d
PARSE ERROR: ospid=38578, error=923 for statement:sdkjfdsfkjsadfkjsadfkj
2020-01-07T11:39:04.673839+10:30
select 1

出現這個錯誤,是因為應用程式中輸入的SQL不完整,沒有from關鍵字,從錯誤代碼error=923也能看出出錯的可能性。如下所示:

$ oerr ora 923
00923, 00000, "FROM keyword not found where expected"
// *Cause:     In a SELECT or REVOKE statement, the keyword FROM was
//             either missing, misplaced, or misspelled. The keyword FROM
//             must follow the last selected item in a SELECT statement or
//             the privileges in a REVOKE statement.
// *Action:    Correct the syntax. Insert the keyword FROM where
//             appropriate. The SELECT list itself also may be in error. If
//             quotation marks were used in an alias, check that double
//             quotation marks enclose the alias. Also, check to see if a
//             reserved word was used as an alias.

還有一些bug會引起WARNING: too many parse errors,此時就必須在Oracle metalink上進行搜索,仔細匹配了。例如Doc ID 2976229.1 [2]。它的現象是Oracle DG的備庫中一直出現"WARNING: too many parse errors",而且資料庫版本為Oracle Database - Enterprise Edition - Version 19.3.0.0.0 to 19.21.0.0.0

2023-09-04T13:19:41.797929+00:00

WARNING: too many parse errors, count=13900 SQL hash=0x0cd5bf3b

PARSE ERROR: ospid=15822, error=1219 for statement:

2023-09-04T13:19:41.798049+00:00

select count(*) from cdb_service$

Additional information: hd=0x6cbc40d0 phd=0x6cbc4828 flg=0x20 cisid=0 sid=0

ciuid=2147483620 uid=2147483620 sqlid=<SQL ID>

...Current username=SYSRAC

...Application: oraagent.bin@<HOSTNAME> (TNS V1-V3) Action:

WARNING: too many parse errors, count=13900 SQL hash=0xeb8d02bf

PARSE ERROR: ospid=15822, error=1219 for statement

引起這個的原因是Bug,官方描述如下

The issue is analyzed and discussed in internal / unpublished Bug 34046765 - ORAAGENT DAGENT::SETCONNECTIONPOOLMAX GENERATES TOO MANY PARSE ERRORS ON STANDBY DATABASE

另外,最重要的就是監控資料庫的alert日誌,一旦出現這類告警就必鬚髮出告警郵件或告警提示。以前我們監控資料庫的alert日誌,一般是過濾ORA-這類關鍵字,而這樣過濾的話,是無法獲取WARNING這類的告警信息的。所以監控腳本過濾關鍵字時,必須增加WARNING這個關鍵字信息。

參考資料

[1]

1: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=510335864406137&id=2649163.1&_afrWindowMode=0&_adf.ctrl-state=im4fw4kqq_78

[2]

2: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=510414734632502&id=2976229.1&_afrWindowMode=0&_adf.ctrl-state=im4fw4kqq_127

掃描上面二維碼關註我 如果你真心覺得文章寫得不錯,而且對你有所幫助,那就不妨幫忙“推薦"一下,您的“推薦”和”打賞“將是我最大的寫作動力! 本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 近日,以“Data+AI,構建新質生產力”為主題的袋鼠雲春季發佈會圓滿落幕,大會帶來了一系列“+AI”的數字化產品與最新行業沉澱,旨在將數據與AI緊密結合,打破傳統的生產力邊界,賦能企業實現更高質量、更高效率的數字化發展。會上,袋鼠雲業務總經理申杭帶來了以“指標+AI:邁向智能化,讓指標應用更高效” ...
  • 本文介紹基於Microsoft SQL Server軟體,實現資料庫創建、分離、附加、刪除與備份的方法。 目錄1 互動式創建資料庫2 Transact-SQL指定參數創建資料庫3 互動式分離資料庫testbase14 使用系統存儲過程分離資料庫testbase25 資料庫文件備份:分離資料庫再複製其 ...
  • 今天我們就從GaussDB SQL引擎入手,瞭解一下GaussDB SQL 查詢語句的執行過程,包括GaussDB SQL引擎原理和關鍵技術點。 ...
  • 由福州軟體園科技創新發展公司和華為技術有限公司聯合主辦的HCDG城市行福州站——“企業創新新引擎”資料庫專項賦能會在福州軟體園成功舉辦。 ...
  • 相關知識點: INNODB_STATS_PERSIST=ON或用STATS_PERSIST=1定義單個表時,優化器統計信息將持久化到磁碟。預設情況下,innodb_stats_persistent是啟用的。 持久統計信息存儲在mysql.innodb_table_stats和mysql.innodb ...
  • 轉載自小蝦米0.0 導讀:隨著Kubernetes的普及和發展,越來越多的企業和團隊開始使用Kubernetes來管理和部署應用程式。然而,Kubernetes的預設工作方式可能不是最佳的選擇,尤其是在需要更高效、更可靠的應用程式部署和管理能力時。因此,SeaTunnel提供了一種運行Zeta引擎( ...
  • 轉載自第一片心意 1 前言 由於海豚調度器官網的集群部署文檔寫的較亂,安裝過程中需要跳轉到很多地方進行操作,所以自己總結了一篇可以直接跟著從頭到尾進行操作的文檔,以方便後續的部署、升級、新增節點、減少節點的相關操作。 2. 提前準備 2.1. 基礎組件 JDK:下載JDK (1.8+),安裝並配置 ...
  • cls_oracle_logs.sh腳本的輸出日誌中有TNS-12508錯誤,具體如下所示 ........................................................................LSNRCTL> Current Listener is gsp ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...