在开发环境及UAT环境经常碰到需要清除归档日志的情形,对于这个问题方法有很多。可以直接使用rm方式清除归档日志,也可以使用find命令来查找符合条件的记录来清除归档日志,或者直接写个shell脚本来搞定。这样在DEV或者UAT还可以,但是在Prod环境还是建议使用RMAN提供的命令来搞定比较妥当。因为rm,find方式删除了实际的归档日志也释放了空间,但对应的存储在控制文件中的归档信息并没有彻底清除。依旧占用着一些空间未能及时清除而需要控制文件通过age out方式来释放空间。本文描述了使用RMAN方式来清除归档日志,同时也可以将其部署到shell脚本中使用。

有关阅读本文需要的相关参考
      Oracle 归档日志      Oracle 控制文件(CONTROLFILE)      Oracle 联机重做日志文件(ONLINE LOG FILE)      delete archivelog all 无法彻底删除归档日志?      Linux/Unix shell 脚本中调用SQL,RMAN脚本      Linux/Unix shell 脚本清除归档日志文件

1、清除归档日志的方式

a、手动删除
      使用rm 或者find方式来删除,通过该方式删除之后,在RMAN下可以通过 crosscheck archivelog all 校验归档是否失效,如下面的操作:
       rm -rf arch_816906485_1_10.arc 
    find /u02/database/GOBO1/archive/ -ctime +0 -delete
    RMAN> crosscheck archivelog all

b、使用RMAN方式清除
      RMAN清除方式会自动清除磁盘上的归档日志文件,同时会释放控制文件中对应的归档日志的归档信息。
      可以基于不同的条件来清除归档日志,如基于SCN,基于SEQUENCE,基于TIME等方式。
      对于上述的三种方式又可以配合from, until, between .. and .. 等等子句来限定范围,方式灵活多变。
      下面的命令用于校验归档日志的有效性,列出无效的归档日志,以及以何种方式清除归档日志,列出几种常用的: 
                 crosscheck archivelog all;                             --->校验日志的可用性
          list expired archivelog all;                           --->列出所有失效的归档日志
          delete archivelog until sequence 16;                   --->删除log sequence为16及16之前的所有归档日志
          delete archivelog all completed before 'sysdate-7';    --->删除系统时间7天以前的归档日志,不会删除闪回区有效的归档日志
          delete archivelog all completed before 'sysdate - 1';  --->同上,1天以前的
          delete archivelog from time 'sysdate-1';               --->注意这个命令,删除系统时间1天以内到现在的归档日志
          delete noprompt archivelog all completed before 'sysdate';   --->该命令清除所有的归档日志
          delete noprompt archivelog all;                              --->同上一命令
    
2、演练使用RMAN清除归档日志

robin@SZDB:~> export ORACLE_SID=GOBO1
robin@SZDB:~> rman target /

Recovery Manager: Release 10.2.0.3.0 - Production on Thu Jul 11 17:07:00 2013

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

connected to target database: GOBO1 (DBID=733951103)

RMAN> host;

robin@SZDB:~> cd /u02/database/GOBO1/archive/
robin@SZDB:/u02/database/GOBO1/archive> ls
arch_816906485_1_10.arc      arch_816906485_1_12.arc
arch_816906485_1_11.arc      arch_816906485_1_13.arc
    ............

robin@SZDB:/u02/database/GOBO1/archive> rm -rf arch_816906485_1_10.arc arch_816906485_1_11.arc arch_816906485_1_12.arc
robin@SZDB:/u02/database/GOBO1/archive> exit;
exit
host command complete                        

RMAN> crosscheck archivelog all;
released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=1075 devtype=DISK
archive log filename=/u02/database/GOBO1/archive/arch_816906485_1_9.arc recid=2085 stamp=817211151
validation failed for archived log
archive log filename=/u02/database/GOBO1/archive/arch_816906485_1_10.arc recid=2086 stamp=817250793
      ..............
validation succeeded for archived log
archive log filename=/u02/database/GOBO1/archive/arch_816906485_1_90.arc recid=2166 stamp=820458049
Crosschecked 83 objects                    

RMAN> list expired archivelog all;

