??? 昨天根據客戶要求,增加了一個jasperreport實現的報表打印功能,然后在測試服務器上測試通過,因為看到測試數據庫上的數據都太“舊”了,我就從正式環境下導出了OA系統的數據,導出操作一切順利,在導入過程中卻由于網絡問題中斷(因為我是遠程導入,備份文件在我的機器上)。再次連接數據庫,一直報錯,說什么只允許內部連接。遠程重啟了下oracle服務,登錄數據庫還是不行,發現數據庫根本沒打開,通過sqlplus執行
???
alter?database?open;
命令,報錯:
ORA-16014:?日志?1?的序列號?680?未歸檔,?沒有可用的目的地
ORA-00312:?聯機日志?1?線程?1:?alter?database?clear?unarchived?logfile?'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG'
看情況是日志文件出錯,幸好是測試服務器,把我這個對oracle管理一竅不通的家伙急壞了。馬上baidu了下錯誤代碼,找到一篇文章:
在日志文件損壞或者dump這些損壞的日志文件的時候,通常回收到類似下面的錯誤:
ORA-00354: corrupt redo log block header
ORA-00353: log corruption near block 3740 change 0 time 04/11/2006 13:49:56??
ORA-00312: online log 1 thread 1: '/oracle/oradata/TSMISC02/redo01.log'
或者:
sys@TSMISC02> ALTER SYSTEM DUMP LOGFILE '/oracle/oradata/TSMISC02/redo01.log';
ALTER SYSTEM DUMP LOGFILE '/oracle/oradata/TSMISC02/redo01.log'
*
ERROR at line 1:
ORA-00354: corrupt redo log block header
ORA-00353: log corruption near block 3740 change 6918597 time 04/10/2006 23:53:24
ORA-00334: archived log: '/oracle/oradata/TSMISC02/redo01.log'
Elapsed: 00:00:03.36
sys@TSMISC02>
這里首先介紹一下oracle使用日志文件的策略。每一個數據庫至少有兩個或多個日志文件組(redo log group),每個組中至少有一個日志成員(redo log member)。日志文件的主要功能是真實完整的記錄對數據庫作的全部修改。在出現故障時,如果不能將修改數據永久地寫入數據文件,則系統將利用日志前滾來恢復數據庫數據文件。日志文件主要是保護數據庫以防止故障。
如果LGWR 至少能夠訪問一個組內的某一個成員,那么oracle就會對這個組內的可訪問成員繼續照常進行讀寫操作,也就是說,LGWR 將忽略組內的不可用成員。如果在日志切換時LGWR 無法訪問下一個組的所有成員或者損壞的日志文件時改組中日志成員,數據庫的正常操作就無法進行了。這也就是oracle常說的,為了防止日志文件的故障或丟失,強烈建議鏡象日志(mirrored redo log),即,在不同磁盤上維護至少兩個或多個日志文件(redo log member)副本的作用——只要組內有一個可用的成員,oracle就會繼續“正常”操作。
回到這里,如果數據庫發生日志文件的上述損壞,不管是哪種原因造成的,解決方法無外乎是使用完好的文件恢復已經損壞的文件,或者初始化損壞的文件組等等(日志文件的故障處理不做這里的重點介紹,我將會在其他的文章中逐一說明和舉例)。
我們這里主要是使用了_disable_logging=true這個隱含參數(實際性能故障診斷時,你可以通過alert.log找到相關信息)造成了歸檔數據庫中,所有日志不能歸檔,最終數據庫不能繼續操作的問題,因此解決方法就是:
(a)如果是使用了隱含參數,那么去掉這個隱含參數:
??? alter system set "_disable_logging"=false scope=both;
(b)然后,初始化損壞的redo log:
alter database clear unarchived logfile '<logilename>';?
例如:
sys@TSMISC02> alter system set "_disable_logging"=false scope=both;
System altered.
Elapsed: 00:00:00.01
sys@TSMISC02>
sys@TSMISC02> alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo02.log';?
Database altered.
Elapsed: 00:00:00.18
sys@TSMISC02> alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo03.log';?
Database altered.
Elapsed: 00:00:00.17
sys@TSMISC02>
OK,馬上執行命令:
alter?database?clear?unarchived?logfile?'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG'
再打開數據庫,一切正常,重新導入,問題解決。
我需要加強下對oracle基本故障處理方面知識的學習了。