【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程序员面试笔试宝典》,作者:李华荣。