List of Archived Log Copies
Key     Thrd Seq     S Low Time          Name
------- ---- ------- - ----------------- ----
2086    1    10      X 20130604 11:05:51 /u02/database/GOBO1/archive/arch_816906485_1_10.arc
2087    1    11      X 20130604 22:06:17 /u02/database/GOBO1/archive/arch_816906485_1_11.arc
2088    1    12      X 20130605 19:30:53 /u02/database/GOBO1/archive/arch_816906485_1_12.arc

RMAN> delete archivelog until sequence 16;

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=1075 devtype=DISK

List of Archived Log Copies
Key     Thrd Seq     S Low Time          Name
------- ---- ------- - ----------------- ----
2084    1    8       A 20130604 09:53:17 /u02/database/GOBO1/archive/arch_816906485_1_8.arc
                        .................
2092    1    16      A 20130607 22:03:23 /u02/database/GOBO1/archive/arch_816906485_1_16.arc

Do you really want to delete the above objects (enter YES or NO)? yes
          ...............
deleted archive log
archive log filename=/u02/database/GOBO1/archive/arch_816906485_1_16.arc recid=2092 stamp=817516861
Deleted 9 objects

RMAN> delete archivelog all completed before 'sysdate-7';

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=1075 devtype=DISK

List of Archived Log Copies
Key     Thrd Seq     S Low Time          Name
------- ---- ------- - ----------------- ----
2093    1    17      A 20130608 00:01:00 /u02/database/GOBO1/archive/arch_816906485_1_17.arc
2094    1    18      A 20130608 18:00:17 /u02/database/GOBO1/archive/arch_816906485_1_18.arc
            ...........
deleted archive log
archive log filename=/u02/database/GOBO1/archive/arch_816906485_1_72.arc recid=2148 stamp=819847035
Deleted 56 objects            

RMAN> list copy of database archivelog all;

List of Archived Log Copies
Key     Thrd Seq     S Low Time          Name
------- ---- ------- - ----------------- ----
2149    1    73      A 20130703 23:17:13 /u02/database/GOBO1/archive/arch_816906485_1_73.arc
2150    1    74      A 20130704 22:00:19 /u02/database/GOBO1/archive/arch_816906485_1_74.arc
2151    1    75      A 20130704 22:04:40 /u02/database/GOBO1/archive/arch_816906485_1_75.arc
                       ...............
2164    1    88      A 20130709 23:19:34 /u02/database/GOBO1/archive/arch_816906485_1_88.arc
2165    1    89      A 20130710 13:00:34 /u02/database/GOBO1/archive/arch_816906485_1_89.arc
2166    1    90      A 20130710 22:02:44 /u02/database/GOBO1/archive/arch_816906485_1_90.arc

RMAN> delete archivelog from time 'sysdate-1';

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=1075 devtype=DISK

List of Archived Log Copies
Key     Thrd Seq     S Low Time          Name
------- ---- ------- - ----------------- ----
2165    1    89      A 20130710 13:00:34 /u02/database/GOBO1/archive/arch_816906485_1_89.arc
2166    1    90      A 20130710 22:02:44 /u02/database/GOBO1/archive/arch_816906485_1_90.arc

Do you really want to delete the above objects (enter YES or NO)? yes
deleted archive log
archive log filename=/u02/database/GOBO1/archive/arch_816906485_1_89.arc recid=2165 stamp=820447373
deleted archive log
archive log filename=/u02/database/GOBO1/archive/arch_816906485_1_90.arc recid=2166 stamp=820458049
Deleted 2 objects

RMAN> delete archivelog all completed before 'sysdate - 1';

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=1075 devtype=DISK

List of Archived Log Copies
Key     Thrd Seq     S Low Time          Name
------- ---- ------- - ----------------- ----
2149    1    73      A 20130703 23:17:13 /u02/database/GOBO1/archive/arch_816906485_1_73.arc
              .......................
2164    1    88      A 20130709 23:19:34 /u02/database/GOBO1/archive/arch_816906485_1_88.arc

Do you really want to delete the above objects (enter YES or NO)? yes
     ................
archive log filename=/u02/database/GOBO1/archive/arch_816906485_1_88.arc recid=2164 stamp=820414835
Deleted 16 objects

RMAN> sql " alter system archive log current";

sql statement:  alter system archive log current

