日期:2014-05-16  浏览次数:20472 次

ORA-00257 归档日志过大导致无法存储的解决办法


  ORA-00257 归档日志错误解决方案

  在实际项目中遇到了ORA-00257错误(空间不足错误),通过查找资料,绝大部分说这是由于归档日志太多,占用了全部的硬盘剩余空间导致的,通过简单删除日志或加大存储空间就能够解决。

  诊断过程:

  (1)查看数据库REDOLOG情况:

  SQL> conn /@dmsasc as sysdba

  SQL> select * from v$log;

  发现ARC字段值为NO,表示系统没法自动做归档。

  检查一下归档目录和log sequence:

  SQL> archive log list;

  (2)手工切换日志:

  SQL> alter system switch logfile;

  ORA-01013: 用户请求取消当前的操作

  在等待长时间没反应后,中断操作,手工切换日志没有成功。

  (3)查看FLASH_RECOVERY_AREA空间使用情况:

  SQL> select * from v$recovery_file_dest;

  计算flash recovery area已经占用的空间:

  SQL> select sum(percent_space_used)*3/100 from v$flash_recovery_area_usage;

  FLASH_RECOVERY_AREA空间已使用了2.35GB

  SQL> select * from v$flash_recovery_area_usage;

  归档日志空间已使用了多少百分比,发现ARCHIVELOG占近93.96%,这样FLASH_RECOVERY_AREA空间的空间已经被完全占据了。

  (4)找到recovery目录:

  SQL> show parameter recover;

  解决过程:

  (1)根据数据库目前可用存储空间为200GB、FLASH_RECOVERY_AREA空间为8GB的实际情况,把FLASH_RECOVERY_AREA的空间修改为20GB。

  SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE=20g;

  SQL> select * from v$recovery_file_dest;

  (2)再检查日志状态,发现REDOLOG处于正常的归档状态:ARC YES

  SQL> select * from v$log;

  SQL> select * from v$flash_recovery_area_usage;

  (3)转移或清除对应的归档日志, 删除一些不用的日期目录的文件,注意保留最后几个文件,注意在删除归档日志后,必须用RMAN维护控制文件,否则空间显示仍然不释放。

  rman target sys/XXXX@XXX (数据库用户名/密码)

  RMAN> crosscheck archivelog all; //检查一些无用archivelog

  RMAN> delete expired archivelog all; //删除过期归档

  delete archivelog until time 'sysdate-1'; //删除截止到前一天的所有archivelog

  (4)再次检查发现使用率正常:

  SQL> select * from v$flash_recovery_area_usage;

  (5)重启Oracle(注意在archive log模式下不能正常startup情况下)

  SQL> shutdown immediate;

  SQL> startup mount;

  SQL> alter database noarchivelog;

  SQL> alter database open;

  SQL> shutdown immediate;

  SQL> startup mount;

  SQL> show parameter log_archive_dest;

  SQL> alter database archivelog; //恢复成archive log模式

  SQL> archive log list;

  SQL> shutdown immediate;

  SQL> startup;