Oracle 11g 不同目錄的冷備份解決方案

    前幾天,Oacle數據庫啓動不起來了,一啓動就死機,經過多次測試差錯發現是磁盤損壞,導致UNDOTBS01.DBF數據文件無法訪問,訪問就死機。無奈用冷備份的辦法,將數據庫遷移到另一臺主機上。

    Oracle 11g, 安裝在windows XP上,只是作爲平時開發用的數據庫,沒有多少維護,也沒有開啓歸檔日誌模式。(注:由於操作時沒有保存操作信息,也沒有可用的測試環境了,所以都是憑記憶還原步驟,不排除有不正確的操作和命令,僅作參考。)

    Step 1. 首先在目標主機上安裝Oracle 11g(和源數據庫相同),創建和源數據庫相同SID的數據庫。

    Step 2. 查找源數據庫裏的數據文件、REDO日誌文件、控制文件、啓動參數文件。

EXPRD是SID

  1. SQL> startup mount 
  2. ORACLE 例程已經啓動。 
  3.  
  4. Total System Global Area  770019328 bytes 
  5. Fixed Size                  1374780 bytes 
  6. Variable Size             293602756 bytes 
  7. Database Buffers          469762048 bytes 
  8. Redo Buffers                5279744 bytes 
  9. 數據庫裝載完畢。 
  10. SQL> select name from v$datafile; 
  11.  
  12. NAME 
  13. ------------------------------------------------------ 
  14. D:\APP\ADMINISTRATOR\ORADATA\EXPRD\SYSTEM01.DBF 
  15. D:\APP\ADMINISTRATOR\ORADATA\EXPRD\SYSAUX01.DBF 
  16. D:\APP\ADMINISTRATOR\ORADATA\EXPRD\UNDOTBS01.DBF 
  17. D:\APP\ADMINISTRATOR\ORADATA\EXPRD\USERS01.DBF 
  18. D:\APP\ADMINISTRATOR\ORADATA\EXPRD\EXAMPLE01.DBF 
  19. D:\APP\ADMINISTRATOR\ADMIN\EXPRD\TS_YTCLT01.DBF 
  20. D:\APP\ADMINISTRATOR\ADMIN\EXPRD\TS_YTEXP01.DBF 
  21. SQL> select member from v$logfile; 
  22.  
  23. MEMBER 
  24. --------------------------------------------------------------- 
  25. D:\APP\ADMINISTRATOR\ORADATA\EXPRD\REDO03.LOG 
  26. D:\APP\ADMINISTRATOR\ORADATA\EXPRD\REDO02.LOG 
  27. D:\APP\ADMINISTRATOR\ORADATA\EXPRD\REDO01.LOG 
  28.  
  29. SQL> select name from v$controlfile; 
  30.  
  31. NAME 
  32. --------------------------------------------------------------- 
  33. D:\APP\ADMINISTRATOR\ORADATA\EXPRD\CONTROL01.CTL 
  34. D:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\EXPRD\CONTROL02.CTL 

    Step 3. 關閉數據庫,將上面找到文件,複製到目標機器的數據庫目錄或自定義目錄內。由於知道UNDOTBS01.DBF文件損壞,一訪問就死機,所以最後複製它,做完第四步以後再複製,只能複製一部分文件,不過也可以,後面解決。

(由於我目標數據庫和源數據庫目錄結構不同,所以需要做4,5,6步。目錄結構完全一樣的可以省略4,5,6步。)

    Step 4. 在源數據庫上,備份啓動參數文件和控制文件創建sql,並拷貝到目標數據庫上。

  1. SQL> startup mount 
  2. SQL> create pfile='D:\backup_pfile.ora' from spfile; 
  3. SQL> alter database backup controlfile to trace 
  4. 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文件中的順序,單條命令手動執行,這樣可以方便的定位是在哪一步出的錯。

  1. SQL> startup nomount pfile='D:\backup_pfile.ora' 
  2. SQL> create spfile from pfile='D:\backup_pfile.ora'
  3. SQL> shutdown immediate 
  4. 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

  1. SQL> start mount 
  2. SQL> alter database datafile 'D:\oracle11g\data\UNDOTBS01.DBF' offline drop
  3. SQL> alter database open
  4. SQL> alter system set undo_management='MANUAL' scope=spfile; 
  5. SQL> create undo tablespace undotbs2 datafile 'D:\oracle11g\data\undotbs02.dbf' size 200M autoextend on
  6. SQL> alter system set undo_tablespace='undotbs2' scop=spfile; 
  7. SQL> alter system set undo_management='auto' scope=spfile; 
  8. SQL> shutdown immediate 
  9. SQL> startup  

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章