操作如下: 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...