Oracle归档日志清理
目录
首先删除归档文件在物理主机磁盘中的文件 物理文件删除后Oracle的 controlfile 中仍然记录着这些 archivelog 的信息,在 oracle 的OEM管理器中有可视化的日志展现出,接下来要做的就是从 controlfile 中清除掉多余归档日志文件记录 利用 RMAN 进行删除操作,操作步骤如下: 打开 Rman 连接数据库
rman target /
查看归档日志的状态
RMAN> list archivelog all; #显示所有的日志及日志地址
cd /data/oracle
ls
我这个日志存放的目录不好,应该单独建一个文件夹存放。
转移或清除对应的归档日志
find /data/oracle/ -xdev -mtime +7 -name "*.dbf" -exec rm -f {} \;
这样做仍然会在RMAN里留下未管理的归档文件 仍需要在RMAN里执行下面2条命令
执行 archivelog 校验命令
RMAN> crosscheck archivelog all; #把无效的expired的archivelog标出来
删除校验失败的记录
RMAN> delete expired archivelog all; #删除所有的无效日志
删除当前系统时间-7天之前的归档日志
RMAN> delete archivelog all completed before 'sysdate-7';
sysdate-7,表明当前的系统时间7天前,before关键字表示在7天前的归档日志,如果使用了闪回功能,也会删除闪回的数据。 同样道理,也可以删除从7天前到现在的全部日志,不过这个命令要考虑清楚,做完这个删除,最好马上进行全备份数据库
RMAN> delete archivelog from time 'sysdate-7'; # 删除从7天前所有日志,慎用
不如上面的方法好用,不过用find的好处就是,可以在条件上,和exec子项上做很多操作,实现更复杂的功能
顺便说一下怎么更换归档日志的路径,我这个路径是忘记最后加个/。
查看归档路径位置明细
SQL> show parameter log_archive_dest_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
。
查看归档日志文件格式
SQL> show parameter log_archive_format
清理脚本(后面不使用了)
#!/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
目前使用的
#!/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