生产环境oracle 忽然宕机 查看运行日志 发现归档空间占满 了解到之前开启过DataGuard异地备份 目前已经不再需要此功能 解决方法是关闭归档模式、关闭闪回功能解决过程如下
1.查看归档模式是否打开
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 23
下一个存档日志序列 25
当前日志序列 25
2.查看归档空间使用情况
SQL> select * from v$recovery_file_dest;
NAME
--------------------------------------------------------------------------------
SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
----------- ---------- ----------------- ---------------
/opt/oracle/flash_recovery_area
4070572032 4068022784 0 100
从此处可以看出归档空间已经占满
3.清空归档日志
打开RMAN
rman target /
RMAN>list archivelog all;
RMAN>crosscheck archivelog all; -- 运行这个命令可以把无效的expired的archivelog标出来。
RMAN>delete expired archivelog all; -- 直接全部删除过期的归档日志。
RMAN>delete noprompt archivelog until time "sysdate -3"; -- 也可以直接用一个指定的日期来删除。
手工删除归档日志文件
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
说明:
SYSDATA-7,表明当前的系统时间7天前,before关键字表示在7天前的归档日志,如果使用了闪回功能,也会删除闪回的数据。
同样道理,也可以删除从7天前到现在的全部日志,不过这个命令要考虑清楚,做完这个删除,最好马上进行全备份数据库
DELETE ARCHIVELOG from TIME 'SYSDATE-7'; 删除从7天前到现在的全部日志,慎用
UNIX/Linux下也可以通过FIND找到7天前的归档数据,使用EXEC子操作删除
find /oraarchive -xdev -mtime +7 -name "*.dbf" -exec rm -f {} ;
这样做仍然会在RMAN里留下未管理的归档文件
仍需要在RMAN里执行下面2条命令
crosscheck archivelog all;
delete expired archivelog all;
所以还不如上面的方法好用,不过用FIND的好处就是,可以在条件上,和EXEC子项上做很多操作,实现更复杂的功能
退出rman
RMAN> exit
4.修改归档空间大小为10g 关闭归档功能关闭闪回功能
(1) Startup mount;
(2) alter system set db_recovery_file_dest_size=10G scope=spfile
(3) alter database noarchivelog;
(4) alter database flashback off;
(5) archive log list;
(6) show parameter log_archive_dest
(7) show parameter db_recovery_file_dest
(8) select * from v$recovery_file_dest;
(9) select flashback_on from V$database;