我在实际项目中遇到了ORA-00257错误(空间不足错误),通过查找资料,绝大部分说这是由于归档日志太多,占用了全部的硬盘剩余空间导致的,通过简单删除日志或加大存储空间就能够解决。但是我在Oracle 10g上发现,存储空间还有很大,却也报这个错误。原来是Oracle 10g中新的特性,对Flash Recovery的管理导致的。

wKioL1OFS47RoL6oAAHQIjmX2aU279.jpg

  1、软硬件环境

  服务器 HP Proliant DL580G4

  操作系统 RHEL5.4

  数据库 Oracle 10.2.0.4.0

  2、问题现象

  数据库系统已经试运行了半个多月,在7月24日晚上连接数据库后做数据更新时出现ORA-00257错误,如下图。

  提示归档错误,通过查找ORACLE错误代码,解释为硬盘空间不足,需要删除归档日志增加空间,但是服务器可用空间200GB,目前只用了10GB左右,这是为什么呢?

  3、诊断过程:

  (1)查看ORACLE数据库归档日志情况

  [root@db2/]# cd /oracle/flash_recovery_area/HKCHR/archivelog

  [root@db2 archivelog]# ls

可以查看到,出现问题之前数据库归档处理一直是正常的。

(2)查看数据库REDOLOG情况

  [oracle@db2~]$ sqlplus “/as sysdba”

SQL> select * from v$log;

可以发现ARC状态为NO,说明系统无法正常归档。

  (3)手工切换日志

  SQL> alter system switch logfile;

  alter system switch logfile

  *

  第1行出现错误:

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

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

(4) 查看Oracle数据库后台归档服务进程

  [oracle@db2~]$ ps -ef|grep oracle

  ……

  oracle 20923 1 0 Jul24 ? 00:00:01 ora_pmon_hkchr

  oracle 20925 1 0 Jul24 ? 00:00:00 ora_psp0_hkchr

……

  [oracle@hrmsdb ~]$

  后台进程都正常运行。

(5) 查看FLASH_RECOVERY_AREA空间使用情况

  [root@db2/]# cd /oracle

  [root@db2 oracle]# ls

  admin flash_recovery_area oraInventory product

  [root@db2 oracle]# du -a -k flash_recovery_area

……

  [root@db2 oracle]#

  FLASH_RECOVERY_AREA空间使用了3.35GB

  (6)查看FLASH_RECOVERY_AREA空间中各部分使用情况

  SQL> select * from v$recovery_file_dest;

  NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES

  ------------------------------------------------------------

  /oracle/flash_recovery_area 2147483648 2134212608 0 35

  SQL> select * from v$flash_recovery_area_usage;

  FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES

  ------------ ------------------ -------------------------

  CONTROLFILE 0 0 0

  ONLINELOG 0 0 0

  ARCHIVELOG 69.97 0 40

  BACKUPPIECE 30.01 0 2

  IMAGECOPY 0 0 0

  FLASHBACKLOG 0 0 0

  已选择6行。

 发现ARCHIVELOG占近70%,BACKUPPIRCR占了30%,这样FLASH_RECOVERY_AREA空间的空间已经被完全占据了。

  4、解决过程

  根据数据库目前可用存储空间为200GB、FLASH_RECOVERY_AREA空间为2GB的实际情况,把FLASH_RECOVERY_AREA的空间修改为50GB。

SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE=50g scope=both;(如报错可用scope=spfile)

  系统已更改。