oracle數據恢復:利用ctl,dbf,log

       任何一種技術方案都有其使用場景,我這個主要是針對沒有dmp備份,卸載了數據庫,但是有實例的ctl,dbf和log文件都存在的情況。其實這種情況也蠻多的。

      網絡上說的情況大多比較複雜,要麼ctl丟失的,只有dbf,需要通過手段重建ctl和log文件,不過經過本人測試,重建ctl沒有成功,由於時間有限,沒來得及調研。

      本人恢復oracle背景是自己卸載了oracle10g,後來想起來自己有一個數據庫的數據是十分需要的,所以又折騰着恢復過來。在網絡上參考了一個恢復oracle11g的文章寫的,在oracle10g下親測可以用,發到這裏共享給大家。

     這裏順便補充一句:我也用網上提到的aul6 進行數據恢復,它是利用字典文件system01.dbf和業務實例文件(比如筆者的etl.dbf)將業務實例裏面的表恢復成建表語句和數據,不過遺憾的是,恢復的數據對中文的支持不好,有亂碼,而且,有很多表的某一列數據被拆分加入多個空格,造成數據恢復時候是亂碼,導致整體不可用,而我又沒有找到解決亂碼的方法,估計對純英文的支持比較好,故而只好放棄該方案。幸好我卸載以後,dbf,log,ctl文件都存在,恢復也就變得簡單了,因爲網絡上大多說的不詳細,將我的操作步驟詳細的給大家共享出來。

     首先安裝一個一模一樣的oracle10g,這個大家不要嫌麻煩,這是我目前感覺最簡單有效的方式了。安裝目錄跟以前一不一樣無所謂,因爲我們經常無法安裝一樣的目錄,比如筆者,因爲已經在機器安裝了oracle11g,在虛擬機重裝的oracle10g,只有一個c盤。新建的數據庫sid跟之前的一樣是有必要的。

     安裝好以後,將數據庫服務關閉掉,建議在cmd下利用語句完成。完整操作如下:

    sqlplus /nolog

    conn / as sysdba

    shutdown immediate

    關閉數據庫以後,將實例文件改個名字,比如筆者是orcl,改爲orcl2,將以前的orcl拷貝到該目錄下(如c:\oracle\product\10.2.0\oradata下面)。

    然後cmd下啓動數據庫,以無掛載的方式,如下:

    STARTUP NOMOUNT;

    此時,我們在cmd輸入如下命令:

    SELECT NAME FROM V$DATAFILE;

    得到結果如下:

NAME
--------------------------------------------------------------------------------

E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
E:\ORACLE\SWOA\SWOA\ETL.DBF
E:\ORACLE\SWOA\SWOA\AVPLAN.DBF

已選擇6行。

由結果我們看出,得到了是我們之前建立的數據庫dbf文件路徑,發現跟我們安裝的數據庫目錄(也就是剛纔拷貝到c:\oracle\product\10.2.0\oradata)是不一樣的。

同樣執行:

SELECT NAME FROM v$controlfile;

SELECT * FROM v$logfile;

發現ctl,log文件路徑也都是與安裝目錄文件不一致,利用以下命令修改:

alter database rename file '查詢出來的路徑' to '現在存放的路徑';

比如我是如下修改(log,ctl修改都是該語句):

alter database rename file 'E:\ORACLE\SWOA\SWOA\etl.DBF' to 'C:\oracle\p
roduct\10.2.0\oradata\orcl\etl.DBF';

如果之前所有的dbf文件都存在,並且都拷貝到了新的數據庫目錄下,那麼到此爲止,只要重啓數據庫,就已經ok了。

利用:ALTER DATABASE OPEN; 打開數據庫,或者shutdown,再重啓數據庫。

-----------------------華麗的分割線-------------

但是筆者由於業務數據的dbf習慣安裝在其他目錄下,不小心刪掉了一個,如上面的avplan.dbf,造成此處無法修改路徑,啓動數據庫也不成功,而事實上,這個業務庫也不是我們要恢復的,但它妨礙了我們。

嘗試刪除該條數據,由於數據庫未打開,刪除不了,所以筆者想了個辦法,將數據庫cmd下,shutdown,然後將之前改爲orcl2文件夾改回orcl,現有的orcl暫時改爲其他名字(如orcl1),(即還原爲安裝時狀態)然後啓動數據庫,建立了一個表空間avplan,dbf文件名字叫avplan.dbf。這時候在關閉數據庫,將avplan.dbf拷貝到orcl1下,並且將orcl1再改回orcl,剛纔的orcl你懂的,變爲其他名字(如orcl2)。這時,cmd下輸入:

STARTUP NOMOUNT;

這時數據庫重啓,在cmd下繼續輸入

alter database rename file 'E:\ORACLE\SWOA\SWOA\AVPLAN.DBF' to 'C:\oracle\p
roduct\10.2.0\oradata\orcl\AVPLAN.DBF';

ALTER DATABASE DATAFILE 'C:\oracle\p
roduct\10.2.0\oradata\orcl\AVPLAN.DBF' OFFLINE DROP;

這時候,這個影響我們的avplan.dbf就不起作用了。

這裏順便要提一下:如果不新建avplan.dbf,直接使用ALTER DATABASE DATAFILE 'C:\oracle\p
roduct\10.2.0\oradata\orcl\AVPLAN.DBF' OFFLINE DROP; 是不成功的。

還有一點是,新建的avplan.dbf只是權宜之計,不過不實行drop,啓動會報

Total System Global Area  293601280 bytes
Fixed Size                  1248624 bytes
Variable Size             100663952 bytes
Database Buffers          188743680 bytes
Redo Buffers                2945024 bytes
數據庫裝載完畢。
ORA-01122: 數據庫文件 6 驗證失敗
ORA-01110: 數據文件 6: 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\AVPLAN.DBF'
ORA-01203: 此文件的原型錯誤 - 創建 SCN 錯誤

----------------------華麗分割線---------------------

通過以上的方式之後,數據庫已經還原完成了。

shutdown

startup

成功!!


發佈了52 篇原創文章 · 獲贊 15 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章