【DB笔试面试536】在Oracle中,Oracle 10g和11g告警日志文件的位置在哪里?

  • 2019 年 10 月 10 日
  • 筆記

题目部分

在Oracle中,Oracle 10g和11g告警日志文件的位置在哪里?

答案部分

作为一名DBA,必须知道告警日志是什么,在何处。实时的监控数据库的告警日志是必须进行的工作。监控并且根据不同的告警级别,通过邮件或短信发送告警信息给DBA,这可以帮助DBA及时了解数据库的变化与异常,及时响应并介入处理。

告警日志文件有2种类型,一种是纯文本格式的,另外一种是xml文件格式的,平时查看最多地是纯文本格式的告警日志。告警日志的内容包含:消息和错误的类型、ORA-600内部错误、ORA-1578块损坏错误、ORA-12012作业队列错误、实例启动关闭,恢复等信息、特定的DDL命令、影响表空间,数据文件及回滚段的命令、可持续的命令被挂起、LGWR不能写入到日志文件、归档进程启动信息、调度进程的相关信息和动态参数的修改信息等。

无论是Oracle 10g还是11g,其告警日志的位置都可以由参数BACKGROUND_DUMP_DEST来查询,只不过在Oracle 11g中位置有所变化。在Oracle 10g中,告警日志一般在$ORACLE_BASE/admin/$ORACLE_SID/bdump目录下:

SYS@lhrdb> SHOW PARAMETER BACKGROUND_DUMP_DEST  NAME                                 TYPE        VALUE  ------------------------------------ ----------- ------------------------------  background_dump_dest                 string      /u01/app/oracle/admin/lhrdb/bdump

在Oracle 11g中,告警日志一般在$ORACLE_BASE/diag/rdbms/$DBNAME/$ORACLE_SID/trace目录下

SYS@lhrdb> SHOW PARAMETER BACKGROUND_DUMP_DEST    NAME                                 TYPE                   VALUE  ------------------------------------ ---------------------- ------------------------------  background_dump_dest                 string                 /oracle/app/oracle/diag/rdbms/lhrdb/lhrdb/trace  [ZFZHLHRDB1:oracle]:/oracle>cd /oracle/app/oracle/diag/rdbms/lhrdb/lhrdb/trace  [ZFZHLHRDB1:oracle]:/oracle/app/oracle/diag/rdbms/lhrdb/lhrdb/trace>ls -l alert*  -rw-r-----    1 oracle   asmadmin   13852942 Oct 17 13:22 alert_lhrdb.log  

从Oracle 12.1.0.1开始,参数BACKGROUND_DUMP_DEST已废弃,告警日志的位置应该由以下SQL来查询

SQL> SELECT d.VALUE FROM V$DIAG_INFO d WHERE d.NAME='Diag Trace';  VALUE  ---------------------------------------------------------  /u01/app/oracle/diag/rdbms/lhrdb/lhrdb/trace  

需要注意的是,该SQL也适用于Oracle 11g的版本。

由于告警日志按时间的先后顺序不断累积存储,久而久之,势必造成告警日志的过大,难以维护,查找相关的信息也不方便。另外,若告警日志超大,也会严重影响系统的性能。这里提供3种办法来管理告警日志:①使用外部表方式来管理告警日志将大大简化维护工作量,也可以更直关的获取所需的信息。②视图V$DIAG_ALERT_EXT对应的基表里存储了告警日志的内容,可以根据该视图将告警日志的内容存储在历史表中。③利用SHELL脚本定时将告警日志进行备份,防止告警日志过大而影响系统性能。

1.外部表管理告警日志的脚本如下所示:

drop directory DIR_ALERT;  create directory DIR_ALERT as '/u01/app/oracle/diag/rdbms/orclasm/orclasm/trace';    drop table alert_log;  create table alert_log(    text varchar2(500)    )organization external    (type oracle_loader    default directory DIR_ALERT    access parameters    (records delimited by newline    )location('alert_orclasm.log')    ) reject  limit  unlimited;    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-%');      --2.利用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;  /  

3.利用SHELL脚本定时将告警日志进行备份

利用Linux下的crontab设置每周日早上凌晨归档一次告警日志:

[oracle@rhel6lhr ~]$ crontab -l  2 12 * * 1 /home/oracle/lhr/alert_log_archive.sh  [oracle@rhel6lhr ~]$ more /home/oracle/lhr/alert_log_archive.sh  #*************************************************************************  #  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    

& 说明:

有关告警日志的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-1221559/

本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。