• [terry笔记]ArchiveLog归档日志激增解决思路


          归档日志激增的危害是巨大的,最严重的结果就是数据库无法正常工作,导致整个系统无法正常工作,其次就算数据库可以正常工作,但激增的归档会对磁盘产生大量消耗,导致性能下降。
          归档日志激增一般是因为异常的dml导致,异常的dml使数据被频繁的增删改,以至redo日志频繁切换,再至归档日志激增,最终磁盘爆满,数据库无法正常工作。

    1.首先查询每天的redo日志切换频率,定位异常的时间点,并且还可以粗滤计算出日志量(就算无法解决程序问题,也可以暂时扩大磁盘容量,先让数据库正常归档工作,甚至切换到无归档模式)。

    select to_char(first_time,'mmdd hh24'),count(*) from v$log_history group by to_char(first_time,'mmdd hh24') order by 1;


    2.查询产生日志最多的会话,基本可以确定是什么方向的应用

    col program for a30
    col machine for a30
    select a.sid,a.logon_time,a.username,a.program,a.machine,a.status,round(b.value/1024/1024) mb from v$session a,(select * from (select * from v$sesstat where statistic# = (select statistic# from v$statname where name='redo size') order by value desc) where rownum<=100) b where a.sid=b.sid;

    3.截取归档日志激增时候的AWR报告,在sql统计中仔细排查dml类型sql,并查询嫌疑的sql的执行计划、统计信息等(@?/rdbms/admin/awrsqrpi),还可以找出嫌疑sql所对应的表信息是否有异常。还可以对应之前正常时候其sql的统计信息进行对比。


    4.查看产生大量归档日志的会话所打开的游标(所执行的sql),这样更加确定了异常sql和异常会话的关系。

    select sql_id,sql_text from v$open_cursor where sid=xxx;

    5.查看异常表的信息:

    select avg_row_len from dba_tables where table_name=upper('table_name'); /*表的长度(字节)*/
    select index_name from dba_indexes where table_name=upper('table_name'); /*其拥有的索引,索引越多,归档越多*/

    6.挖掘归档内容:

    exec dbms_logmnr.ADD_LOGFILE('/datavg/archive/1_11111.dbf');
    exec DBMS_LOGMNR.START_LOGMNR;
    select substr(sql_redo,1,30),count(*) from v$logmnr_contents group by substr(sql_redo,1,30) ;

     

          通过以上的步骤,异常的sql、异常的会话、异常的表,和实施人员或者开发人员共同探讨一下,基本可以确定是什么问题导致,然后修正即可。
          以上步骤算是简单记录下问题的追溯过程,最后还需要具体问题具体分析。

  • 相关阅读:
    Php扩展--protocolbuffers消息打包
    Php扩展--seasLog日志扩展安装
    PHP系统编程--03.PHP进程信号处理
    PHP系统编程--01.多进程与多线程
    PHP系统编程--02.PHP守护进程化
    linux shell 之if-------用if做判断
    Connection:Keep-alive
    Http报头Accept与Content-Type的区别
    json解析
    JSON-lib框架,转换JSON、XML不再困难
  • 原文地址:https://www.cnblogs.com/kkterry/p/3296543.html
Copyright © 2020-2023  润新知