最近公司在外面的一個數據庫服務器崩潰了。於是臨時恢復了一次數據庫。
最開始使用日誌文件來恢復,但是過程中發現日誌文件損壞了。
於是在網上找到了一些資料進行了重建控制文件進行不完全恢復。下面是這個過程。由於過程中沒有保存過程截圖,這裏只有一些步驟。
1、首先按照原來服務器上的路徑重新安裝ORACLE。
2、由於我們的表空間不在數據庫的ORADATA裏,所以通過語句重建了表空間文件。
3、在cmd下用sysdba登錄後,使用alter database backup controlfile to trace resetlog;導出控制文件。在udmp目錄下。
4、停服務。備份當前的ORADATA文件夾,然後清空當前ORADATA目錄,並把原來的備份拷貝到當前目錄下(只要DBF和ORA就可以了,日誌和控制文件不要)。清空ADMIN目錄下的各個文件夾內容,保留PFILE文件夾下的init.ora文件。
5、cmd下執行sqlplus /nolog,然後用conn as sysdba登錄
6、startup nomount
7、把第3步裏備份的創建控制文件的sql拷貝出來,保存爲d:/createcontrolfile.sql.
8、執行@d:/createcontrolfile.sql
9、shutdown immediate
10、關服務。
11、在admin/pfile目錄下的init.ora里加入隱含參數
_allow_resetlogs_corruption=true
_allow_terminal_recovery_corruption=true
12、執行startup pfile='amdin/pfile/init.ora(實際文件名和目錄按照實際走)' mount force;
13、執行alter database open resetlogs;
估計是不成功,然後也無法關閉數據庫了。
接着按照12條的語句啓動數據庫。
14、recover database;應該提示介質已恢復。
15、recover database until cancel;如果14已經成功,這條應該也成功,不成功也沒關係。
16、此時執行alter database open resetlogs;
查看trace,如果發現ora-00600 2662,則執行alter session set events '10015 trace name adjust_scn level 1(或者10)';
17、16執行完之後,如果alter database open restlogs;還是不成功,且變成600 4193,則需加入隱含參數:
_corrupted_rollback_segments=(_syssmu1$....._syssmu10$),具體要按照trace裏的undo數量而定。
18、現在會出現ORA-00604,不要着急,屏蔽掉上面的隱含參數後,修改隱含參數裏的undo_management=manual。
19、alter database open resetlog;應該就提示“數據庫已更改”,這樣就可以了。
20、如果要加入tempfile,執行alter tablespace TEMP add tempfile '目錄/temp01.ora' reuse;即可。
附:
如果錯誤顯示問號執行:alter session set nls_language=american;
清除日誌文件:alter database clear unarchived logfile group 1;