王 超,祝永志(曲阜師范大學信息科學與工程學院,山東日照276800)
?
Oracle數據庫非歸檔模式重做日志恢復方法
王超,祝永志
(曲阜師范大學信息科學與工程學院,山東日照276800)
摘 要:Linux系統是在企業中廣泛使用的操作系統,企業亦多基于該操作系統安裝數據庫。當數據庫運行在非歸檔模式中,且數據庫處于無日志備份的情況時,一旦重做日志文件丟失將會導致數據庫不可用。針對Oracle數據庫重做日志文件丟失問題,提出一種非歸檔模式下的重做日志恢復方法。實驗證明,該方法能有效實現重做日志的無備份恢復。
關鍵詞:Oracle數據庫;非歸檔模式;日志恢復;Linux
Oracle數據庫是廣泛應用的大型關系型數據庫,數據庫的高可用性是一個重要的研究課題,快速準確地恢復數據庫日志文件對提高數據庫可用性有重要意義。本文以Linux操作系統為基礎,針對非歸檔模式下重做日志文件丟失問題提出一種恢復方法。實驗表明,該方法能有效實現非歸檔模式下的重做日志文件恢復,實現數據庫的可用性。
重做日志文件(Redo Log File)用于保存表、索引或其他Oracle對象中添加、刪除或者改變數據的記錄。由于Oracle用循環的方式重復使用重做日志文件,因此每個Oracle數據庫有且至少有兩個重做日志文件。當一個重做日志文件充滿重做日志條目時,如果系統需要實例恢復,則當前的日志文件標記為ACTIVE;如果不需要實例恢復,則標記為INACTIVE;系統從文件開始按序列使用下一個日志文件,并將其標記為CURRENT[1]。在Oracle數據庫體系結構中,數據文件、控制文件、重做日志文件和歸檔日志文件等組成數據庫的文件系統,如圖1所示。
在現實使用中,為了保證數據庫穩定運行,通常需要對數據庫日志文件備份,日志文件與其鏡像文件記錄相同的日志信息,共同組成日志文件組。為了確保日志文件的安全,在同一個組中的日志文件通常會被放在不同的磁盤中[2]。日志文件丟失可能是由數據庫管理員(Database Administrator,DBA)操作引起不當,如誤刪日志文件,或由于磁盤存儲問題導致數據庫日志文件丟失。在重做日志文件丟失期間,可能會引起數據庫系統無法使用,此時一旦數據庫數據文件丟失,將無法及時恢復,有可能會造成極大的損失。因此,確保重做日志文件的安全性、冗余性對確保數據庫系統穩定是極為重要的。

圖1 Oracle數據庫系統結構
2.1歸檔模式
Oracle數據庫可以運行在歸檔(Archivelog)模式和非歸檔(Noarchivelog)模式。數據庫非歸檔模式只能用于保護數據庫實例失敗,而不能用于保護存儲介質失敗。為了防止數據庫物理文件損壞所導致的數據丟失,數據庫通常運行在歸檔模式下[3]。在實際的使用中,可能由于DBA的錯誤操作使數據庫系統運行在非歸檔模式下,此時一旦重做日志文件丟失,則無法通過歸檔日志恢復重做日志。在此前研究中,數據庫日志的備份與恢復策略大多是基于歸檔模式[4],在非歸檔模式下的數據庫恢復也大多是使用RMAN通過備份文件恢復[5-6]。
2.2一致性檢查
在Oracle數據庫啟動過程中,當啟系統動到裝載數據庫MOUNT狀態時會進行數據一致性檢查[7],如圖2所示。在重做日志丟失的情況下,無法完成數據一致性檢查,為了使數據庫恢復可用,需要通過修改系統隱藏參數,使數據庫在啟動時跳過一致性檢查。

圖2 Oracle數據庫啟動過程
2.3身份驗證
在Oracle數據庫日志文件丟失期間,數據庫無法正常啟動并進行基本的身份驗證。此時,對數據庫的操作需要通過SYS用戶進行,需通過操作系統認證(Operating System Authentication,OSA)的方式獲得SYS用戶權限。
3.1恢復方法概述
在Linux環境中,對非歸檔模式下故障的Oracle數據庫系統使用數據庫控制文件實現數據庫恢復,并通過修改Linux系統中Oracle數據庫的隱藏參數“-allow-resetlogscorruption”值實現跳過啟動一致性檢查,實現數據庫啟動,在此基礎上使用resetlogs方法完成重做日志文件的恢復。基于以上方法,進行以下實驗。
3.2實驗過程
實驗基于Linux環境中Oracle 11g R2數據庫系統,由于Linux文件系統與W indows文件系統的差別,其恢復過程與在W indows環境中的恢復過程存在一定差異。為了模擬實際使用中重做日志恢復效果,這里手動刪除redo01.log、redo02.log、redo03.log 3個日志文件。在實際操作中建議提前對數據文件備份,防止恢復失敗導致數據丟失。在實驗過程中也對一些常見的系統異常提示進行相應的處理,具體實驗操作如下。
(1)進入系統命令終端,通過OSA方式獲得SYS用戶權限,按照常規流程使用startup命令啟動Oracle數據庫進程:
SQL>startup
此時系統返回如下信息:
Oracle instance started.
……
Databasemounted
ORA-00313:open failed formembers of log group 1 of thread 1
ORA-27037:unable to obtain file status
Linux ERROR:2:No such file or directory
Additional information:3
(2)由于該數據庫文件系統缺少重做日志文件,系統提示無法找到文件,數據庫啟動過程中系統報錯。此時,可以使用下面的命令查詢當前數據庫的實例名、數據庫歸檔模式和打開模式,確定當前狀態所處開啟模式:
SQL>select name,log-mode from vMYMdatabase;
返回查詢結果如下:

NAME LOG-MODE OPEN-MODE ORCL NOARCHIVELOG MOUNTED
(3)這里的LOG-MODE為NOARCHIVELOG模式,說明數據庫處于非歸檔模式,且當前數據庫開啟到MOUNTED狀態。此時,使用resetlogs方法打開數據庫,輸入以下命令:
SQL>alter database open resetlogs;
系統返回信息如下:
……
ERROR at line 1:
ORA-01139:RESETLOGS option only valid after an complete database recovery
(4)根據系統提示,數據庫如果要使用resetlogs方法,則需要在一個系統恢復之后,因此,需先對數據庫實施數據恢復。在該實驗的情況中,由于實驗環境中僅重做日志文件丟失,而控制文件未丟失,此處可通過使用控制文件對數據庫進行恢復,使用如下命令:
SQL>recovery database using backup controlfile;
系統返回異常:
……
ORA-00308:cannot open archived log
ORA-27037:unable to obtain file status
Linux-x86-64 Error:2:No such file or directory
(5)該問題的產生是由于系統處于非歸檔模式下,系統提示錯誤,歸檔日志無法使用,但實際中數據庫恢復過程已經通過控制文件完成,此時再次使用resetlogs方法進行數據庫日志恢復,系統返回異常:
ORA-01113:file 1 needsmedia recovery
ORA-01110:data file 1:' /usr/app/oracle/oradata/orcl/
system01.dbf'
(6)該異常提示表明:如果要使用resetlogs方法恢復則需要通過恢復媒介,這里由于重做日志文件丟失,無法通過媒介來恢復。因此需要修改隱藏參數,讓Oracle數據庫忽略數據一致性檢查。使用以下命令:
SQL>alter system set”-allow-resetlogs-corruption”
=true scope=spfile;
System altered.
(7)在修改完此參數后,使用強制數據庫重啟命令啟動數據庫:
SQL>startup forcemount
系統返回如下信息:
……
Database mounted.
(8)數據庫裝載成功后,再次使用resetlogs方法執行數據庫恢復。在一段時間之后,系統返回信息“Database altered”。該信息表明數據庫重做日志恢復完成,打開文件所在目錄,實例文件夾中顯示redo01.log、redo02.log、redo03.log 3個日志文件,重啟數據庫即完成恢復。
(9)修改-allow-resetlogs-corruption參數為系統默認的false,則在啟動時進行數據一致性檢查:
SQL>alter system reset”-allow-resetlogs-corruption”scope=spfile;
(10)使用startup force命令重啟數據庫后,查詢修改的隱藏參數值:
SQL>selcet KSPPINM,KSPPSTVL from xMYMksppi a,
xMYMksppcv b where a.indx=b.indx and ksppinm like‘%resetlogs';
返回查詢結果如下:

KSPPINM KSPPSTVL -no-recovery-through-resetlogs FALSE -allow-resetlogs-corruption FALSE
(11)啟用Oracle數據庫的歸檔模式,增強數據庫系統的可用性:
SQL>alter database archivelog;
使用命令查看歸檔日志列表:
SQL>archive log list;
Database logmode Archive Mode Automatic archival Enable
得到以上返回信息說明數據庫已經運行在歸檔模式下,實驗完成。
通過實驗證明,本文提出的Oracle數據庫重做日志的恢復方法能夠有效實現在Linux系統下非歸檔模式重做日志文件的恢復,實現Oracle數據庫系統的故障恢復,提高數據庫系統的可用性。
參考文獻
[1]BRYLA B,LONEY K.Oracle database 11g DBA handbook[M]. New York:McGraw-Hill,2007.
[2]王偉平.Oracle 11g網絡大講堂[M].北京:清華大學出版社,2013.
[3]賀亞茹.Oracle數據庫日志文件損壞時修復方法的實驗研究[J].計算機應用,2009,29(S2):393-395.
[4]韋德強.Oracle數據庫的備份與恢復策略[J].電腦知識與技術,2010,6(19):5367-5370.
[5]王良瑩.Oracle數據庫故障恢復技術剖析[J].電腦編程技巧與維護,2011,50(14):123-124,135.
[6]劉超,張明安.基于Oracle數據庫系統的備份與恢復技術研究[J].軟件,2014,35(3):125-128.
[7]周文瓊,王樂球.Oracle數據庫啟動過程研究與實踐[J].軟件導刊,2011,10(7):169-171.
王超(1991 -),男,碩士研究生,主要研究方向:分布式數據庫。
祝永志(1964 -),男,碩士,教授,主要研究方向:并行與分布式計算、分布式數據庫。
引用格式:王超,祝永志.Oracle數據庫非歸檔模式重做日志恢復方法[J].微型機與應用,2016,35(10):79-81.
Method of redo log recovery for Oracle database in noarchivelog mode
Wang Chao,Zhu Yongzhi
(School of Information Science and Engineering,Qufu Normal University,Rizhao 276800,China)
Abstract:Linux operating system is widely used in the enterprise,and many enterprise installs database based on this operating system.When the database is running in noarchivelog mode,and there is no log backup for database,once the redo log file is lost,the database is not available.For this problem,a redo log recovery method in noarchivelog mode is proposed.The experiment shows that this method can effectively achieve the recovery of the redo log.
Key words:Oracle database;noarchivelogmode;log recovery;Linux
作者簡介:
收稿日期:(2016-01-25)
中圖分類號:TP311.13
文獻標識碼:A
DOI:10.19358 /j.issn.1674-7720.2016.09.027