王超,,祝永志
(曲阜師范大學 信息科學與工程學院,,山東 日照 276800)
摘要:Linux系統(tǒng)是在企業(yè)中廣泛使用的操作系統(tǒng),,企業(yè)亦多基于該操作系統(tǒng)安裝數據庫,。當數據庫運行在非歸檔模式中,,且數據庫處于無日志備份的情況時,一旦重做日志文件丟失將會導致數據庫不可用,。針對Oracle數據庫重做日志文件丟失問題,,提出一種非歸檔模式下的重做日志恢復方法。實驗證明,,該方法能有效實現重做日志的無備份恢復,。
關鍵詞:Oracle數據庫;非歸檔模式,;日志恢復,;Linux
0引言
Oracle數據庫是廣泛應用的大型關系型數據庫,數據庫的高可用性是一個重要的研究課題,,快速準確地恢復數據庫日志文件對提高數據庫可用性有重要意義,。本文以Linux操作系統(tǒng)為基礎,針對非歸檔模式下重做日志文件丟失問題提出一種恢復方法,。實驗表明,,該方法能有效實現非歸檔模式下的重做日志文件恢復,實現數據庫的可用性,。
1重做日志概述
重做日志文件(Redo Log File)用于保存表,、索引或其他Oracle對象中添加、刪除或者改變數據的記錄,。由于Oracle用循環(huán)的方式重復使用重做日志文件,,因此每個Oracle數據庫有且至少有兩個重做日志文件。當一個重做日志文件充滿重做日志條目時,,如果系統(tǒng)需要實例恢復,,則當前的日志文件標記為ACTIVE;如果不需要實例恢復,,則標記為INACTIVE,;系統(tǒng)從文件開始按序列使用下一個日志文件,,并將其標記為CURRENT[1]。在Oracle數據庫體系結構中,,數據文件,、控制文件、重做日志文件和歸檔日志文件等組成數據庫的文件系統(tǒng),,如圖1所示,。
在現實使用中,為了保證數據庫穩(wěn)定運行,,通常需要對數據庫日志文件備份,,日志文件與其鏡像文件記錄相同的日志信息,共同組成日志文件組,。為了確保日志文件的安全,,在同一個組中的日志文件通常會被放在不同的磁盤中[2]。日志文件丟失可能是由數據庫管理員(Database Administrator,,DBA)操作引起不當,,如誤刪日志文件,或由于磁盤存儲問題導致數據庫日志文件丟失。在重做日志文件丟失期間,,可能會引起數據庫系統(tǒng)無法使用,,此時一旦數據庫數據文件丟失,將無法及時恢復,,有可能會造成極大的損失,。因此,確保重做日志文件的安全性,、冗余性對確保數據庫系統(tǒng)穩(wěn)定是極為重要的,。
2日志恢復存在的問題
2.1歸檔模式
Oracle數據庫可以運行在歸檔(Archivelog)模式和非歸檔(Noarchivelog)模式。數據庫非歸檔模式只能用于保護數據庫實例失敗,,而不能用于保護存儲介質失敗,。為了防止數據庫物理文件損壞所導致的數據丟失,數據庫通常運行在歸檔模式下[3],。在實際的使用中,,可能由于DBA的錯誤操作使數據庫系統(tǒng)運行在非歸檔模式下,此時一旦重做日志文件丟失,,則無法通過歸檔日志恢復重做日志,。在此前研究中,數據庫日志的備份與恢復策略大多是基于歸檔模式[4],,在非歸檔模式下的數據庫恢復也大多是使用RMAN通過備份文件恢復[56],。
2.2一致性檢查
在Oracle數據庫啟動過程中,當啟系統(tǒng)動到裝載數據庫MOUNT狀態(tài)時會進行數據一致性檢查[7],如圖2所示,。在重做日志丟失的情況下,,無法完成數據一致性檢查,為了使數據庫恢復可用,,需要通過修改系統(tǒng)隱藏參數,,使數據庫在啟動時跳過一致性檢查。
2.3身份驗證
在Oracle數據庫日志文件丟失期間,,數據庫無法正常啟動并進行基本的身份驗證,。此時,對數據庫的操作需要通過SYS用戶進行,,需通過操作系統(tǒng)認證(Operating System Authentication,,OSA)的方式獲得SYS用戶權限。
3重做日志恢復
3.1恢復方法概述
在Linux環(huán)境中,,對非歸檔模式下故障的Oracle數據庫系統(tǒng)使用數據庫控制文件實現數據庫恢復,,并通過修改Linux系統(tǒng)中Oracle數據庫的隱藏參數“_allow_resetlogs_corruption”值實現跳過啟動一致性檢查,實現數據庫啟動,,在此基礎上使用resetlogs方法完成重做日志文件的恢復,?;谝陨戏椒?,進行以下實驗。
3.2實驗過程
實驗基于Linux環(huán)境中Oracle 11g R2數據庫系統(tǒng),,由于Linux文件系統(tǒng)與Windows文件系統(tǒng)的差別,,其恢復過程與在Windows環(huán)境中的恢復過程存在一定差異。為了模擬實際使用中重做日志恢復效果,,這里手動刪除redo01.log,、redo02.log、redo03.log 3個日志文件,。在實際操作中建議提前對數據文件備份,,防止恢復失敗導致數據丟失。在實驗過程中也對一些常見的系統(tǒng)異常提示進行相應的處理,,具體實驗操作如下,。
(1)進入系統(tǒng)命令終端,通過OSA方式獲得SYS用戶權限,,按照常規(guī)流程使用startup命令啟動Oracle數據庫進程:
SQL>startup
此時系統(tǒng)返回如下信息:
Oracle instance started.
……
Database mounted
ORA-00313:open failed for members of log group 1 of thread 1
ORA27037:unable to obtain file status
Linux ERROR:2:No such file or directory
Additional information:3
(2)由于該數據庫文件系統(tǒng)缺少重做日志文件,,系統(tǒng)提示無法找到文件,數據庫啟動過程中系統(tǒng)報錯,。此時,,可以使用下面的命令查詢當前數據庫的實例名、數據庫歸檔模式和打開模式,確定當前狀態(tài)所處開啟模式:
SQL>select name,log_mode from vMYMdatabase;
返回查詢結果如下:
(3)這里的LOG_MODE為NOARCHIVELOG模式,,說明數據庫處于非歸檔模式,,且當前數據庫開啟到MOUNTED狀態(tài)。此時,,使用resetlogs方法打開數據庫,,輸入以下命令:
SQL>alter database open resetlogs;
系統(tǒng)返回信息如下:
……
ERROR at line 1:
ORA01139:RESETLOGS option only valid after an complete database recovery
(4)根據系統(tǒng)提示,數據庫如果要使用resetlogs方法,,則需要在一個系統(tǒng)恢復之后,,因此,需先對數據庫實施數據恢復,。在該實驗的情況中,,由于實驗環(huán)境中僅重做日志文件丟失,而控制文件未丟失,,此處可通過使用控制文件對數據庫進行恢復,,使用如下命令:
SQL>recovery database using backup controlfile;
系統(tǒng)返回異常:
……
ORA00308:cannot open archived log
ORA27037:unable to obtain file status
Linuxx86_64 Error:2:No such file or directory
(5)該問題的產生是由于系統(tǒng)處于非歸檔模式下,系統(tǒng)提示錯誤,,歸檔日志無法使用,,但實際中數據庫恢復過程已經通過控制文件完成,此時再次使用resetlogs方法進行數據庫日志恢復,,系統(tǒng)返回異常:
ORA01113:file 1 needs media recovery
ORA01110: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 force mount
系統(tǒng)返回如下信息:
……
Database mounted.
(8)數據庫裝載成功后,,再次使用resetlogs方法執(zhí)行數據庫恢復。在一段時間之后,,系統(tǒng)返回信息“Database altered”,。該信息表明數據庫重做日志恢復完成,打開文件所在目錄,,實例文件夾中顯示redo01.log,、redo02.log、redo03.log 3個日志文件,,重啟數據庫即完成恢復,。
(9)修改_allow _resetlogs_corruption參數為系統(tǒng)默認的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’;
返回查詢結果如下:
(11)啟用Oracle數據庫的歸檔模式,,增強數據庫系統(tǒng)的可用性:
SQL>alter database archivelog;
使用命令查看歸檔日志列表:
SQL>archive log list;
Database log mode Archive Mode Automatic archival Enable
得到以上返回信息說明數據庫已經運行在歸檔模式下,,實驗完成。
4結論
通過實驗證明,,本文提出的Oracle數據庫重做日志的恢復方法能夠有效實現在Linux系統(tǒng)下非歸檔模式重做日志文件的恢復,,實現Oracle數據庫系統(tǒng)的故障恢復,提高數據庫系統(tǒng)的可用性,。
參考文獻
?。?] BRYLA B,LONEY K.Oracle database 11g DBA handbook[M].New York:McGrawHill,2007.
[2] 王偉平.Oracle 11g網絡大講堂[M].北京:清華大學出版社,,2013.
?。?] 賀亞茹.Oracle數據庫日志文件損壞時修復方法的實驗研究[J].計算機應用,2009,,29(S2):393395.
?。?]韋德強.Oracle數據庫的備份與恢復策略[J].電腦知識與技術,2010,,6(19):53675370.
?。?] 王良瑩.Oracle數據庫故障恢復技術剖析[J].電腦編程技巧與維護,2011,,50(14):123124, 135.
?。?] 劉超,張明安.基于Oracle數據庫系統(tǒng)的備份與恢復技術研究[J].軟件,,2014,,35(3):125128.
[7] 周文瓊,王樂球.Oracle數據庫啟動過程研究與實踐[J].軟件導刊,,2011,,10(7):169171.