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清除歸檔日誌  
[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.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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章