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