当前位置:  数据库>oracle

使用外部表管理Oracle 告警日志(ALAERT_$SID.LOG)

    来源: 互联网  发布时间:2017-05-04

    本文导语: Oracle 告警日志时DBA维护数据库经常需要关注的一部分内容。然而告警日志以文本文件,按时间的先后顺序不断累积的形式来存储,久而久之,势必造成告警日志的过大,难于维护和查找相关的信息。使用外表表方式来管理告警...

Oracle 告警日志时DBA维护数据库经常需要关注的一部分内容。然而告警日志以文本文件,按时间的先后顺序不断累积的形式来存储,久而久之,势必造成告警日志的过大,难于维护和查找相关的信息。使用外表表方式来管理告警日志将大大简化维护工作量,也更直关的获取所需的信息。

       

一、告警日志的内容

   

    消息和错误的类型(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.查看后台日志路径

        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 identified by usr1    --创建帐户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.

       

        基于上述方法,可以定期将告警日志更新到本地数据库,然后清空告警日志文件        


    
 
 

您可能感兴趣的文章:

  • linux下安装oracle后使用命令行启动的方法 linux启动oracle
  • Oracle9i 9.0.1的JDBC Drivers 可以给Oracle 8.0.5使用马?
  • Suse linux使用oracle问题
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • jbuilder中使用oracle的问题
  • 求redhat linux 9.0下可以使用的oracle 10g或9i,还有redhat linux 9.0下可以使用的eclipse下载地址
  • Oracle事务!使用游标提交过程
  • 在Jbuilder7下,使用DbPilot.exe连接oracle,报错!请教高手!
  • AIX 64位系统上如何使用32位OCI oracle driver
  • Oracle中SQL语句连接字符串的符号使用介绍
  • 使用X manager连接oracle数据库的步骤
  • C++使用OCCI连Oracle10g的错误
  • 使用工具 plsqldev将Excel导入Oracle数据库
  • Linux下Oracle的sqlplus使用光标上下左右方法
  • Oracle 数据 使用游标
  • oracle使用sql脚本生成csv文件案例学习
  • ORACLE 修改表结构 之ALTER CONSTAINTS的使用
  • Linux中Oracle使用相关知识集锦
  • Oracle密码文件的使用和维护第1/3页
  • Oracle 触发器的使用小结
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • Office 2010 Module模式下使用VBA Addressof
  • c#中SAPI使用总结——SpVoice的使用方法
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • asp程序使用的access在Linux下如何使用!
  • c/c++预处理命令预#,##使用介绍
  • 新装的Linux使用root用户不能使用FTP?
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。 iis7站长之家
  • LINUX下使用Eclipse,如何使用交叉编译器?
  • Python namedtuple(命名元组)使用实例
  • redhat9内存使用率高达73%,怎么查看内存具体使用情况


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,