在開發環境及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 .. 等等子句來限定范圍,方式靈活多變。
下面的命令用於校驗歸檔日志的有效性,列出無效的歸檔日志,以及以何種方式清除歸檔日志,列出幾種常用的:
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