Oracle的告警日志之v$diag_alert_ext视图

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Oracle的告警日志之v$diag_alert_ext视图   最近由于自己写的一个job老是报错,找不出来原因,数据库linux的terminal由于安全原因不让连接,因此告警日志就没有办法阅读,没有办法就想想其它的办法吧,比如采用外部表的形式来阅读告警日志就是一个不错的办法。

Oracle的告警日志之v$diag_alert_ext视图

 

最近由于自己写的一个job老是报错,找不出来原因,数据库linux的terminal由于安全原因不让连接,因此告警日志就没有办法阅读,没有办法就想想其它的办法吧,比如采用外部表的形式来阅读告警日志就是一个不错的办法。

告警日志的重要性就不多说了。。。。

  1. 实验环境

本次所有的实验环境是Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production,10g的话应该很多是类似的,就不去研究那个了。。。。。

 

C:\Users\Administrator>sqlplus lhr/lhr@orclasm

 

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 7月 17 14:34:47 2014

 

Copyright (c) 1982, 2010, Oracle. All rights reserved.

 

 

连接到:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, Automatic Storage Management, OLAP, Data Mining

and Real Application Testing options

 

SQL> select * from v$version;

 

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

PL/SQL Release 11.2.0.3.0 - Production

CORE 11.2.0.3.0 Production

TNS for Linux: Version 11.2.0.3.0 - Production

NLSRTL Version 11.2.0.3.0 - Production

 

SQL>

 

  1. ADR目录

Automatic Diagnostic Repository (ADR)

一个存放数据库诊断日志、跟踪文件的目录,称作ADR base,对应初始化参数DIAGNOSTIC_DEST,如果设置了ORACLE_BASE环境变量,DIAGNOSTIC_DEST等于 ORACLE_BASE,如果没有设置ORACLE_BASE,则等与ORACLE_HOME/log。SQL> show parameter DIAGNOSTICNAME TYPE VALUE------------------------------------ ----------- ------------------------------diagnostic_dest string /oracle/oracle

 

关于ADR这里不多说了,网上一百度一大堆。。。。。。。

  1. 告警文件的路径

首先,告警日志文件有2种类型,一个是纯文本格式的,另外一种是xml文件格式的,不管哪个版本都可以用这个参数得到纯文本格式告警日志的路径:

SQL> show parameter background_dump_dest

 

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

background_dump_dest string /u01/app/oracle/diag/rdbms/orc

lasm/orclasm/trace

SQL>

 

文本格式的日志还可以通过这个视图来查询:

select value from v$diag_info where name='Diag Trace';

 

 

还有xml格式的告警日志文件在:

SQL> select value from v$diag_info where name='Diag Alert';

 

VALUE

--------------------------------------------------------------------------------

/u01/app/oracle/diag/rdbms/orclasm/orclasm/alert

 

SQL>

 

 

/u01/app/oracle/diag/rdbms/orclasm/orclasm/alert/log.xml

 

  1. 告警日志的内容

 

  • 消息和错误的类型(Types of messages and errors)
  • ORA-600内部错误(ORA-600 internal errors that need immediate support from Oracle's customer support )'
  • ORA-1578块损坏错误(ORA-1578 block corruption errors that require recovery)
  • ORA-12012(作业队列错误(ORA-12012 job queue errors)
  • 实例启动关闭,恢复等信息(STARTUP & SHUTDOWN, and RECOVER statement execution messages)
  • 特定的DDL命令(Certain CREATE, ALTER, & DROP statements )
  • 影响表空间,数据文件及回滚段的命令(Statements that effect TABLESPACES, DATAFILES, and ROLLBACK SEGMENTS )
  • 可持续的命令被挂起(When a resumable statement is suspended )
  • LGWR不能写入到日志文件(When log writer (LGWR) cannot write to a member of a group )
  • 归档进程启动信息(When new Archiver Process (ARCn) is started )
  • 调度进程的相关信息(Dispatcher information)
  • 动态参数的修改信息(The occurrence of someone changing a dynamic parameter)

 

 

  1. 使用外部表查看oracle报警日志

关于外部表的使用网上一搜又是一大堆,这里不列举起语法了,直接到使用层次吧。。。。。

 

  1. 先来个最简单的使用方法

 

SQL> drop directory DIR_ALERT;

 

目录已删除。

 

SQL> create directory DIR_ALERT as '/u01/app/oracle/diag/rdbms/orclasm/orclasm/trace';

 

目录已创建。

 

SQL>

SQL>

SQL> drop table alert_log;

 

表已删除。

 

SQL> create table alert_log(

2   text varchar2(500)

3   )organization external

4   (type oracle_loader

5   default directory DIR_ALERT

6   access parameters

7   (records delimited by newline

8   )location('alert_orclasm.log')

9   ) reject limit unlimited;

 

表已创建。

 

SQL>

 

查看ora错误:

select * from alert_log where text like 'ORA-%';

-------查看最新的10条告警日志记录

select * from (

select rownum rn,a.text from alert_log a) b where b.rn>=(select count(1)-10 from alert_log a);

 

 

-------查看最新的10条ora告警日志记录

SELECT *

FROM (SELECT rownum rn,

a.text

FROM alert_log a

WHERE a.text LIKE 'ORA-%') b

WHERE b.rn >=

(SELECT COUNT(1) - 10 FROM alert_log a WHERE a.text LIKE 'ORA-%');

以上代码细心的网友可能会发现一个缺点,我不能查看历史某一时间段内的告警日志,或者说查看历史某一时间段内的告警日志很困难。。。。别急,,,,哥还有办法的。。。。。以下给出另一段代码,这段代码可以把历史告警日志做了格式化处理,采用了分区表的形式,我不运行了,直接贴代码了:

  1. 再来个稍微复杂点的

 

------创建表xb_alert_log_lhr用于存放告警日志的历史信息

-- drop table xb_alert_log_lhr;

        create table xb_alert_log_lhr (

        id number primary key,

                alert_date date,

                alert_text varchar2(500)

        ) nologging

        partition by range(alert_date)

interval(numtoyminterval(1,'month'))

(partition P201406 VALUES LESS THAN(TO_DATE('201407','YYYYMM')));

                      

        create sequence s_xb_alert_log_lhr ;

        create index alert_log_idx on xb_alert_log_lhr(alert_date) local nologging ; --为表alert_log创建索引

 

        column db new_value _DB noprint;

         column bdump new_value _bdump noprint;

         select instance_name db from v$instance; --获得实例名以及告警日志路径

         select value bdump from v$parameter

             where name ='background_dump_dest';

                          

                        

-- drop directory DIR_ALERT_LHR;

         create directory DIR_ALERT_LHR as '/u01/app/oracle/diag/rdbms/orclasm/orclasm/trace';

 

--                 drop table xb_alert_log_disk_lhr;

         create table xb_alert_log_disk_lhr ( text varchar2(500) ) --创建外部表

         organization external (

            type oracle_loader

            default directory DIR_ALERT_LHR

                     access parameters (

                                records delimited by newline nologfile nobadfile

                     )

            location('alert_orclasm.log')

         ) reject limit unlimited;

 

 

CREATE OR REPLACE PROCEDURE pro_alert_log_lhr AS

isdate NUMBER := 0;

start_updating NUMBER := 0;

v_rows_inserted NUMBER := 0;

v_alert_date DATE;

v_max_date DATE;

v_alert_text xb_alert_log_disk_lhr.text%TYPE;

BEGIN

EXECUTE IMMEDIATE 'alter session set NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS''';

EXECUTE IMMEDIATE 'alter session set nls_date_language=''american''';

 

/* find a starting date */

SELECT MAX(v_alert_date) INTO v_max_date FROM xb_alert_log_lhr;

IF (v_max_date IS NULL) THEN

v_max_date := to_date('01-01-1980', 'dd-mm-yyyy');

END IF;

 

--使用for循环从告警日志过滤信息

FOR cur IN (SELECT *

FROM xb_alert_log_disk_lhr

) LOOP

 

isdate := 0;

v_alert_text := NULL;

 

SELECT COUNT(*)

INTO isdate --设定标志位,用于判断该行是否为时间数据

FROM dual

WHERE substr(cur.text, 21) IN

('2009', '2010', '2011', '2012', '2013', '2014', '2015') ---Sat Jun 14 23:22:14 2014

AND length(cur.text) = 24;

 

IF (isdate = 1) THEN

--将时间数据格式化

SELECT to_date(substr(cur.text, 5), 'Mon dd hh24:mi:ss rrrr')

INTO v_alert_date

FROM dual;

IF (v_alert_date > v_max_date) THEN

--设定标志位用于判断是否需要update

start_updating := 1;

END IF;

ELSE

v_alert_text := cur.text;

END IF;

 

IF (v_alert_text IS NOT NULL) AND (start_updating = 1) THEN

--start_updating标志位与v_alert_text为真,插入记录

INSERT INTO xb_alert_log_lhr nologging

(id, alert_date, alert_text)

VALUES

(s_xb_alert_log_lhr.nextval, v_alert_date, v_alert_text);

v_rows_inserted := v_rows_inserted + 1;

COMMIT;

END IF;

END LOOP;

sys.dbms_output.put_line('Inserting after date ' ||

to_char(v_max_date, 'YYYY-MM-DD HH24:MI:SS'));

sys.dbms_output.put_line('Rows Inserted: ' || v_rows_inserted);

COMMIT;

END pro_alert_log_lhr;

/

 

执行存过:

begin

 

pro_alert_log_lhr;

end;

 

 

执行结束后大家可以查看,格式化之后的表:

 

select * from xb_alert_log_disk_lhr    ;    

select * from xb_alert_log_lhr partition(SYS_P381) a where a.id>=834180 order by a.id;    

select * from xb_alert_log_lhr partition(SYS_P381) a where a.alert_text like '%ORA%' ;

虽然可以采用了分区表存储了历史告警日志,也有索引可用,但是存过有个缺点,每次都会对外部表全部扫描,这个有点慢。。。。。

 

  1. 自己用的(本篇的重点)

主要采用v$diag_alert_ext 视图中的内容,因为这个视图中的内容很全,记录到历史表中,利于我们分析。

-------------------------------------------------历史告警日志记录

---drop table XB_ALERTLOG_ALL_LHR ;

create table XB_ALERTLOG_ALL_LHR

(

ID NUMBER primary key,

alert_date date,

message_text VARCHAR2(3000),

message_type NUMBER,

message_level NUMBER,

message_id VARCHAR2(67),

message_group VARCHAR2(67),

detailed_location VARCHAR2(163),

problem_key VARCHAR2(67),

record_id NUMBER,

organization_id VARCHAR2(67),

component_id VARCHAR2(67),

host_id VARCHAR2(67),

host_address VARCHAR2(49),

client_id VARCHAR2(67),

module_id VARCHAR2(67),

process_id VARCHAR2(35)

) nologging

partition by range(alert_date)

interval(numtoyminterval(1,'month'))

(partition P201406 VALUES LESS THAN(TO_DATE('201407','YYYYMM')));

 

--drop SEQUENCE S_XB_SQL_MONITOR_LHR;

CREATE SEQUENCE S_XB_ALERTLOG_ALL_LHR START WITH 1 INCREMENT BY 1 cache 20;

 

create index ind_ALERTLOG_ALL_In_Date on XB_ALERTLOG_ALL_LHR(ALERT_DATE,Record_Id) local nologging;

 

 

---------记录历史告警日志

CREATE PROCEDURE p_alert_log_lhr AS

 

v_max_recordid NUMBER;

v_max_date DATE;

 

BEGIN

 

SELECT MAX(a.record_id),

MAX(a.alert_date)

INTO v_max_recordid,

v_max_date

FROM XB_ALERTLOG_ALL_LHR a

WHERE a.alert_date >= SYSDATE - 360 / 1440 --3h'之前

AND a.alert_date SYSDATE;

 

INSERT INTO XB_ALERTLOG_ALL_LHR nologging

(ID,

ALERT_DATE,

MESSAGE_TEXT,

MESSAGE_TYPE,

MESSAGE_LEVEL,

MESSAGE_ID,

MESSAGE_GROUP,

DETAILED_LOCATION,

PROBLEM_KEY,

RECORD_ID,

ORGANIZATION_ID,

COMPONENT_ID,

HOST_ID,

HOST_ADDRESS,

CLIENT_ID,

MODULE_ID,

PROCESS_ID)

SELECT s_XB_ALERTLOG_ALL_LHR.Nextval,

to_date(to_char(a.ORIGINATING_TIMESTAMP,

'YYYY-MM-DD HH24:MI:SS'),

'YYYY-MM-DD HH24:MI:SS') alert_date,

a.MESSAGE_TEXT,

a.MESSAGE_TYPE,

a.MESSAGE_LEVEL,

a.MESSAGE_ID,

a.MESSAGE_GROUP,

a.DETAILED_LOCATION,

a.PROBLEM_KEY,

a.RECORD_ID,

a.ORGANIZATION_ID,

a.COMPONENT_ID,

a.HOST_ID,

a.HOST_ADDRESS,

a.CLIENT_ID,

a.MODULE_ID,

a.PROCESS_ID

FROM v$diag_alert_ext a

WHERE a.COMPONENT_ID = 'rdbms'

AND a.FILENAME LIKE

'/u01/app/oracle/diag/rdbms/orclasm/orclasm/alert/log.xml%'

AND a.RECORD_ID > v_max_recordid

AND a.ORIGINATING_TIMESTAMP >= v_max_date;

 

COMMIT;

 

END p_alert_log_lhr;

/

定时任务:

 

BEGIN

 

DBMS_SCHEDULER.CREATE_JOB(JOB_NAME => 'job_p_alert_log_lhr',

JOB_TYPE => 'STORED_PROCEDURE',

JOB_ACTION => 'p_alert_log_lhr',

ENABLED => TRUE,

START_DATE => SYSDATE,

comments => '记录历史告警日志,每2个小时执行一次');

 

END;

/

 

 

      

 

 

  1. 归档告警文件

 

归档告警日志文件,每周日早上凌晨归档一次,,,(linux下的crontab如何使用?????百度吧,哥这里不列出了。。。。。。):

 

#*************************************************************************

# FileName :alert_log_archive.sh

#*************************************************************************

# Author :lhr

# CreateDate :2014-07-16

# blogs   :http://blog.itpub.net/26736162

# Description :this script is made the alert log archived every day

# crontab : 2 0 * * 0 /home/oracle/lhr/alert_log_archive.sh ---sunday exec

#*************************************************************************

#! /bin/bash

# these solved the oracle variable problem.

export ORACLE_SID=orclasm

export ORACLE_BASE=/u01/app/oracle

mydate=`date +'%Y%m%d%H%M%S'`

alert_log_path="$ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/"

alert_log_file="alert_$ORACLE_SID.log"

alert_arc_file="alert_$ORACLE_SID.log""."${mydate}

cd ${alert_log_path};

if [ ! -e "${alert_log_file}" ]; then

echo "the alert log didn't exits, please check file path is correct!";

exit;

fi

if [ -e ${alert_arc_file} ];then

echo "the alert log file have been archived!"

else

mv ${alert_log_file} ${alert_arc_file}

cat /dev/null > ${alert_log_file}

fi

  1. 与告警日志有关的视图

 

select * from dba_alert_history a order by a.sequence_id desc ;

select * from dba_alert_arguments;

select * from dba_outstanding_alerts;

 

  1. 列出3个OCP考题

1、Identify the two situations in which you use the alert log file in your database to check the details. (Choose two.)

选项

A.Running aquery on a table returns"ORA-600: Internal Error ."

B.Inserting a value in a table returns"ORA-01722: invalid number ."

C.Creating a table returns"ORA-00955: name is already used by an existing object."

D.Inserting a value in a table returns "ORA-00001: unique constraint (SYS.PK_TECHP)

violated."

E.Inserting a row in a table returns"ORA-00060:deadlock detected while waiting for resource."

Correct Answers: A E

 

 

2、Identify the three predefined server-generated alerts. (Choose three.)

确定三个预定义的服务器生成的警报。

A. Drop User

B. Tablespace Space Usage表空间空间使用率

C. Resumable Session Suspended可恢复会话暂停

D. Recovery Area Low On Free Space自由空间上的恢复区低

E. SYSTEM Tablespace Size Increment

Answer: B,C,D

 

3、Which two statements are true about alerts? (Choose two.) 选项

A.Clearing an alert sends the alert to the alert history .

B.Response actions cannot be specified with server-generated alerts.

C.The nonthreshold alerts appear in the DBA_OUTSTANDING_ALERTS view .

D.Server-generated alerts notify the problems that cannot be resolved automatically and require administrators to be notified.

Correct Answers: A D

  1. 列出官网的一些内容

Alerts help you monitor your database. Most alerts notify you of when particular metric thresholds are exceeded. For each alert, you can set critical and warning threshold values. These threshold values are meant to be boundary values that when exceeded, indicate that the system is in an undesirable state. For example, when a tablespace becomes 97 percent full, this can be considered undesirable, and Oracle Database generates a critical alert.

Other alerts correspond to database events such as Snapshot Too Old or Resumable Session suspended. These types of alerts indicate that the event has occurred.

In addition to notification, you can set alerts to perform some action such as running a script. For instance, scripts that shrink tablespace objects can be useful for a Tablespace Usage warning alert.

By default, Oracle Database issues several alerts, including the following:

  • Archive Area Used (warning at 80 percent full)
  • Broken Job Count and Failed Job Count (warning when goes above 0)
  • Current Open Cursors Count (warning when goes above 1200)
  • Dump Area Used (warning at 95 percent full)
  • Session Limit Usage (warning at 90 percent, critical at 97 percent)
  • Tablespace Space Used (warning at 85 percent full, critical at 97 percent full)
  • You can modify these alerts and others by setting their metrics

 

The alert log is an XML file that is a chronological log of database messages and errors. It is stored in the ADR and includes messages about the following:

  • Critical errors (incidents)
  • Administrative operations, such as starting up or shutting down the database, recovering the database, creating or dropping a tablespace, and others.
  • Errors during automatic refresh of a materialized view
  • Other database events

You can view the alert log in text format (with the XML tags stripped) with Enterprise Manager and with the ADRCI utility. There is also a text-formatted version of the alert log stored in the ADR for backward compatibility. However, Oracle recommends that any parsing of the alert log contents be done with the XML-formatted version, because the text format is unstructured and may change from release to release.

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
监控 Oracle 关系型数据库
Mysql、Oracle审计日志的开启
通过上述步骤,可以在 MySQL 和 Oracle 数据库中启用和配置审计日志。这些日志对于监控数据库操作、提高安全性和满足合规性要求非常重要。确保正确配置审计参数和策略,定期查看和分析审计日志,有助于及时发现并处理潜在的安全问题。
98 11
|
4月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
130 1
【赵渝强老师】Oracle的控制文件与归档日志文件
|
4月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
124 1
|
4月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
7月前
|
SQL Oracle 关系型数据库
"揭秘!一键解锁Oracle日志清理魔法,让海量归档日志无处遁形,守护数据库健康,告别磁盘空间告急噩梦!"
【8月更文挑战第9天】随着Oracle数据库在企业应用中的普及,归档日志管理对保持数据库健康至关重要。归档日志记录所有更改,对数据恢复极为重要,但也可能迅速占用大量磁盘空间影响性能。利用Oracle提供的RMAN工具,可通过编写Shell脚本来自动清理归档日志。脚本包括设置环境变量、连接数据库、检查和删除指定时间前的日志,并记录执行情况。通过Cron作业定时运行脚本,可有效管理日志文件,确保数据库稳定运行。
183 7
|
7月前
|
SQL 监控 Oracle
Oracle数据误删不用怕,跟我来学日志挖掘
Oracle数据误删不用怕,跟我来学日志挖掘
150 0
|
24天前
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
29 5
图解MySQL【日志】——Redo Log
|
4月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
1227 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
3月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
1月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
121 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log

推荐镜像

更多