今天給客戶測 試問題,讓客戶把數據發過來了。解壓縮後一看,他們仍是用的oracle 815版本的(他們exp導出時,帶了導出日誌,從導出日誌中看出來是oracle 815版本的),不過沒有關係,低版本的exp是能夠用高版本的imp導入到高版本數據庫中的。一看是導入還很正常,導入到其中某個表的時候,忽然就不動 了。一開始我尚未弄明白怎末回事。後來,無心中看到了 計算機管理--事件查看器中 ,有不少報錯信息:html
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'linux
我這才發現,問題出在了歸檔上了。sql
又看了alert_oracle.log文件,也有不少這個報錯信息。到這裏,這個問題給了我一個教訓:與oracle有關的操做,只要有問題,確定會向alert_oracle.log文件寫入日誌的,就看你有沒有意識去看這個日誌文件了。數據庫
.去 google.com搜了點資料,這才恍然大悟:
oracle10g在默認狀況下,歸檔日誌是保存在閃回恢復區的(對於個人來講是:E:\oracle\product\10.2.0\flash_recovery_area\ORACLE\ARCHIVELOG),若是你建庫的時候用的默認設置,
閃回恢復區應該是2G,空間被佔滿了之後就沒法再歸檔了。oracle
此時。我從sqlplus open database ,有提示:ide
Microsoft Windows XP [版本 5.1.2600]
(C) 版權全部 1985-2001 Microsoft Corp.post
C:\Documents and Settings\Administrator>sqlplus / as sysdba性能
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 11月 26 17:58:22 2008google
Copyright (c) 1982, 2005, Oracle. All rights reserved.spa
鏈接到:
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的歸檔日誌
親測:
在二級增量備份以後刪除以前的archivelog
backup incremental level 2 database plus archivelog;
效果仍是很給力的,只有1G(三天前的第一次備份是7G,1級level備份以後是6.5G,而且沒有加plus archivelog )
刪除一個歸檔日誌
RMAN> crosscheck archivelog all;
奇怪,爲何檢測沒有1.13號的,是否是我前面備份了
刪除15號的看看
終於有錯誤的了
執行delete expired archivelog all;
奇怪,我deletebackup以後,怎麼二級增量的還在
附加1:
當ORACLE 歸檔日誌滿了後,將沒法正常登入ORACLE,須要刪除一部分歸檔日誌才能正常登入ORACLE。
1、首先刪除歸檔日誌物理文件,歸檔日誌通常都是位於archive目錄下,AIX系統下文件格式爲「1_17884_667758186.dbf」,建議操做前先對數據庫進行備份,刪除時至少保留最近幾天的日誌用於數據庫恢復。
2、把歸檔日誌的物理文件刪除後,咱們就能夠正常登入ORACLE了,可是還沒徹底把歸檔日誌刪除乾淨,ORACLE的controlfile中仍 然記錄着這些archivelog的信息,在oracle的OEM管理器中有可視化的日誌展示出,當咱們手工清除archive目錄下的文件後,這些記錄 並無被咱們從controlfile中清除掉,接下去咱們要作的就是這個工做。
咱們利用RMAN進行刪除操做,操做步驟以下:(window客戶端系統爲例)
1.指定數據庫實例
C:/Documents and Settings/Administrator>SET ORACLE_SID =orcl
2.鏈接數據庫
C:/Documents and Settings/Administrator>RMAN TARGET SYS/sysadmin@orcl
3.查看歸檔日誌的狀態
RMAN> list archivelog all;
4.手工刪除歸檔日誌文件
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
說明:
SYSDATA-7,代表當前的系統時間7天前,before關鍵字表示在7天前的歸檔日誌,若是使用了閃回功能,也會刪除閃回的數據。
一樣道理,也能夠刪除從7天前到如今的所有日誌,不過這個命令要考慮清楚,作完這個刪除,最好立刻進行全備份數據庫
DELETE ARCHIVELOG from TIME 'SYSDATE-7'; 刪除從7天前到如今的所有日誌,慎用
UNIX/LINUX下也能夠經過FIND找到7天前的歸檔數據,使用EXEC子操做刪除
find /oraarchive -xdev -mtime +7 -name "*.dbf" -exec rm -f {} ;
這樣作仍然會在RMAN裏留下未管理的歸檔文件
仍須要在RMAN裏執行下面2條命令
crosscheck archivelog all;
delete expired archivelog all;
因此還不如上面的方法好用,不過用FIND的好處就是,能夠在條件上,和EXEC子項上作不少操做,實現更復雜的功能
5.退出rman
RMAN> exit
附加2:
1.查詢系統使用的是哪一組日誌文件:
select * from v$log;
2.查詢正在使用的組所對應的日誌文件:
select * from v$logfile;
3.強制日誌切換:
alter system switch logfile;
4.查詢歷史日誌:
select * from v$log_history;
5.查詢日誌的歸檔模式:
select dbid,name,created,log_mode from v$database;
6.查詢歸檔日誌的信息:
select recid,stamp,thread#,sequence#,name from v$archived_log;
7.增長與刪除日誌文件組
alter database add logfile group 1 ('/home1/Oracle/oradata/ora8i/log1a.log'),'/home2/oracle/oradata/ora8i/log1b.log') size 100M;
alter database drop logfile group 1;
8.增長與刪除日誌成員
alter database add logfile member '/home1/oracle/oradata/ora8i/log1a.log' to group 1,'/home1/oracle/oradata/ora8i/log2a.log' to group 2;
alter database drop logfile member '/home1/oracle/oradata/ora8i/log1a.log' ;
9.日誌文件移動
alter database rename file '/home1/oracle/oradata/ora8i/log1a.log' to '/home2/oracle/oradata/ora8i/log1a.log';
執行該命令以前必須保證該日誌文件物理上已經移動到新目錄
10.清除日誌文件
alter database clear logfile '/home1/oracle/oradata/ora8i/log1a.log';
該命令用於不能用刪除組及組成員命令刪除日誌時使用
8.查看歸檔日誌佔用空間:
SELECT space_limit/1024/1024/1024 AS "Quota_G",space_used/1024/1024 AS "Used_M",space_used/space_limit*100 "Used_%",space_reclaimable AS reclaimable,number_of_files AS files FROM v$recovery_file_dest ;
9.修改歸檔日誌空間大小
alter system set DB_RECOVERY_FILE_DEST_SIZE=40g;
10.查看歸檔日誌列表
RMAN> list archivelog all;
刪除歸檔日誌
RMAN> delete archivelog until time 'sysdate-1' ;
雙機下也能夠用
delete obsolete;
crosscheck archivelog all;
delete expired archivelog all;
11. 用list expired看看是否有失效的archive log,證實沒有失效的archive log:RMAN> list expired archivelog all;