ORACLE 回滾段表空間資料檔案丟失或損壞處理方法(1) (轉)

amyz發表於2007-11-10
ORACLE 回滾段表空間資料檔案丟失或損壞處理方法(1) (轉)[@more@]

問題描述:
這是一個回滾段表空間資料丟失或損壞的情景,這時不能識別相應的資料檔案。當你試圖startup資料檔案時會報ORA-1157,ORA-1110,並且可能會伴隨著標識操作級別的錯誤,比如ORA-7360。當你試圖以shutdown normal或shutdown immediate關閉時會導至ORA-1116,ORA-1110,並可能伴隨標識級別的錯誤,比如ORA-7368,有時以正常方式shutdown資料庫根本shutdown不下來。

警告:
文章中所提及的步驟是供oracle的全球技術支援使用的。特別是步驟6中的_corrupted_rollback_segments引數,使用後需要重建資料庫,在使用這個參前請觀察一下所有其它的選項。

解決方法解釋:

如下的解決方法取於檢測問題出現時資料庫所處於狀態:

I. 資料庫是處於關閉狀態的。
試圖開啟資料庫時報ORA-1157和ORA-1110錯誤,這時的解決方法取於資料庫是否是正常shutdown的(使用normal或immediate選項。

I.A.資料庫是正常shutdown的

如果資料資料庫是正常shutdown的,最簡單的解決方法是以offline drop選項刪除丟失或損壞的資料檔案,以restriceted模式打個資料庫,刪除並重建這個資料檔案所屬的那個回滾表空間。如果資料庫是以shutdown abort或自己崩潰掉的則不要遵循這個過程。

步驟如下:

1、確認資料庫是正常shutdown的。可以檢查alter.log這個檔案,定位到最後幾行看是否可以看到如下的資訊:
  "alter database  dismount
  Completed: alter database  dismount"

這當然也包括以正常方式shutdown,接然試圖啟動資料庫確失敗的狀況。如果最近一次你是以shutdown abort方式關閉資料庫的或資料庫是自己crashed掉的,你應用使用下面的I.B的方法。

2、在init.ora中把屬於丟失資料檔案的回滾段從ROLLBACK_SEGMENTS引數中去掉。如果你不能確信是哪個回滾段,可以簡單的把ROLLBACK_SEGMENTS這個引數註釋掉。

3、以restricted模式mount資料庫
  STARTUP RESTRICT MOUNT;
 
4、Offline drop丟失或損壞的那個資料檔案。
  ALTER DATABASE DATAFILE '' OFFLINE DROP;
 
5、開啟資料庫
  ALTER DATABASE OPEN;
  如果返回"Statement processed"這條資訊,轉到第7步.
  如果得到ORA-604,ORA-376,和ORA-1110錯誤,轉到第6步。

6、因為開啟資料庫失敗,shutdown掉資料庫並且編輯int.ora這個檔案。註釋掉ROLLBACK_SEGMENTS這個引數,並且在init.ora檔案中加入如下一行:
  _corrupted_rollback_segments = (,...,)
  這個引數應當包含ROLLBACK_SEGMENTS中所有的回滾段。

需要注意的是這個引數只能在指定的情況下或在oracle的全球持術支援的指導下才應使用,然後以restricted模式開啟資料庫:
 

  STARTUP RESTRICT
 
7、刪除掉那個檔案所屬的回滾段表空間。
  DROP TABLESPACE INCLUDING CONTENTS;
 
8、重建回滾段表空間及回滾段,建立完後使它們online.

9、使資料庫所有都可用。
  ALTER SYSTEM DISABLE RESTRICTED SESSION;

10、在init.ora中把你重新建立的回滾段再一次包括進來,如果你使用了第6步則移除掉CORRUPTED_ROLLBACK_SEGMENTS這個引數。


I.B.資料庫不是正常shutdown的

這種情況,資料庫最近一次是用shutdown abort或crashed掉關閉,回滾段中幾乎一定包含著活動的事務。因此,壞的那個資料檔案不能離線(offline)或是drop掉,你必需從恢復這個檔案。如果資料為是處於非歸檔模式的,只有最近的一些事務日誌還沒有被重寫掉的情況你才能成功恢復這個檔案。如果這個檔案的備份也是無效的,聯絡一下oracle的技術支援吧。

步驟如下:

1、從備份中恢復丟失的那個資料檔案.

2、mount 上資料庫

3、如下的查詢:
  FILE#,NAME,STATUS FROM V$DATAFILE;
  如果資料檔案的狀態是offline的,你必需先把它聯機了:
  ALTER DATABASE DATAFILE '' ONLINE;
 
4、執行如下的查詢:

  SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#
  FROM V$LOG V1, V$LOGFILE V2
  WHERE V1.GROUP# = V2.GROUP# ;
 
  這將列出所有的聯機的重做日誌和他們的序號及首次改變號(first change numbers).
 
5、如果這個資料庫是非歸檔模式的,執行如下的查詢: 
  SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;
  如果其中的CHANG#比4中的最小的那個FIRST_CHANGE#大的話,用聯機日誌就可以完成恢復。
 
6、如果CHANG#比4中的最小的那個FIRST_CHANGE#小,則資料庫是不能恢復的,可以聯絡一下oracle的技術支援。 

譯者插入:如果你真是非歸檔方式且這個檔案的備份也是無效的,如果你認為可以丟失回滾段中的那事務,你可以用I.A中從第6步的方法,這時可以開啟資料庫,應立即做一個備份,因為庫中的資料有些不一致。

  RECOVER DATAFILE ''

7、確認所有的日誌都被恢復,只到你收到"Media recovery complete"資訊。

8、開啟資料庫

待續


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-981697/,如需轉載,請註明出處,否則將追究法律責任。

相關文章