我在實際項目中遇到了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)
系統已更改。