您的位置:首页 > 数据库 > Oracle

使用RMAN方式定期清理oracle日志

2017-09-25 10:57 309 查看
本文转载自:http://blog.csdn.net/leshami/article/details/9308287

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

      下面的命令用于校验归档日志的有效性,列出无效的归档日志,以及以何种方式清除归档日志,列出几种常用的: 

首先:

su - oracle

rman

RMAN>connect tartget sys/root

      RMAN> crosscheck archivelog all;           --->校验日志的可用性

   RMAN> list expired archivelog all;         --->列出所有失效的归档日志 

   RMAN> delete archivelog until sequence 16; --->删除log sequence为16及16之前的所有归档日志

   RMAN> delete archivelog all completed before 'sysdate-7';    --->删除系统时间7天以前的归档日志,不会删除闪回区有效的归档日志
   RMAN>delete archivelog all completed before 'sysdate - 1';  --->同上,1天以前的
   RMAN>delete archivelog from time 'sysdate-1';               --->注意这个命令,删除系统时间1天以内到现在的归档日志
   RMAN>delete noprompt archivelog all completed before 'sysdate';   --->该命令清除所有的归档日志
   RMAN>delete noprompt archivelog all; --->同上一命令

RMAN>host;
--退出RMAN;

退出rman命令后,使用df -lh命令查看日志空间已经增大了:

[oracle@hensheng trace]$ df -lh

Filesystem            Size  Used Avail Use% Mounted on

/dev/mapper/vg_hengshegn-rootlv

                       15G   13G  1.1G  93% /

tmpfs                 1.9G  521M  1.4G  28% /dev/shm

/dev/sda1             194M   27M  158M  15% /boot

/dev/mapper/vg_hengshegn-LogVol01

                      4.9G  138M  4.5G   3% /tmp

/dev/mapper/vg_hengshegn-mqmlv

                      5.0G  1.2G  3.6G  25% /var/mqm

/dev/mapper/vg_hengshegn-oraclelv

                       20G   17G  2.6G  87% /oracle

/dev/mapper/vg_hengshegn-oradatalv

                       20G   11G  7.8G  59% /oradata

    
2、演练使用RMAN清除归档日志  

[python] view
plain copy

 print?

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
plain copy

 print?

#对于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: