undo表空間損壞的處理過程

datapeng發表於2013-12-07
erpaa資料庫,因為儲存原因當機,undo表空間損壞的處理過程
資料庫在開啟rman備份時,突然出現掛載磁碟無法識別情況,導至資料庫當機。
處理過程如下:


--檢查資料庫狀態
C:\Documents and Settings\Administrator>sqlplus "/as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on 星期日 8月 19 11:49:13 2013
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
已連線到空閒例程。
SQL> startup
ORA-00376: 此時無法讀取檔案 18
ORA-01110: 資料檔案 18: 'Y:\ORADATA\UNDO\UNDO02.DBF'
資料庫啟動報錯,指出undo空間錯誤!經過分析,需要對undo空間進行重建

--備份引數檔案,準備修改引數啟動資料庫,檢視其它檔案的狀態。


SQL> create pfile='c:\pfilebak0819.ora' from spfile; 


嘗試啟動到mount狀態:


SQL> startup mount;


這時資料庫顯示啟動到了mount狀態,查詢一下資料庫檔案情況:


SQL> select name,status from v$datafile;


NAME                                     STATUS
---------------------------------------- -------
E:\ORACLE\ORADATA\erpaa\SYSTEM01.DBF    SYSTEM
E:\ORACLE\ORADATA\erpaa\UNDOTBS01.DBF   ONLINE
E:\ORACLE\ORADATA\erpaa\USERS01.DBF     ONLINE
E:\ORACLE\ORADATA\erpaa\XDB01.DBF       ONLINE
E:\ORACLE\ORADATA\erpaa\USER.ORA        ONLINE
Z:\ORADATA\USER\USER004.DBF              ONLINE
Y:\ORADATA\UNDO\UNDO02.DBF               RECOVER
Y:\ORADATA\UNDO\UNDO03.DBF               RECOVER

這裡發現undo空間需要恢復,所以先恢復一下資料庫,看能否恢復!


SQL> recover database;


Database recovered.


再次檢視的時候,仍然處理需要恢復的狀態。


--修改剛才備份的引數檔案pfile,資料庫啟動到不一致的狀態,新增undo表空間,並刪除原undo表空間


加上如下兩個引數:
*._allow_resetlogs_corruption=true
*._corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)


儲存後用pfile啟動


SQL> startup pfile='c:\pfilebak0819.ora';


啟動資料庫後,重新建立undo表空間。


SQL> CREATE UNDO TABLESPACE "UNDOTBS2"  DATAFILE 'E:\oracle\oradata\erpaa\undotbs02.dbf' SIZE 1024M REUSE AUTOEXTEND ON NEXT  2m MAXSIZE  4096M;


Tablespace created.


SQL> alter system set undo_tablespace=UNDOTBS2 scope=both;


System alerted.


SQL> drop tablespace UNDOTBS1 including contents and datafiles;


Tablespace droped.


再次查詢需要恢復的檔案,已經不存在了


SQL> select * from v$recover_file;


no rows selected


--再次關閉資料庫,並重啟,發現報錯。


SQL> shutdown immediate
 
把原來的引數進行修改,去掉隱含引數,再次啟動


SQL> startup pfile='c:\pfilebak0819.ora';


Errors in file e:\oracle\admin\erpaa\udump\erpaa_ora_1504.trc:
ORA-00600: 內部錯誤程式碼,引數: [25012], [1], [2], [], [], [], [], []


資料庫又報錯了,不過從這個錯誤引數來看,資料庫仍然需要undotsb1的檔案,所以把第一個undo建好,但不使用!


再次增加剛才的隱含引數進去,再不一致的情況下啟動。


SQL> startup pfile='c:\pfilebak0819.ora';


資料庫啟動後,重建undo1


SQL> CREATE UNDO TABLESPACE "UNDOTBS1"  DATAFILE 'E:\oracle\oradata\erpaa\undotbs01.dbf' SIZE 100m;


Tablespace created.


SQL> shutdown immediate;


關閉資料庫後,重新修改引數pfile檔案,


SQL> startup pfile='c:\pfilebak0819.ora';


資料庫啟動後,做了幾次日誌切換都沒有出現任何問題


SQL> alter system archive log current.


System alerted.


SQL> create spfile from pfile='c:\pfilebak0819.ora';




--但是,半個小時後,發現資料庫突然宕了,報錯如下:
BH (0x1DFE204C) file#: 2 rdba: 0x00800029 (2/41) class 21 ba: 0x1DABA000
  set: 5 dbwrid: 0 obj: -1 objn: 0
  hash: [1e7ffce8,1a7a994c] lru: [1dfe220c,1dfe1f1c]
  ckptq: [NULL] fileq: [NULL]
  st: XCURRENT md: NULL rsop: 0x00000000 tch: 3
  flags: gotten_in_current_mode
  LRBA: [0x0.0.0] HSCN: [0xffff.ffffffff] HSUB: [255] RRBA: [0x0.0.0]
*** 2013-08-19 14:10:17.000
ksedmp: internal or fatal error
ORA-00600: internal error code, arguments: [kcbgcur_6], [23], [], [], [], [], [], []


發現2號檔案還有問題,進行如下檢查:
SQL> startup 


資料庫能夠正常啟動,檢查檔案和回滾段。


SQL> select file_name,tablespace_name from dba_data_files where file# = 2


這時查詢發現2號檔案正是undotbs1的表空間檔案


SQL> select segment_name,status,tablespace_name from dba_rollback_segs


發現有11個undo段是undotsb1的,並且是offline狀態的,如下:
'_SYSSMU11$','_SYSSMU10$','_SYSSMU9$','_SYSSMU8$','_SYSSMU7$','_SYSSMU6$','_SYSSMU5$','_SYSSMU4$','_SYSSMU3$','_SYSSMU2$','_SYSSMU1$'


SQL> shutdown immediate


關閉資料庫,修改引數檔案pfile,做如下調整:


*._corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$,_SYSSMU11$)
undo_management=manual


SQL> startup pfile='c:\pfilebak0819.ora';


資料庫啟動後,這時候,需要把這些回滾段應該是原來undotbs1的,應該把它drop掉


SQL> drop rollback segment "_SYSSMU11$";


Rollback segment dropped


SQL> drop rollback segment "_SYSSMU10$";


Rollback segment dropped


SQL> drop rollback segment "_SYSSMU9$";


Rollback segment dropped


SQL> drop rollback segment "_SYSSMU8$";


Rollback segment dropped


SQL> drop rollback segment "_SYSSMU7$";


Rollback segment dropped


SQL> drop rollback segment "_SYSSMU6$";


Rollback segment dropped


SQL> drop rollback segment "_SYSSMU5$";


Rollback segment dropped


SQL> drop rollback segment "_SYSSMU4$";


Rollback segment dropped


SQL> drop rollback segment "_SYSSMU3$";


Rollback segment dropped


SQL> drop rollback segment "_SYSSMU2$";


Rollback segment dropped


SQL> drop rollback segment "_SYSSMU1$";


Rollback segment dropped


再次關閉和開啟資料庫


SQL> shutdown immediate;


修改pfile
*._corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$,_SYSSMU11$)
undo_management=manual
把第一條刪除,第二條改成AUTO


重新利用這個pfile開啟資料庫


SQL> startup pfile='c:\pfilebak0819.ora';
資料庫啟動後


SQL> create spfile from pfile='c:\pfilebak0819.ora';


至此,資料庫恢復正常!




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

相關文章