Oracle RMAN 清除归档日志

在开发环境及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清除归档日志  
[python] view plaincopyprint?
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脚本
[python] view plaincopyprint?
#对于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.youkuaiyun.com/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



原文地址 http://blog.youkuaiyun.com/leshami/article/details/9308287

<think>嗯,用户询问的是Oracle RMAN归档日志删除策略配置。这个问题很专业,用户应该是DBA或运维人员,需要精确控制归档日志空间。从提问方式看,用户对RMAN有基础了解,但可能被复杂的保留策略选项搞混了。归档日志管理确实是备份恢复的核心环节。我记得RMAN主要提供两种保留策略:基于恢复窗口(RECOVERYWINDOW)和基于冗余副本(REDUNDANCY)。用户需要根据实际业务需求选择——前者适合有明确RPO要求的场景,后者则更简单直接。 具体到配置命令,关键点在于CONFIGURE ARCHIVELOG DELETIONPOLICY和CROSSCHECK命令的配合使用。这里要特别注意:如果用户启用了DataGuard,删除策略必须考虑备用库的日志应用状态,否则可能导致备用库中断。这个坑很多DBA都踩过。空间计算方面需要提醒用户:恢复窗口策略实际需要的空间可能远大于窗口天数*每日日志量,因为如果某个备份保留期内没有新备份,对应的日志会一直保留。最好用V$RECOVERY_AREA_USAGE视图监控。用户可能还会遇到ORA-00257错误,这通常是归档日志撑满闪回区导致的。除了设置保留策略,还应该建议用户定期执行DELETEOBSOLETE命令,并考虑归档路径使用ASM或非闪回区目录。 最后生成的三个问题都紧扣操作实践:第一条针对策略选择的关键考量点,第二条解决用户配置后可能遇到的典型报错,第三条则是日常维护动作。这样应该能覆盖用户后续可能遇到的衍生问题。</think>## Oracle RMAN 归档日志删除策略配置指南 ### 1. 核心删除策略类型 Oracle RMAN 提供两种主要的归档日志删除策略: * **基于恢复窗口 (RECOVERY WINDOW)** 定义数据库可恢复到**过去多长时间**的状态。 语法:`CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF <天数> DAYS;` 示例:`CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;` * **规则**:RMAN 保留所有**保证能将数据库恢复到最近7天内任意时间点**所必需的归档日志备份。 * **基于冗余副本 (REDUNDANCY)** 定义每种备份文件**至少保留多少个副本**。 语法:`CONFIGURE RETENTION POLICY TO REDUNDANCY <副本数>;` 示例:`CONFIGURE RETENTION POLICY TO REDUNDANCY 2;` * **规则**:RMAN 保留至少2份完整的备份集及其所需的归档日志。超过数量的旧副本会被标记为可删除。 ### 2. 归档日志删除策略 (ARCHIVELOG DELETION POLICY) 此策略**专门控制归档日志删除**,需在配置核心保留策略后设置: * **基本语法** ```sql CONFIGURE ARCHIVELOG DELETION POLICY TO ...; ``` * **常用策略选项** * **应用后删除 (APPLIED ON STANDBY)** 适用于 Data Guard 环境。归档日志在**所有配置的备用数据库**上应用后才允许删除。 ```sql CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY; ``` * **备份删除 (BACKED UP \<次数\> TIMES TO DEVICE TYPE \<设备类型\>)** 归档日志备份到指定设备类型达到指定次数后允许删除。 ```sql CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO DISK; ``` * **无 (NONE - 默认)** 仅遵循核心保留策略 (`RECOVERY WINDOW` 或 `REDUNDANCY`)。归档日志在**不再被任何备份需要时**才可删除。 ```sql CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; -- 默认值 ``` * **已切换 (SHIPPED TO ALL STANDBY)** 归档日志已传输到所有备用库(但不一定应用)后允许删除。 ### 3. 执行删除的关键步骤 配置策略后,**不会自动删除**归档日志。需手动执行命令: 1. **标记过期文件 (Obsolete)** 根据保留策略确定哪些归档日志/备份已不再需要: ```sql REPORT OBSOLETE; -- 查看哪些文件将被标记为过期 DELETE OBSOLETE; -- 删除标记为过期的文件 ``` 2. **删除不再需要的归档日志** 使用 `DELETE` 命令删除符合删除策略的归档日志: ```sql DELETE ARCHIVELOG ALL; -- 删除所有符合删除策略的归档日志 DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-3'; -- 删除3天前的归档日志(需符合策略) DELETE ARCHIVELOG ALL BACKED UP 2 TIMES TO DEVICE TYPE DISK; -- 删除备份2次到磁盘的日志 ``` 3. **交叉检查 (推荐)** 确保 RMAN 仓库记录与磁盘/磁带上的物理文件一致: ```sql CROSSCHECK ARCHIVELOG ALL; -- 检查所有归档日志 DELETE EXPIRED ARCHIVELOG ALL; -- 删除仓库中有记录但物理文件已丢失的归档日志信息 ``` ### 4. 最佳实践与注意事项 * **策略选择**: * 优先使用 `RECOVERY WINDOW` 满足 RPO (恢复点目标)[^1]。 * `REDUNDANCY` 更简单,但需确保副本数足够覆盖所需恢复时间。 * `ARCHIVELOG DELETION POLICY` 通常配置为 `APPLIED ON ALL STANDBY` (有DG时) 或 `BACKED UP ...` (无DG时)。 * **执行频率**: 结合备份作业,在备份成功后执行 `DELETE OBSOLETE` 和 `DELETE ARCHIVELOG ...`。可封装在备份脚本中。 * **空间监控**: 定期检查归档目标目录 (`LOG_ARCHIVE_DEST_n`) 或快速恢复区 (`DB_RECOVERY_FILE_DEST`) 的使用情况,避免空间耗尽导致数据库挂起[^2]。 * **Data Guard 环境**: 务必使用 `APPLIED ON [ALL] STANDBY` 策略,防止主库删除备用库尚未应用的日志,导致复制中断。 * **备份验证**: 删除策略依赖备份的有效性。定期 `VALIDATE` 备份集。 * **谨慎使用 `DELETE FORCE`**: `DELETE ... FORCE` 会跳过策略检查直接删除物理文件,可能导致恢复失败。仅在紧急清理且明确后果时使用。 ### 5. 配置示例 **目标**:设置7天恢复窗口,归档日志备份到磁盘2次后删除。 ```sql RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO DISK; -- 在备份脚本中执行: RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT; -- 备份删除符合策略的输入日志 RMAN> DELETE OBSOLETE; ``` **目标**:Data Guard 环境,归档日志在所有备库应用后删除。 ```sql RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 3 DAYS; RMAN> CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY; -- 定期执行: RMAN> DELETE ARCHIVELOG ALL; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值