前幾天,Oacle數據庫啓動不起來了,一啓動就死機,經過多次測試差錯發現是磁盤損壞,導致UNDOTBS01.DBF數據文件無法訪問,訪問就死機。無奈用冷備份的辦法,將數據庫遷移到另一臺主機上。
Oracle 11g, 安裝在windows XP上,只是作爲平時開發用的數據庫,沒有多少維護,也沒有開啓歸檔日誌模式。(注:由於操作時沒有保存操作信息,也沒有可用的測試環境了,所以都是憑記憶還原步驟,不排除有不正確的操作和命令,僅作參考。)
Step 1. 首先在目標主機上安裝Oracle 11g(和源數據庫相同),創建和源數據庫相同SID的數據庫。
Step 2. 查找源數據庫裏的數據文件、REDO日誌文件、控制文件、啓動參數文件。
EXPRD是SID
- 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文件損壞,一訪問就死機,所以最後複製它,做完第四步以後再複製,只能複製一部分文件,不過也可以,後面解決。
(由於我目標數據庫和源數據庫目錄結構不同,所以需要做4,5,6步。目錄結構完全一樣的可以省略4,5,6步。)
Step 4. 在源數據庫上,備份啓動參數文件和控制文件創建sql,並拷貝到目標數據庫上。
- 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文件中的順序,單條命令手動執行,這樣可以方便的定位是在哪一步出的錯。
- 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