爲ORACLE11G 數據庫監控做了一個告警日誌查詢的腳本:
select *
from (WITH diag_alert_ext AS (SELECT ORIGINATING_TIMESTAMP,
MESSAGE_TEXT,
component_id,
case
when MESSAGE_TEXT LIKE '%Error%' OR
MESSAGE_TEXT LIKE '%Fail%' OR
MESSAGE_TEXT LIKE '%WARNING%' OR
MESSAGE_TEXT LIKE '%Invalid%' OR
MESSAGE_TEXT LIKE '%ORA-%' OR
MESSAGE_TEXT LIKE
'%Global Enqueue Services%' OR
MESSAGE_TEXT LIKE '%dead%' then
1
else
0
end error_occured
FROM v$diag_alert_ext
WHERE ORIGINATING_TIMESTAMP >
SYSTIMESTAMP - INTERVAL '1'
DAY
and component_id = 'rdbms')
SELECT ORIGINATING_TIMESTAMP,
MESSAGE_TEXT,
lag(MESSAGE_TEXT, 3) over(order by ORIGINATING_TIMESTAMP desc),
lag(MESSAGE_TEXT, 2) over(order by ORIGINATING_TIMESTAMP desc),
lag(MESSAGE_TEXT, 1) over(order by ORIGINATING_TIMESTAMP desc),
lead(MESSAGE_TEXT, 1) over(order by ORIGINATING_TIMESTAMP desc),
lead(MESSAGE_TEXT, 2) over(order by ORIGINATING_TIMESTAMP desc),
lead(MESSAGE_TEXT, 3) over(order by ORIGINATING_TIMESTAMP desc),
component_id,
error_occured
FROM diag_alert_ext order by ORIGINATING_TIMESTAMP )
where error_occured = 1
這個腳本可以查詢Oracle alert log中一些報錯信息,使用了窗口函數lag和lead,可以查看某條錯誤日誌的,前3條信息和後3條信息。
在我對我的備庫進行查詢的時候發現了一個,奇怪的現象:我發現查出的日誌不對,不是我連接到的數據庫的日誌。再仔細查看,原來查看的是另外一個實例的日誌。
這裏我交代一下背景,備庫是兩個生產庫的備庫,使用的是同一臺機器,分別使用不同的實例。通過我進一步分析,發現 v$diag_alert_ext可以顯示所有實例的相關日誌。裏面會記錄日誌文件名
那如果我要區分是什麼數據庫的日誌呢,可以根據ADR_HOME字段,或者上面的Filename來區分