RMAN> list copy of archivelog all;

List of Archived Log Copies
Key     Thrd Seq     S Low Time          Name
------- ---- ------- - ----------------- ----
2167    1    91      A 20130711 01:00:48 /u02/database/GOBO1/archive/arch_816906485_1_91.arc

RMAN> delete noprompt archivelog all completed before 'sysdate';

released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=1075 devtype=DISK

List of Archived Log Copies
Key     Thrd Seq     S Low Time          Name
------- ---- ------- - ----------------- ----
2167    1    91      A 20130711 01:00:48 /u02/database/GOBO1/archive/arch_816906485_1_91.arc
deleted archive log
archive log filename=/u02/database/GOBO1/archive/arch_816906485_1_91.arc recid=2167 stamp=820517964
Deleted 1 objects

3、清除归档日志简单的shell脚本

#对于RAC环境或者ASM需要清除archive,使用shell脚本调用RMAN是比较妥当的方式
#其次,如果你的archive位于闪回区,制定合理的保留策略,也可以让Oracle自动老化无用的归档日志
robin@SZDB:~/dba_scripts/custom/bin> more clean_arch.sh
# +-------------------------------------------------------+
# +    Clean archived log as specified time               |
# +    Author : Robinson                                  |
# +    Blog   : http://blog.csdn.net/robinson_0612        |
# +    Usage  :                                           |
# +         clean_arch.sh $ORACLE_SID                     |
# +-------------------------------------------------------+
#
#!/bin/bash
# --------------------
# Define variable
# --------------------

if [ -f ~/.bash_profile ]; then
. ~/.bash_profile
fi

if [ -z "${1}" ];then
    echo "Usage: "
    echo "      `basename $0` ORACLE_SID"
    exit 1
fi

ORACLE_SID=$1;                 export ORACLE_SID
$ORACLE_HOME/bin/rman log=/users/robin/log/rman.log <<EOF
connect target /
run{
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt archivelog all completed before 'sysdate - 1';
}
exit;
EOF
exit 

4、小结
a、归档日志清除的方法最好是在RMAN方式下完成,这样子是最彻底的清除方式
b、对于生产环境应考虑在RMAN备份的时候清除归档日志,如backup archivelog all时使用delete input与delete all input清除归档日志
c、如果备份期间不清除归档日志则arch会很大,造成归档磁盘满而导致归档失败。建议还是删除或考虑存放到闪回区
d、如果清除大部分又想保留最近的,则使用delete noprompt archivelog all completed before 'sysdate - n'方式
e、详细的清除归档日志语法: http://docs.oracle.com/cd/B19306_01/backup.102/b14194/rcmsynta008.htm#RCMRF106

相关参考
    Oracle 冷备份

Oracle 热备份

Oracle 备份恢复概念

Oracle 实例恢复

Oracle 基于用户管理恢复的处理

SYSTEM 表空间管理及备份恢复

SYSAUX表空间管理及恢复

Oracle 基于备份控制文件的恢复(unsing backup controlfile)

RMAN 概述及其体系结构

RMAN 配置、监控与管理

RMAN 备份详解

RMAN 还原与恢复

RMAN catalog 的创建和使用

基于catalog 创建RMAN存储脚本

基于catalog 的RMAN 备份与恢复

RMAN 备份路径困惑

自定义 RMAN 显示的日期时间格式

只读表空间的备份与恢复

Oracle 基于用户管理的不完全恢复

理解 using backup controlfile

使用RMAN实现异机备份恢复(WIN平台)

使用RMAN迁移文件系统数据库到ASM

基于Linux下 Oracle 备份策略(RMAN)

Linux 下RMAN备份shell脚本

使用RMAN迁移数据库到异机

RMAN 提示符下执行SQL语句

Oracle 基于 RMAN 的不完全恢复(incomplete recovery by RMAN)

