美文网首页我爱编程
解决Oracle归档日志存满的问题

解决Oracle归档日志存满的问题

作者: 米开朗基乐 | 来源:发表于2017-08-28 18:57 被阅读0次

    归档日志archivelog:

    1. 可以配置单个日志文件的大小(oracle安装时设置或安装后修改配置);
    2. 可以配置日志文件占用的(总)空间大小。
      日志文件产生的多少,主要取决于数据库中数据变化的频率。

    一般配置项如下:
    --以dba角色登录
    conn / as sysdba
    --(建议)重新指定归档日志存储目录,需注意目录一定要先建好,linux下操作系统的oracle用户要有权限访问此目录
    alter system set log_archive_dest_1='location=D:\archivelog' scope=spfile;
    alter system set log_archive_start=TRUE scope=spfile;
    --定义日志文件的命名格式
    alter system set log_archive_format='arch%t_%s_%r.arc' scope=spfile;
    --修改日志文件占用的(总)空间大小

    (建议)alter system set db_recovery_file_dest_size= 40G;(与日志删除频率配合,查看此参数:show parameter db_recovery_file_dest_size)
    --重新挂载后生效
    shutdown immediate;
    startup mount;
    alter database archivelog;
    alter database open;


    1.Oracle重启的时候提示这个错,原因是因为闪回归档区的空间满了
    ORA-03113: end-of-file on communication channel Process ID: 14263 Session ID: 335 Serial number: 5
    直接startup是起不来的
    下面是出错到解决的全过程:

    sqlplus / as sysdba,进入数据库
    startup mount;启动mount状态
    alter database mount;
    alter database open;
    报如下错误:
    *
    ERROR at line 1:
    ORA-03113: end-of-file on communication channel
    Process ID: 252
    Session ID: 1 Serial number: 3
    到这一个步骤,就停下来。
    

    nomount 状态 数据库获取spfile的配置来启动数据库,其实这个时候可以通过 show parameter,查看 background_dump_dest 这个参数 来了解alter 文件到底存放在那里了。

    mount 状态,数据库实例已经获取了控制文件.控制文件里面有数据文件的指针,等等很多信息。
    background_dump_dest /u01/app/oracle/fast_recovery_area

    然后查看这个日志:(/u01/app是安装路径)
    /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
    最后有这两句
    Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_arc1_7251.trc: ORA-19815: WARNING: db_recovery_file_dest_size of 4385144832 bytes is 100.00% used, and has 0 remaining bytes available.

    查看这个文件,查看错误信息:(上面日志里记录的)
    /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_arc1_7251.trc
    ORA-19815:这一行提示了db_recovery_file_dest_size使用100%,闪回归档区满了

    /u01/app/oracle/fast_recovery_area //是存档日志存放目录
    现在做的操作是删除存档日志或者增大闪回恢复区(当然还有别的方法)
    我的处理方法是增大闪回恢复区,下边是我的操作过程:

    (确定数据库是关闭的或者修改完重启数据库 )
    #SQL> show parameter recover
    SQL> show parameter db_recovery_file_dest_size;
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_recovery_file_dest_size           big integer 2G
    
    SQL> alter system set db_recovery_file_dest_size=10G scope=spfile;
    系统已更改。
    
    SQL> alter database open;
    数据库已更改。
    
    SQL> show parameter db_recovery_file_dest_size;
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_recovery_file_dest_size           big integer 3G
    
    SQL>alter database open noresetlogs;
    Database altered.  //提示这个就好
    

    然后查看数据库状态
    select open_mode from v$database;
    显示READ WRITE就OK了。

    2.客户使用过程中不能登录业务系统,经检查后发现后台日志报错
    ORA-00257: archiver error. Connect internal only, until freed.
    该错误是由于归档日志满了,造成的。
    查看了下V$FLASH_RECOVERY_AREA_USAGE,看看归档目录使用的情况。果然是归档满了。

    SQL> SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE;

    FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
    ------------ ------------------ ------------------------- ---------------
    CONTROLFILE                   0                         0               0
    ONLINELOG                     0                         0               0
    ARCHIVELOG                  99.9                         0               255
    BACKUPPIECE                   0                         0               0
    IMAGECOPY                     0                         0               0
    FLASHBACKLOG                  0                         0               0
    

    注:可以看出,ARCHIVELOG日志已经达到99.9%了。造成归档满的原因是因为有一个用户在做大量更新操作
    同样是增大闪回恢复区(参考上面第一种错误解决方法)


    SQL> select * from v$flash_recovery_area_usage; --查看空间占用率
    SQL> select * from v$recovery_file_dest;  --查看归档日志的存放位置;
    rman清空归档日志方式
    $ rman
    RAM> connect target /
    RAM> crosscheck archivelog all;  --查看可以所有的归档文件
    RAM> delete expired archivelog all; --清空过期的归档文件
    
     如何确认归档日志是否过期,rman有一个保留策略,可以定义多少天之前的日志算为过期;
    RAM> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
    让恢复窗口成为14天大小。
    RAM> show all; --查看所有的rman策略.
    
    SQL> select count(*) from v$archived_log where archived='YES' and deleted='NO'; --查看所有归档,未删除的归档日志     
    

    定时清理归档日志
    将clear_arc.sh加入定时任务

    #crontab -l
    00 00 * * * clear_arc.sh
    #clear_arc.sh
    rman target / nocatalog cmdfile clear.rcv
    #clear.rcv
    DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
    crosscheck archivelog all;
    delete expired archivelog all;
    

    相关文章

      网友评论

        本文标题:解决Oracle归档日志存满的问题

        本文链接:https://www.haomeiwen.com/subject/arbgdxtx.html