前幾天,Oacle數據庫啓動不起來了,一啓動就死機,通過屢次測試差錯發現是磁盤損壞,致使UNDOTBS01.DBF數據文件沒法訪問,訪問就死機。無奈用冷備份的辦法,將數據庫遷移到另外一臺主機上。sql
Oracle 11g, 安裝在windows XP上,只是做爲平時開發用的數據庫,沒有多少維護,也沒有開啓歸檔日誌模式。(注:因爲操做時沒有保存操做信息,也沒有可用的測試環境了,因此都是憑記憶還原步驟,不排除有不正確的操做和命令,僅做參考。)數據庫
Step 1. 首先在目標主機上安裝Oracle 11g(和源數據庫相同),建立和源數據庫相同SID的數據庫。windows
Step 2. 查找源數據庫裏的數據文件、REDO日誌文件、控制文件、啓動參數文件。oracle
EXPRD是SIDapp
- SQL> startup mount
- ORACLE 例程已經啓動。
- Total System Global Area 770019328 bytes
- Fixed Size 1374780 bytes
- Variable Size 293602756 bytes
- Database Buffers 469762048 bytes
- Redo Buffers 5279744 bytes
- 數據庫裝載完畢。
- SQL> select name from v$datafile;
- NAME
- ------------------------------------------------------
- D:\APP\ADMINISTRATOR\ORADATA\EXPRD\SYSTEM01.DBF
- D:\APP\ADMINISTRATOR\ORADATA\EXPRD\SYSAUX01.DBF
- D:\APP\ADMINISTRATOR\ORADATA\EXPRD\UNDOTBS01.DBF
- D:\APP\ADMINISTRATOR\ORADATA\EXPRD\USERS01.DBF
- D:\APP\ADMINISTRATOR\ORADATA\EXPRD\EXAMPLE01.DBF
- D:\APP\ADMINISTRATOR\ADMIN\EXPRD\TS_YTCLT01.DBF
- D:\APP\ADMINISTRATOR\ADMIN\EXPRD\TS_YTEXP01.DBF
- SQL> select member from v$logfile;
- MEMBER
- ---------------------------------------------------------------
- D:\APP\ADMINISTRATOR\ORADATA\EXPRD\REDO03.LOG
- D:\APP\ADMINISTRATOR\ORADATA\EXPRD\REDO02.LOG
- D:\APP\ADMINISTRATOR\ORADATA\EXPRD\REDO01.LOG
- SQL> select name from v$controlfile;
- NAME
- ---------------------------------------------------------------
- D:\APP\ADMINISTRATOR\ORADATA\EXPRD\CONTROL01.CTL
- D:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\EXPRD\CONTROL02.CTL
Step 3. 關閉數據庫,將上面找到文件,複製到目標機器的數據庫目錄或自定義目錄內。因爲知道UNDOTBS01.DBF文件損壞,一訪問就死機,因此最後複製它,作完第四步之後再複製,只能複製一部分文件,不過也能夠,後面解決。ide
(因爲我目標數據庫和源數據庫目錄結構不一樣,因此須要作4,5,6步。目錄結構徹底同樣的能夠省略4,5,6步。)測試
Step 4. 在源數據庫上,備份啓動參數文件和控制文件建立sql,並拷貝到目標數據庫上。spa
- SQL> startup mount
- SQL> create pfile='D:\backup_pfile.ora' from spfile;
- SQL> alter database backup controlfile to trace
- as 'D:\backup_ctlfile_trace.sql';
Step 5. 修改生成的backup_pfile.ora和backup_ctlfile_trace.sql文件中的目錄,改爲目標數據庫上對應的目錄結構。日誌
Step 6. 用backup_pfile.ora啓動目標數據庫,並運行backup_ctlfile_trace.sql重建控制文件。最好是按照sql文件中的順序,單條命令手動執行,這樣能夠方便的定位是在哪一步出的錯。xml
- SQL> startup nomount pfile='D:\backup_pfile.ora'
- SQL> create spfile from pfile='D:\backup_pfile.ora';
- SQL> shutdown immediate
- SQL> @backup_ctlfile_trace.sql
在執行backup_ctlfile_trace.sql重建控制文件的時候,會報錯,由於咱們的UNDOTBS01.DBF拷貝不全,是損壞的文件,因此致使重建控制文件失敗。錯誤的意思是實際文件比記錄的文件小(ORA-01200: 255360 的實際文件大小小於 264960 塊的正確大小 / ORA-01200: actual file size of 255360 is smaller than correct size 264960 blocks)
Step 7. 補全UNDOTBS01.DBF。
1. 首先計算缺失的字節數(264960-255360) * 8192 = 78643200
2. 生成一個指定大小的文件D:\fsutil file createnew append.dbf 78643200
3. 附加到數據文件末尾D:\type append.dbf >> <path>\UNDOTBS01.DBF
4. 再次執行backup-ctlfile_trace.sql執行成功
Step 8. 因爲undotbs01.dbf文件是損壞的,因此數據庫尚未圓滿解決。離線UNDOTBS01.DBF, 在重建UNDO TABLESPACE
- SQL> start mount
- SQL> alter database datafile 'D:\oracle11g\data\UNDOTBS01.DBF' offline drop;
- SQL> alter database open;
- SQL> alter system set undo_management='MANUAL' scope=spfile;
- SQL> create undo tablespace undotbs2 datafile 'D:\oracle11g\data\undotbs02.dbf' size 200M autoextend on;
- SQL> alter system set undo_tablespace='undotbs2' scop=spfile;
- SQL> alter system set undo_management='auto' scope=spfile;
- SQL> shutdown immediate
- SQL> startup