undo表空間損壞

2021-07-26 13:54:50 字數 3098 閱讀 4066

操作如下:  sqlplus / as sysdba

繼續執行命令: alter database open

例項終止。強制斷開連線

recover database

recover datafile 1

recover datafile 2

系統提示 :介質恢復成功

以為恢復成功就,直接,startup force ,系統提示跟剛剛的一樣

例項終止。強制斷開連線

查詢系統的日誌檔案:d:\oracle\product\10.2.0\admin\hr\bdump

alert_hr.log

ora-01578: oracle 資料塊損壞 (檔案號 2, 塊號 89)

ora-01110: 資料檔案 2:'d:\oracle\product\10.2.0\oradata\hr\undotbs01.dbf'

發現是undotbs01,資料檔案損壞,

思路如下:(先把原來的undotbs offline 然後啟動資料庫,新建乙個undotbs2,然後,把系統預設的 undo表空間設定為tbs2)

這裡出現問題的是undo表空間,如果undo表空間中沒有要回滾的資料,那麼問題比較簡單,因為oracle可以更換undo表空間,只需要直接將undo表空間的資料檔案offline,啟動資料庫後,新建乙個undo表空間,並切換當前的undo表空間即可。

但是如果undo表空間中記錄了要回滾的資料,那麼恢復操作就會更複雜了。

嘗試offline出現問題的資料檔案:

alter database datafile'd:\oracle\product\10.2.0\oradata\hr\undotbs01.dbf' offline;

下線以後,直接再啟動資料庫

alter database open;

系統可能提示,開啟成功,也可能提示,資料庫無法找到對應的undotbs01.dbf檔案

,所以不用管他,檢視下系統當前的狀態

select status fromv$instance;

檢視資料庫是open狀態

下面可以為系統建立新的undo表空間,並實現切換:

create undo tablespaceundotbs2 datafile

'd:\oracle\product\10.2.0\oradata\hr\undotbs02.dbf'size 200m;

修改當前預設的undo表空間為tbs02

alter system setundo_tablespace = undotbs2;

修改過後,再次嘗試開啟資料庫(發現資料庫仍然無法開啟,並且停止都無法停止)

執行:shutdown  immediate(系統提示找不到對應的tbs01檔案)

show parameterundo_tablespace (顯示的也是tbs02)

分析:分明已經設定了對應的表空間為新建立的,但是系統重啟後,為什麼還是無法識別,還要找原來的undo表空間那(查詢資料後發現原來undo表空間儲存了回退字段,導致每次都要先載入這些回退字段,因為這些回退字段儲存在undotbs1中,所以需要先刪除掉這些回退字段

現在問題就是前面所提到的,offline的undo表空間中儲存著需要進行回滾的記錄,而這些記錄會導致資料庫部分內容還沒有最終恢復完成,在此之前受影響的部分物件是無法正常訪問的。

解決方案:

預設情況下,無法直接刪除這些回退字段,需要借助spfile啟動,增加一些隱藏引數以後才能刪除,處理方法如下

1:先查詢下那些裡邊儲存這待恢復的資料

select segment_name, owner,tablespace_name, status

from dba_rollback_segs;

segment_name owner tablespace_name status

2:修改系統的spfile啟動檔案,預設路徑如下

d:\oracle\product\10.2.0\admin\hr\pfile\init.ora.14201794940

需要修改的有兩個地方(修改為手動,並且,undo修改為新的undotbs2)

undo_management=manual

undo_tablespace=undotbs2

在檔案結尾增加隱藏引數

_offline_rollback_segments=(_syssmu1$,_syssmu2$,_syssmu3$,_syssmu4$,_syssmu5$,_syssmu6$,_syssmu7$,_syssmu8$,_syssmu9$,_syssmu10$)

修改後,再次啟動資料庫(因為無法執行 shutdown immediate,進行關閉重啟,所以先執行如下)

shutdown abort

startup pfile=』d:\oracle\product\10.2.0\admin\hr\pfile\init.ora.14201794940』

啟動資料庫,啟動時候,系統繼續報錯,還是提示找不到對應的tbs01

這個時候就可以刪除回退欄位了

drop rollback segment"_syssmu1$";

drop rollback segment"_syssmu2$";

drop rollback segment"_syssmu3$";

drop rollback segment"_syssmu4$";

drop rollback segment"_syssmu5$";

drop rollback segment"_syssmu6$";

drop rollback segment"_syssmu7$";

drop rollback segment"_syssmu8$";

drop rollback segment"_syssmu9$";

drop rollback segment"_syssmu10$";

刪除過以後,再次執行啟動資料庫操作

startup pfile=』d:\oracle\product\10.2.0\admin\hr\pfile\init.ora.14201794940』

執行以上命令以後,發現資料庫已經可以正常啟動了,查詢表,也可以查詢到資料了

,這個時候,趕緊exp,把資料倒出來,然後再重新安裝資料庫,問題至此得到解決

Undo表空間資料檔案損壞

undo表空間資料檔案和system表空間資料檔案都是資料庫的關鍵資料檔案,如果損壞會導致sql執行失敗,使用者無法登入,甚至例項崩潰等。同樣恢復undo表空間資料檔案也必須在資料庫mount狀態下進行。資料庫在執行過程中發現undo表空間資料檔案損壞,此時是無法正常關閉資料庫的 sql shutd...

重建Undo表空間

檢視各表空間名稱 select name from v tablespace 檢視某個表空間資訊 select file name,bytes 1024 1024 from dba data files where tablespace name like undotbs1 檢視回滾段的使用情況,哪...

undo表空間縮小

最近執行乙個資料量比較大的儲存過程,造成undo表空間達到16g左右,但是直接採用resize的方式又無法縮小其大 小,因此經網上搜尋,採用了undo表空間重建的方式來縮小去空間大小,具體步驟如下 1 建立備用undo表空間 create undo tablespace newundotbs dat...