Oracle RMAN 清除归档日志的更多相关文章

  1. 如何检查oracle的归档日志及空间占用率,清除归档日志

    如何解决“归档日志已满问题” 问题描述: 所用数据库为 Oracle 10g ,模式为归档模式,oracle 系统默认的归档空间为2G,由于日志过多,空间写满,数据库的redo文件不能归档,而出现or ...

  2. ORACLE 使用RMAN管理归档日志 archived log

    oracle 归档日志通常使用rman进行管理,作为备份集的一部分 正常情况下,可以根据方法删除 1 过期策略 crosscheck archivelog all; delete expired ar ...

  3. oracle从备份归档日志的方法集中回收

    oracle从备份集中抓出归档日志方法 在大连医院遇到这个问题,数据库为归档状态,但归档完成后rman通过crontab自己主动备走归档日志并删除存在系统上的归档日志文件.在RealSync程序停止一 ...

  4. Oracle 11g 删除归档日志

    工作环境ORACLE 11g 归档日志满了,手动删除出现 ora 异常. 注:工作环境是linux redhat 5 执行命令如下: 1. 进入rman 2. connect target / 3. ...

  5. Oracle基础 04 归档日志 archivelog

    --查看归档模式archive log list select log_mode from v$database; --修改为归档模式(mount下)alter database archivelog ...

  6. oracle每天清理归档日志

    http://langzhiwang888.iteye.com/blog/1675033 参考这里的内容 在数据库服务器上新建一个bat文件(文件名随意) 编辑此文件为: rman target 's ...

  7. oracle归档日志写满错误解决方法

    最近一年,手头上负责的项目要部署到很多个地方,由于项目组里没有人对oracle比较熟悉,只能给自己增加一个DBA的角色了.由于短时间内要部署很多单位,备份策略没有设置好,结果过了一个月,用户报告程序开 ...

  8. RMAN数据库恢复之恢复归档日志文件

    恢复归档日志文件如果只是为了在恢复数据文件之后应用归档文件,那并不需要手动对归档文件进行恢复,RMAN会在RECOVER时自动对适当的归档进行恢复.单独恢复归档文件一般是有特别的需求,如创建了Data ...

  9. ORACLE归档日志比联机重做日志小很多的情况总结

    ORACLE归档日志比联机重做日志小很多的情况   前几天一网友在群里反馈他遇到归档日志比联机重做日志(redo log)小很多的情况,个人第一次遇到这种情况,非常感兴趣,于是在一番交流沟通后,终于弄 ...

随机推荐

  1. Python列表

    列表不同于字符串和元组:列表是可变的--可以改变列表的内容 1.列表函数 1.list(x)函数(其实是一种类型,而不是一个真正意义上的函数) 转化为列表,其中x可以是其他序列 可以用''.join( ...

  2. 自动化运维:flask-bootstrap + highstock整合

    1.在flask-bootstrap的base.html模板中加载highstock.js      以下是base.html的源码中,调用js文件的例子. 文件路径:python2.7/site-p ...

  3. Java for LeetCode 189 Rotate Array

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...

  4. DOM2定位与高宽类属性专题学习【DOM专题学习系列(一)】

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...

  5. 面向对象程序设计-C++ Inheritance &amp; Multiple inheritance &amp; RTTI【第十三次上课笔记】

    Sadly, 这节课带过去的笔记本没电了 T^T 导致没有一行 Code, Sorry 笔记如下: Shape * p1; //使用指针创建对象的方法 p = new Circle (2.0); Sh ...

  6. hdu1032

    #include <iostream> using namespace std; int main() { int a,b,t,i,max; while(cin >> a &g ...

  7. 读书笔记 effective c++ Item 2 尽量使用const,枚举(enums),内联(inlines),不要使用宏定义(define)

    这个条目叫做,尽量使用编译器而不要使用预处理器更好.#define并没有当作语言本身的一部分. 例如下面的例子: #define ASPECT_RATIO 1.653 符号名称永远不会被编译器看到.它 ...

  8. zk创建集群

    在单机环境下和创建集群. 需要注意的点: 配置数据文件myid 1/2/3 对应server.1/2/3 通过./zkCli.sh -server [ip]:[port]  检测集群是否创建成功 在z ...

  9. MongoDB 在 windows 下的安装与服务配置

    本文转载地址: https://blog.csdn.net/Dorma_Bin/article/details/80851230 本地安装及网页测试 在官网下载最新的安装文件 下载地址 : https ...

  10. django之block extend标签

    class ExtendsNode(Node): must_be_first = True context_key = 'extends_context' def __init__(self, nod ...