设为首页 收藏本站
查看: 1921|回复: 0

[经验分享] 使用外部表管理Oracle 告警日志

[复制链接]

尚未签到

发表于 2018-9-14 09:02:42 | 显示全部楼层 |阅读模式
  --================================================
  -- 使用外部表管理Oracle 告警日志(ALAERT_$SID.LOG)
  --================================================
  Oracle 告警日志时DBA维护数据库经常需要关注的一部分内容。然而告警日志以文本文件,按时间的先后顺序不断累积的形式来存储,久而
  久之,势必造成告警日志的过大,难于维护和查找相关的信息。使用外表表方式来管理告警日志将大大简化维护工作量,也更直关的获取所需的
  信息。
  有关外部表的使用请参考:Oracle 外部表
  一、告警日志的内容
  消息和错误的类型(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,>  影响表空间,数据文件及回滚段的命令(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.查看后台日志路径
  sys@ORCL> show parameter %b%_dump_dest   --此可以省略,在后面直接用脚本cre_ext_tb.sql 实现
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------------------------------
  background_dump_dest                 string      /u01/oracle/admin/orcl/bdump
  2.创建用户并赋予特定的权限,并创建数据库目录

  sys@ORCL> create user usr1>  2  temporary tablespace temp
  3  default tablespace users
  4  quota unlimited on users;
  sys@ORCL> grant connect,resource to usr1;       --为帐户usr1授予connect,resource角色
  sys@ORCL> grant create any directory to usr1;   --为帐户usr1授予创建目录的权限
  sys@ORCL> conn usr1/usr1                        --使用usr1连接数据库
  3.下面使用脚本来完成对告警日志的跟踪及管理
  脚本描述
  cre_ext_tb.sql
  主要是创建了一个alert_log表用于存放告警日志的重要信息,一个外部表alert_log_disk使得查看告警日志可以直接在本地数据
  库中完成。
  update_alert_log.sql
  用于从外部表将重要信息经过过滤并且将没有存放到alert_log表中的最新信息更新到alert_log表。
  4.使用下面的脚本来创建alert_log表及alert_log_disk外部表
  usr1@ORCL> get /u01/bk/scripts/cre_ext_tb.sql  --查看建表的代码
  1  define alert_length="500"
  2  drop table alert_log;
  3  create table alert_log (                  --创建表alert_log用于存放告警日志的重要信息
  4    alert_date date,
  5    alert_text varchar2(&&alert_length)
  6  )
  7  storage (initial 512k next 512K pctincrease 0);
  8  create index alert_log_idx on alert_log(alert_date)    --为表alert_log创建索引
  9  storage (initial 512k next 512K pctincrease 0);
  10  column db    new_value _DB    noprint;
  11  column bdump new_value _bdump noprint;
  12  select instance_name db from v$instance;               --获得实例名以及告警日志路径
  13  select value bdump from v$parameter
  14   where name ='background_dump_dest';
  15  drop   directory BDUMP;
  16  create directory BDUMP as '&&_bdump';
  17  drop table alert_log_disk;
  18  create table alert_log_disk ( text varchar2(&&alert_length) )    --创建外部表
  19  organization external (
  20    type oracle_loader
  21    default directory BDUMP
  22        access parameters (
  23            records delimited by newline nologfile nobadfile
  24            fields terminated by "&" ltrim
  25        )
  26    location('alert_&&_DB..log')
  27  )
  28* reject limit unlimited;
  usr1@ORCL> start /u01/bk/scripts/cre_ext_tb.sql    --执行建表的代码
  5.使用下面的脚本填充alert_log表
  usr1@ORCL> get /u01/bk/scripts/update_alert_log.sql  --脚本update_alert_log.sql用于将外部表的重要信息填充到alert_log
  1  set serveroutput on
  2  declare
  3    isdate         number := 0;
  4    start_updating number := 0;
  5    rows_inserted  number := 0;
  6    alert_date     date;
  7    max_date       date;
  8    alert_text     alert_log_disk.text%type;
  9  begin
  10    /* find a starting date */
  11    select max(alert_date) into max_date from alert_log;
  12    if (max_date is null) then
  13      max_date := to_date('01-jan-1980', 'dd-mon-yyyy');
  14    end if;
  15    for r in (
  16      select substr(text,1,180) text from alert_log_disk     --使用for循环从告警日志过滤信息
  17       where text not like '%offlining%'
  18         and text not like 'ARC_:%'
  19         and text not like '%LOG_ARCHIVE_DEST_1%'
  20         and text not like '%Thread 1 advanced to log sequence%'
  21         and text not like '%Current log#%seq#%mem#%'
  22         and text not like '%Undo Segment%lined%'
  23         and text not like '%alter tablespace%back%'
  24         and text not like '%Log actively being archived by another process%'
  25         and text not like '%alter database backup controlfile to trace%'
  26         and text not like '%Created Undo Segment%'
  27         and text not like '%started with pid%'
  28         and text not like '%ORA-12012%'
  29         and text not like '%ORA-06512%'
  30         and text not like '%ORA-000060:%'
  31         and text not like '%coalesce%'
  32         and text not like '%Beginning log switch checkpoint up to RBA%'
  33         and text not like '%Completed checkpoint up to RBA%'
  34         and text not like '%specifies an obsolete parameter%'
  35         and text not like '%BEGIN BACKUP%'
  36         and text not like '%END BACKUP%'
  37    )
  38    loop
  39      isdate     := 0;
  40      alert_text := null;
  41      select count(*) into isdate                          --设定标志位,用于判断改行是否为时间数据
  42        from dual
  43       where substr(r.text, 21) in ('2009','2010','2011','2012','2013')
  44         and r.text not like '%cycle_run_year%';
  45      if (isdate = 1) then                                 --将时间数据格式化
  46        select to_date(substr(r.text, 5),'Mon dd hh24:mi:ss rrrr')
  47          into alert_date
  48          from dual;
  49        if (alert_date > max_date) then                   --设定标志位用于判断是否需要update
  50          start_updating := 1;
  51        end if;
  52      else
  53        alert_text := r.text;
  54      end if;
  55      if (alert_text is not null) and (start_updating = 1) then   --start_updating标志位与alert_text为真,插入记录
  56        insert into alert_log values (alert_date, substr(alert_text, 1, 180));
  57        rows_inserted := rows_inserted + 1;
  58        commit;
  59      end if;
  60    end loop;
  61    sys.dbms_output.put_line('Inserting after date '||to_char(max_date, 'MM/DD/RR HH24:MI:SS'));
  62    sys.dbms_output.put_line('Rows Inserted: '||rows_inserted);
  63    commit;
  64* end;
  65
  usr1@ORCL> start /u01/bk/scripts/update_alert_log.sql
  Inserting after date 01/01/80 00:00:00
  Rows Inserted: 632
  PL/SQL procedure successfully completed.
  基于上述方法,可以定期将告警日志更新到本地数据库,然后清空告警日志文件
  三、查看告警日志的内容
  1.修改会话日期的显示格式

  usr1@ORCL>>  2.查看告警日志的信息
  usr1@ORCL> select * from alert_log where rownum < 5;
  ALERT_DATE          ALERT_TEXT
  ------------------- --------------------------------------------------------------------------------
  2011-02-14 21:36:11 SYS auditing is disabled
  2011-02-14 21:36:11 ksdpec: called for event 13740 prior to event group initialization
  2011-02-14 21:36:11 Starting up ORACLE RDBMS Version: 10.2.0.1.0.
  2011-02-14 21:36:11 System parameters with non-default values:
  3.查看告警日志最新的5条信息
  usr1@ORCL> select * from alert_log where rownum < 5 order by alert_date desc;
  ALERT_DATE          ALERT_TEXT
  ------------------- --------------------------------------------------------------------------------
  2011-02-14 21:36:11 SYS auditing is disabled
  2011-02-14 21:36:11 ksdpec: called for event 13740 prior to event group initialization
  2011-02-14 21:36:11 Starting up ORACLE RDBMS Version: 10.2.0.1.0.
  2011-02-14 21:36:11 System parameters with non-default values:
  4.查看告警日志ORA错误信息
  usr1@ORCL> select * from alert_log where alert_text like 'ORA-%';
  ALERT_DATE          ALERT_TEXT
  ------------------- --------------------------------------------------------------------------------
  2011-02-14 21:36:13 ORA-00202: control file: '/u01/oracle/oradata/orcl/control03.ctl'
  2011-02-14 21:36:13 ORA-27037: unable to obtain file status

  2011-02-14 21:36:13 ORA-205 signalled during:>
  2011-02-14 21:36:23 ORA-1507 signalled during:>  2011-02-14 21:36:27 ORA-00202: control file: '/u01/oracle/oradata/orcl/control03.ctl'
  oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-581862-1-1.html 上篇帖子: 导入导出 Oracle 分区表数据 下篇帖子: ORACLE插入DATE类型字段
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表