熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle] 解析在沒有備份的情況下undo損壞怎麼辦

2013-11-13 22:25:11  來源: Oracle 
Oracle在運行中很不幸遇到undo損壞當然最好的方法是完全恢復但如果是在沒有備份的情況下undo損壞怎麼辦?以下就為大家介紹出現這種情況的解決辦法需要的朋友參考下  

  如果Oracle在運行中很不幸遇到undo損壞當然最好的方法是完全恢復不過如果沒有備份可以采用一種非常規的手段(利用Oracle的隱藏參數)如果此時undo包含未提交的事務會造成一點點的數據丟失(一般都是可忍受的)如果沒有未提交的事務則不會有數據丟失其主要步驟有

   修改undo表空間管理為手動
設置隱藏參數(_offline_rollback_segments或_corrupted_rollback_segments)標識受影響的回滾段使Oracle忽略其上的未提交事務
手動刪除受影響的回滾段和undo表空間然後重建新的undo表空間
還原undo表空間管理為自動

  實驗如下
Step
如果undo數據文件損壞數據庫只能到mount狀態open時會出現以下錯誤
ORA: cannot identify/lock data file see DBWR trace file
ORA: data file : I:INTEL_DATAODMSUNDOODMS
說明該undo文件已經損壞或丟失把該文件offline之後就可以打開數據庫了
SQL> alter database datafile I:INTEL_DATAODMSUNDOODMS offline drop;
SQL> alter database open;
打開數據庫的目的是為了找出受影響的回滾段
SQL> select segment_namestatus from dba_rollback_segs;

SEGMENT_NAME                   STATUS

SYSTEM                         ONLINE
_SYSSMU_$          OFFLINE
_SYSSMU_$           OFFLINE
_SYSSMU_$            OFFLINE
_SYSSMU_$           OFFLINE
_SYSSMU_$           OFFLINE
_SYSSMU_$           OFFLINE
_SYSSMU_$            OFFLINE
_SYSSMU_$           OFFLINE
_SYSSMU_$           OFFLINE
_SYSSMU_$           OFFLINE

  SQL> show parameter undo

  NAME                                 TYPE        VALUE

undo_management                      string      AUTO
undo_retention                       integer    
undo_tablespace                      string      undo
關閉數據庫
SQL> shutdown immediate;

  Step
創建一個臨時的pfile
SQL> create pfile=H:initODMSora from spfile;
修改pfile如下
*undo_management=manual   undo表空間管理方式修改為手動
*undo_tablespace=undo     指定一個新的undo表空間
*_offline_rollback_segments=(_SYSSMU_$_SYSSMU_$_SYSSMU_$_SYSSMU_$_SYSSMU_$_SYSSMU_$_SYSSMU_$_SYSSMU_$_SYSSMU_$_SYSSMU_$把所有受影響的回滾段都列在這裡
並以改pfile重新啟動數據庫
SQL> startup pfile=H:initODMSora

  Step
手動刪除受影響的回滾段
SQL>drop rollback segment "_SYSSMU_$";
SQL>drop rollback segment "_SYSSMU_$";
SQL>drop rollback segment "_SYSSMU_$";
SQL>drop rollback segment "_SYSSMU_$";
SQL>drop rollback segment "_SYSSMU_$";
SQL>drop rollback segment "_SYSSMU_$";
SQL>drop rollback segment "_SYSSMU_$";
SQL>drop rollback segment "_SYSSMU_$";
SQL>drop rollback segment "_SYSSMU_$";
SQL>drop rollback segment "_SYSSMU_$";
手動刪除舊的undo表空間
SQL> drop tablespace undo including contents;
重建新的undo表空間
SQL> create undo tablespace undo datafile I:INTEL_DATAODMSUNDOODMS size m;
創建新的spfile覆蓋舊的spfile
SQL> create spfile from pfile=H:initODMSora;
關閉數據庫
SQL> shutdown immediate;

  Step
以原來的spfile啟動數據庫
SQL> startup;
還原undo表空間管理為自動
SQL> alter system set undo_management=auto scope=spfile;
取消隱藏參數的設置
SQL> alter system reset "_offline_rollback_segments" scope=spfile;
重啟使其生效
SQL> shutdown immediate;
SQL> startup
SQL> show parameter undo

  NAME                                 TYPE        VALUE

undo_management                      string      AUTO
undo_retention                       integer    
undo_tablespace                      string      undo

  最終檢查一下
SQL> select segment_namestatus from dba_rollback_segs;

  SEGMENT_NAME                   STATUS

SYSTEM                         ONLINE
_SYSSMU_$          ONLINE
_SYSSMU_$          ONLINE
_SYSSMU_$          ONLINE
_SYSSMU_$          ONLINE
_SYSSMU_$          ONLINE
_SYSSMU_$          ONLINE
_SYSSMU_$          ONLINE
_SYSSMU_$            ONLINE
_SYSSMU_$           ONLINE
_SYSSMU_$           ONLINE


From:http://tw.wingwit.com/Article/program/Oracle/201311/19061.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.