程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 找回消失的聯機日志文件

找回消失的聯機日志文件

編輯:Oracle數據庫基礎
數據庫環境簡介:

  操作系統: Windows XP

  數據庫版本: Oracle 10.2.0.1

  歸檔模式: 非歸檔

  備份策略: 沒有任何的備份策略,無備份可用

  用途: 測試數據庫

  【故障描述】

  今天在啟動本機測試用數據庫時驚現數據庫無法啟動,提示如下:


  C:\>sqlplus / as sysdba 
  SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jun 16 18:25:43 2009 
  Copyright (c) 1982, 2005, Oracle. All rights reserved. 
  Connected to an idle instance
  SQL> startup; 
  Oracle instance started. 
  Total System Global Area 167772160 bytes 
  Fixed Size 1247876 bytes 
  Variable Size 75498876 bytes 
  Database Buffers 83886080 bytes 
  Redo Buffers 7139328 bytes 
  Database mounted. 
  ORA-00313: open failed for members of log group 1 of thread 1 
  ORA-00312: online log 1 thread 1: 'C:\Oracle\PRODUCT\10.2.0\ORADATA\SEC\REDO01.LOG' 
  SQL>

  如上提示,系統找不到聯機日志文件,一身冷汗,就算是測試數據庫也不能就這樣“掛”了啊!

  順著錯誤提示的目錄,進入到日志文件所在的目錄,哇塞,全部的日志文件都不見了!(現在想想,可能是因為這個測試數據庫我好久沒有問津了,也許在某一次的C盤文件批量整理的過程中連帶這些重要的文件一同“整理”掉了),心中不免有些緊張,轉念一想幸好是測試數據庫,釋然一下下,於是……我決定————恢復之,現把整個的恢復過程記錄如下,希望屏幕前的您不要再犯我這樣的錯誤了,作為一位DBA是絕對不應該允許自己犯這樣的錯誤,即使是純純的測試數據庫

  【故障分析】

  因為是全部的日志文件都被刪除了,所以既包含當前聯機日志,也包含非當前聯機日志,我恢復的順序是:先通過Clear的方式恢復非當前聯機日志,再通過設置隱含參數_allow_resetlogs_corruption=TRUE的方式恢復當前聯機日志(使用這種極端的恢復方式是我不想看到的,沒有辦法,誰叫我沒有備份呢,找了半天連冷備都沒做過。如果您有備份,記住要優先考慮使用備份進行恢復)。

【故障處理】

  1.通過v$log視圖確定哪些是當前聯機日志和非當前聯機日志


  SQL> select * from v$log; 
  GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM 
  ------- ------- ---------- -------- ------- --- -------- ------------- --------- 
  1 1 2 52428800 1 NO CURRENT 272945 16-JUN-09 
  3 1 1 52428800 1 NO INACTIVE 252940 16-JUN-09 
  2 1 0 52428800 1 YES UNUSED 0

  確定如下:

  group 1是當前聯機日志

  group 2 和group 3是非當前聯機日志

  2.通過Clear方式恢復非當前聯機日志group 2 和group 3


  SQL> alter database clear logfile group 2; 
  Database altered. 
  SQL> alter database clear logfile group 3; 
  Database altered.

  此時查看日志文件所在的目錄會依次恢復出兩個50M的日志文件REDO02.LOG和REDO03.LOG

  (注釋:如果是該日志組還沒有歸檔,則需要用如下的SQL命令進行操作

  alter database clear unarchived logfile group 2;)

  3.恢復當前聯機日志 group 1,先演示確認一下通過clear的方式無法恢復當前聯機日志


  SQL> alter database clear logfile group 1; 
  alter database clear logfile group 1 
  * 
  ERROR at line 1: 
  ORA-00313: open failed for members of log group 1 of thread 1 
  ORA-00312: online log 1 thread 1: 'C:\Oracle\PRODUCT\10.2.0\ORADATA\SEC\REDO01.LOG' 
  ORA-27041: unable to open file 
  OSD-04002: unable to open file 
  O/S-Error: (OS 2) The system cannot find the file specifIEd.

4.設置隱含參數_allow_resetlogs_corruption為“TRUE”

  生成pfile


  SQL> create pfile from spfile; 
  File created.

  停掉數據庫


  SQL> shutdown immediate; 
  ORA-01109: database not open 
  Database dismounted. 
  Oracle instance shut down.

  在生成的pfile(對應文件是C:\Oracle\product\10.2.0\db_1\database\INITsec.ORA)最後一行添加如下內容,保存退出

  _allow_resetlogs_corruption=TRUE

  5.使用pfile啟動數據庫到mount狀態


  SQL> startup mount pfile=C:\Oracle\product\10.2.0\db_1\database\INITsec.ORA; 
  Oracle instance started. 
  Total System Global Area 167772160 bytes 
  Fixed Size 1247876 bytes 
  Variable Size 75498876 bytes 
  Database Buffers 83886080 bytes 
  Redo Buffers 7139328 bytes 
  Database mounted.

  6.利用until cancel進行恢復


  SQL> recover database until cancel; 
  ORA-00279: change 274548 generated at 06/16/2009 19:15:54 needed for thread 1 
  ORA-00289: suggestion : C:\Oracle\PRODUCT\10.2.0\Flash_RECOVERY_AREA\SEC\ARCHIVELOG\2009_06_16\O1_MF_1_1_%U_.ARC 
  ORA-00280: change 274548 for thread 1 is in sequence #1 
  Specify log: {=suggested | filename | AUTO | CANCEL} 
  cancel 
  ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below 
  ORA-01194: file 1 needs more recovery to be consistent 
  ORA-01110: data file 1: 'C:\Oracle\PRODUCT\10.2.0\ORADATA\SEC\SYSTEM01.DBF' 
  ORA-01112: media recovery not started

7.resetlogs方式打開數據庫


  SQL> alter database open resetlogs; 
  Database altered.

  這時在日志文件所在的目錄中就可以看到被恢復出來的當前聯機日志REDO01.LOG

  8.到此,恢復過程完成,後續任務一:進行全庫的EXP備份

  C:\>exp system/system file=exp_full_backup.dmf log=exp_full_backup.log full=y

  9.後續任務二:取消隱含參數_all_resetlogs_corrupt

  10.後續任務三:重建數據庫

  11.後續任務四:使用IMP將剛剛備份的文件導入到數據庫

  12.檢查一下是否有無效的對象,處理之

  13.搞定!

  【總結】

  針對這個測試庫,如果我有備份,恢復過程將大大簡化,也許之需要這個過程1/10的時間。

  所以,

  請每一位親愛的DBA記住,為了縮短故障時間,最有效的方法就是——————備份!制定有效的備份策略,即便這個數據庫僅僅用於測試和娛樂。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved