1.如何获取该log文件的存放目录,windows、solaris、linux等不同系统下方法是否相同?2.找到该文件后,如何提取log中的死锁信息,即ORA-00060错误,主要提取发生的时间即可。
该问题主要针对windows系统下,有什么效率高的好方法,要考虑到日志文件可能很大,如果全部读进内存解析显然不是好方法。
如果是unix系统下,初步想采用AWK技术。windows下曾考虑过lucene,但是log是不断变化的,感觉lucene不是太适合。3.能不能控制这个log的大小,即文件增长到指定大小后,就写进另一个文件,即alert_SID_1.log,alert_SID_2.log,alert_SID_3.log......这种。4.或者有其它更好,更直接的方法来达到我的目的(即:知道数据库在什么时间点发生过死锁),请直接指教哈。
请各位大侠不吝赐教哈,分不够再加。

解决方案 »

  1.   

    1.如何获取该log文件的存放目录,windows、solaris、linux等不同系统下方法是否相同?
    --一般情况下,目录都是固定的,$ORACLE_BASE\SID_NAME\ADMIN\BDUMP ,都在这个目录下。2.找到该文件后,如何提取log中的死锁信息,即ORA-00060错误,主要提取发生的时间即可。
    该问题主要针对windows系统下,有什么效率高的好方法,要考虑到日志文件可能很大,如果全部读进内存解析显然不是好方法。
    如果是unix系统下,初步想采用AWK技术。windows下曾考虑过lucene,但是log是不断变化的,感觉lucene不是太适合。
    -- 写脚本,每个一段时间,扫描一个alert log 文件,有这个错误就发送到邮箱。用存储过程加Job 也行。
    3.能不能控制这个log的大小,即文件增长到指定大小后,就写进另一个文件,即alert_SID_1.log,alert_SID_2.log,alert_SID_3.log......这种。-- 写个脚本,每天执行一次,将alert log 复制一份,然后删除就的内容。 这样就可以了。 这个脚本有很多。 下面这个是windows 下面的。alert.bat
    set year=%DATE:~0,4%
    set month=%DATE:~5,2%
    set day=%DATE:~8,2%
    copy D:\oracle\admin\ORCL\bdump\alert_orcl.log D:\oracle\admin\ORCL\bdump\alert_orcl"%year%%month%%day%".log
    cd. >D:\oracle\admin\ORCL\bdump\alert_orcl.log
    ------------------------------------------------------------------------------ 
    Blog: http://blog.csdn.net/tianlesoftware 
    网上资源: http://tianlesoftware.download.csdn.net 
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 
    Q Q 群:62697716 
      

  2.   

    楼上的已经讲得很清楚了,我再来补充一点。
    也可以不通过alert文件,根据trace文件来也可以,因为死锁的时候会产生的对应的trace文件的,在unix下面只要根据关键字grep一下就可以知道哪些文件包括了死锁信息。
      

  3.   

    http://www.adp-gmbh.ch/ora/admin/read_alert/index.htmlcreate or replace procedure external_alert_log as
      path_bdump varchar2(4000);
      name_alert varchar2(100);
    begin  select 
        value into path_bdump 
      from 
        sys.v_$parameter
      where
        name = 'background_dump_dest';  select
        'alert_' || value || '.log' into name_alert
      from
        sys.v_$parameter
      where
        name = 'db_name';  execute immediate 'create or replace directory background_dump_dest_dir as ''' || 
        path_bdump || '''';  execute immediate 
        'create table alert_log_external '              ||
        ' (line  varchar2(4000) ) '                     ||
        '  organization external '                      ||
        ' (type oracle_loader '                         ||
        '  default directory background_dump_dest_dir ' ||
        '  access parameters ( '                        ||
        '    records delimited by newline '             ||
        '    nobadfile '                                ||
        '    nologfile '                                ||
        '    nodiscardfile '                            ||
        '    fields terminated by ''#$~=ui$X'''         ||
        '    missing field values are null '            ||
        '    (line)  '                                  ||
        '  ) '                                          ||
        '  location (''' || name_alert || ''') )'       ||
        '  reject limit unlimited ';
    end;
    /begin
      external_alert_log;
    end;
    /select * from alert_log_external;