Oracle归档日志清理

摘要

首先删除归档文件在物理主机磁盘中的文件
物理文件删除后Oracle的 controlfile 中仍然记录着这些 archivelog 的信息,在 oracle 的OEM管理器中有可视化的日志展现出,接下来要做的就是从 controlfile 中清除掉多余归档日志文件记录
利用 RMAN 进行删除操作,操作步骤如下:
打开 Rman 连接数据库

1
rman target /

查看归档日志的状态

1
RMAN> list archivelog all;	#显示所有的日志及日志地址

1
2
cd /data/oracle
ls

我这个日志存放的目录不好,应该单独建一个文件夹存放。

转移或清除对应的归档日志

1
find /data/oracle/ -xdev -mtime +7 -name "*.dbf" -exec rm -f {} \;

这样做仍然会在RMAN里留下未管理的归档文件
仍需要在RMAN里执行下面2条命令

执行 archivelog 校验命令

1
RMAN> crosscheck archivelog all;	#把无效的expired的archivelog标出来

删除校验失败的记录

1
RMAN> delete expired archivelog all;	#删除所有的无效日志

删除当前系统时间-7天之前的归档日志

1
RMAN> delete archivelog all completed before 'sysdate-7';

sysdate-7,表明当前的系统时间7天前,before关键字表示在7天前的归档日志,如果使用了闪回功能,也会删除闪回的数据。
同样道理,也可以删除从7天前到现在的全部日志,不过这个命令要考虑清楚,做完这个删除,最好马上进行全备份数据库

1
RMAN> delete archivelog from time 'sysdate-7';	# 删除从7天前所有日志,慎用

不如上面的方法好用,不过用find的好处就是,可以在条件上,和exec子项上做很多操作,实现更复杂的功能

顺便说一下怎么更换归档日志的路径,我这个路径是忘记最后加个/。

查看归档路径位置明细

1
SQL> show parameter log_archive_dest_1

更改归档路径

1
SQL> alter system set log_archive_dest_1='location=/data/oracle/archivelog/';

scope=spfile仅仅更改spfile里面的记载,不更改内存,也就是不立即生效,而是等下次数据库启动生效。有一些参数只允许用这种方法更改
scope=memory仅仅更改内存,不改spfile。也就是下次启动就失效了
scope=both内存和spfile都更改
不指定scope参数,等同于scope=both

查看归档日志文件格式

1
SQL> show parameter log_archive_format

清理脚本(后面不使用了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

set -e
set -x

source /home/oracle/.bash_profile
ORACLE_SID=orcl
table='v$archived_log'
deldir='/databak/shell'

sqlplus -silent "/ as sysdba" <<EOF > ${deldir}/deleteorclarch.sh
set heading off;
set pagesize 0;
set term off;
set feedback off;
set linesize 32767;
select 'rm -rf '||name from ${table} where DELETED='NO' and APPLIED='YES' and name!='standbydb';
exit;
EOF
sh ${deldir}/deleteorclarch.sh
rman target /<<END
crosscheck archivelog all;
delete noprompt expired archivelog all;
exit;
END

目前使用的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
set -e
#set -x

source /home/oracle/.bash_profile

DATE=`date +%Y%m%d%H`
rman target / <<EOF
run{
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt archivelog all completed before 'sysdate-7';
}
exit;
EOF
exit