Oracle 10g默認歸檔路徑在閃回區的2G空間大小限制問題是本文我們主要要介紹的內容,接下來我們就通過一個實際的例子來開始介紹。實例使這樣的,在為客戶解決問題時,打開數據解壓縮後一看,他們還是用的Oracle 815版本的(他們exp導出時,帶了導出日志,從導出日志中看出來是Oracle 815版本的),不過沒有關系,低版本的exp是可以用高版本的imp導入到高版本數據庫中的。
一看是導入還很正常,導入到其中某個表的時候,突然就不動了。一開始我還沒有弄明白怎麼回事。後來,無意中看到了計算機管理--事件查看器中,有很多報錯信息:
- Archive process error: ORA-16038: log 1 sequence# 317 cannot be archived
- ORA-19809: limit exceeded for recovery files
- ORA-00312: online log 1 thread 1: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/Oracle/REDO01.LOG'
我這才發現,問題出在了歸檔上了。
又看了alert_oracle.log文件,也有很多這個報錯信息。到這裡,這個問題給了我一個教訓:與oracle有關的操作,只要有問題,肯定會向alert_Oracle.log文件寫入日志的,就看你有沒有意識去看這個日志文件了。
網上查看資料得知:Oracle 10g在默認情況下,歸檔日志是保存在閃回恢復區的(對於我的來說是:E:/oracle/product/10.2.0/Flash_recovery_area/Oracle/ARCHIVELOG),如果你建庫的時候用的默認設置,閃回恢復區應該是2G,空間被占滿了以後就無法再歸檔了。
此時,我從sqlplus open database,有提示:
- Microsoft Windows XP [版本 5.1.2600]
- (C) 版權所有 1985-2001 Microsoft Corp.
- C:/Documents and Settings/Administrator>sqlplus / as sysdba
- SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 11月 26 17:58:22 2008
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
- 連接到:
- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
- With the Partitioning, OLAP and Data Mining options
- SQL> select open_mode from v$database;
- OPEN_MODE
- ----------
- MOUNTED
- SQL> alter database open;
- alter database open
- *
- 第 1 行出現錯誤:
- ORA-16014: 日志 1 的序列號 317 未歸檔, 沒有可用的目的地
- ORA-00312: 聯機日志 1 線程 1:
- 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/Oracle/REDO01.LOG'
- SQL>
那怎麼解決這個問題呢?網上的高手也給出了不少方法(以下的方法為轉載,原文地址:http://yaanzy.itpub.Net/post/1263/286285 ):
解決方法:
1.將歸檔設置到其他目錄,修改alter system set log_archive_dest = 其他路徑。
2.轉移或者刪除閃回恢復區裡的歸檔日志。
3.增大閃回恢復區。
- ALTER SYSTEM SET db_recovery_file_dest_size=4g scope=both;
我的處理方法是采用第3種方法,下邊是我的操作過程:
- SQL> show parameter db_recovery_file_dest_size;
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- db_recovery_file_dest_size big integer 2G
- SQL> alter system set db_recovery_file_dest_size=3G;
- 系統已更改。
- SQL> alter database open;
- 數據庫已更改。
- SQL> show parameter db_recovery_file_dest_size;
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- db_recovery_file_dest_size big integer 3G
- SQL>
值得注意的是,我執行完畢alter system set db_recovery_file_dest_size=3G;後,馬上又去show parameter db_recovery_file_dest_size;此時顯示的是3g了,不是原來的2g了。從另外一個方面來說:E:/oracle/product/10.2.0/db_1/dbs/SPFILEOracle.ORA這個文件的修改時間,就是我執行alter system set db_recovery_file_dest_size=3G; 這就更證明,此更改馬上就生效了。
如果將歸檔路徑下的可用空間擴充到了3G,也就是在原來2G的基礎上又加了1G. oracle database下新形成的歸檔日志,實際上是用的這個新增的1G的空間。也許會有人提出疑問,“那我把原來已經形成的2G歸檔日志刪除掉,Oracle database不就能用3G了麼?”其實不是這樣,雖然在物理空間上,已經刪除了2G,但是動態性能視圖(v$recovery_file_dest)並沒有釋放此這2g空間,可以使用select * from v$recovery_file_dest 查詢出來。
若你不從動態性能視圖裡刪除這2G的空間,oracle database會認為這2G依然被占用。若是有個大的事物提交,並有頻繁的日志切換,1G的空間馬上就被用完,到時候你的alert_Oracle.log就有錯誤出現,比如:
- ORA-19815: WARNING: db_recovery_file_dest_size of 3221225472 bytes is 100.00% used, and has 0 remaining bytes available.
- *** 2008-11-28 10:05:13.375
- ************************************************************************
- You have following choices to free up space from Flash recovery area:
- 1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard,
- then consider changing RMAN ARCHIVELOG DELETION POLICY.
- 2. Back up files to tertiary device such as tape using RMAN
- BACKUP RECOVERY AREA command.
- 3. Add disk space and increase db_recovery_file_dest_size parameter to
- reflect the new space.
- 4. Delete unnecessary files using RMAN DELETE command. If an Operating
- system command was used to delete files, then use RMAN CROSSCHECK and
- DELETE EXPIRED commands.
- ************************************************************************
- ORA-19809: limit exceeded for recovery files
- ORA-19804: cannot reclaim 47715840 bytes disk space from 3221225472 limit
- *** 2008-11-28 10:05:13.406 60680 kcrr.c
- ARC0: Error 19809 Creating archive log file to 'E:/ORACLE/PRODUCT/10.2.0/Flash_RECOVERY_AREA/Oracle/ARCHIVELOG/2008_11_28/O1_MF_1_344_%U_.ARC'
解決以上問題,就需要刪除掉動態性能視圖中的已占用空間的信息。按照eygle大師在http://www.eygle.com/archives/2005/03/Oracle10gecIEif.Html 一文中的方法,是用rman來刪除這些信息。所用到的rman命令如下:
1.是RMAN> crosscheck archivelog all;--此命令的含義是檢查所有歸檔日志的狀態,並把遺失的標記為expired,也就是說,expired 表示已經被操作系統中被刪除的歸檔日志。
2.是delete expired archivelog all; --此命令的含義是刪除expired的歸檔日志。
關於Oracle 10g默認歸檔路徑在閃回區的2G空間大小限制問題的相關知識就介紹到這裡了,希望本次的介紹能夠對您有所收獲!