sm702 发表于 2018-9-11 11:07:04

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 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清除归档日志
   view plaincopyprint?
  robin@SZDB:~> export ORACLE_SID=GOBO1
  robin@SZDB:~> rman target /

  Recovery Manager:>  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 ">
  sql statement: >  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脚本
   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.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
页: [1]
查看完整版本: Oracle RMAN 清除归档日志