程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle異機恢復,oracle恢復

Oracle異機恢復,oracle恢復

編輯:Oracle教程

Oracle異機恢復,oracle恢復


RMAN異機恢復注意事項:
1、RMAN 異機恢復的時候,db_name必須相同。 如果說要想改成其他的實例名,可以在恢復成功後,用nid 命令修改。 實例名的信息會記錄到控制文件裡,所以如果在恢復的時候,如果實例名不一致,恢復的時候會報錯。
2、如果恢復的路徑和源庫不一致,就需要在restore時用set 命令指定新位置。 並且使用switch datafile all將信息更新的到控制文件。在做duplicate的時候,RMAN 會自動根據pfile中的log_file_name_convert和db_file_name_convert來進行set 的轉換。 手工restore時,只能使用set 命令。

1. 在恢復機上准備好以下內容:
  》備份文件:
    /ora_rman_backup/20150618/{控制文件.bak ; 數據文件.bak ; 歸檔日志.bak ; 參數文件.bak; 口令文件.bak}
    注:將rman備份文件放到這裡,是因為在源DB上做RMAN備份時指定備份到這裡,若不建立同樣的目錄,
    下面恢復時,就都必須指定RMAN備份文件的位置。

  》OracleDB已經安裝好,並且配置了基本環境變量。
  》cd $ORACLE_HOME/dbs
     orapwd file=orapw$ORACLE_SID password=oracle
  》mkdir $ORACLE_BASE/oradata
     mkdir -pv $ORACLE_BASE/admin/$ORACLE_SID/{a,b,dp,u}dump

2. 恢復參數文件
  export ORACLE_SID=udpay
  rman target /
  RMAN> restore spfile to pfile '$ORACLE_HOME/dbs/initdave2.ora' from '/ora_rman_backup/20150618/dave_spfile_16m6qtde_1_1_20110309';
  或
    直接使用從源DB上復制過來的init$ORACLE_SID.ora 文件也可,只要復制到$ORACLE_HOME/dbs下,
  上面的ORACLE_SID配置了,也可以。

3. 還原控制文件
  》修改 參數文件:
    *.control_files='/oracle/oradata/orcl/control01.ctl','/oracle/oradata/orcl/control02.ctl','/oracle/oradata/orcl/control03.ctl'
  》恢復控制文件:
    RMAN> startup nomount;
    RMAN> restore controlfile from '/ora_rman_backup/20150618/ctl_20150618';

4. 啟動DB到mount
  RMAN> alter database mount;

5. 恢復archivelog
  RMAN> crosscheck archivelog all; 【含義參看】
  RMAN> crosscheck backup of archivelog all;
  RMAN> delete expired archivelog all;
  RMAN> list backup of archivelog all;
  RMAN> restore archivelog from sequence=642; //注:此642是指恢復archivelog時,從Sequence為4620的備份開始還原。
    BS 關鍵字 大小 設備類型占用時間 完成時間
    ------- ---------- ----------- ------------ ----------
    1 149.20M DISK 00:00:01 22-7月 -16
    BP 關鍵字: 1 狀態: AVAILABLE 已壓縮: NO 標記: TAG20160722T152937
    段名:/tmp/archlog_DBINFO_1

    備份集 1 中的已存檔日志列表
    線程序列 低 SCN 時間下限 下一個 SCN 下一次
    ---- ------- ---------- ---------- ---------- ---------
    1 642 126150727 19-7月 -16 126275396 22-7月 -16


6. 修改數據文件恢復的新路徑【報錯參考,見文末尾】
  # 查看恢復的控制文件中記錄的redolog的位置.
  # select group#, member from v$logfile;
  注:這些需要放到run 運行塊中。
  RMAN> run {
    allocate channel a1 type disk;
    allocate channel a2 type disk;
    set until sequence=4631 thread=1;
    set newname for datafile '/dev/udpay/lv_system01_1024m' to '/oracle/oradata/udpay/1024m_system01.dbf';
    set newname for datafile '/dev/udpay/lv_undo01_8192m' to '/oracle/oradata/udpay/8192m_undotbs01.dbf';
    set newname for datafile '/dev/udpay/lv_tools01_256m' to '/oracle/oradata/udpay/256m_users01.dbf';
    set newname for datafile '/dev/udpay/lv_users01_256m' to '/oracle/oradata/udpay/256m_tools01.dbf';
    set newname for datafile '/dev/udpay/lv_perf_256m' to '/oracle/oradata/udpay/256m_perf.dbf';
    set newname for datafile '/dev/udpay/lv_whtapp_data01' to '/oracle/oradata/udpay/whtapp_data01.dbf';
    set newname for datafile '/dev/udpay/lv_whtapp_data02' to '/oracle/oradata/udpay/whtapp_data02.dbf';
    set newname for datafile '/dev/udpay/lv_whtapp_data03' to '/oracle/oradata/udpay/whtapp_data03.dbf';
    set newname for datafile '/dev/udpay/lv_whtapp_index01' to '/oracle/oradata/udpay/whtapp_index01.dbf';
    set newname for datafile '/dev/udpay/lv_indx01_256m' to '/oracle/oradata/udpay/indx01.dbf';

    restore database; //這裡就是直接采用默認RMAN備份路徑中恢復數據文件。

    #注: RMAN中使用sql來執行SQL命令時,SQL命令需要用雙引號引起來, 並且,雙引號內部有單引號,則單引號要寫兩次.
    # 下面雙引號內部的都是單引號,並且都是雙寫的。
    sql "alter database rename file ''/dev/udpay/lv_redo11_256m'' to ''/oracle/oradata/udpay/256m_redo11.log''";
    sql "alter database rename file ''/dev/udpay/lv_redo12_256m'' to ''/oracle/oradata/udpay/256m_redo12.log''";
    sql "alter database rename file ''/dev/udpay/lv_redo21_256m'' to ''/oracle/oradata/udpay/256m_redo21.log''";
    sql "alter database rename file ''/dev/udpay/lv_redo22_256m'' to ''/oracle/oradata/udpay/256m_redo22.log''";
    sql "alter database rename file ''/dev/udpay/lv_redo31_256m'' to ''/oracle/oradata/udpay/256m_redo31.log''";
    sql "alter database rename file ''/dev/udpay/lv_redo32_256m'' to ''/oracle/oradata/udpay/256m_redo32.log''";
    sql "alter database rename file ''/dev/udpay/lv_redo41_256m'' to ''/oracle/oradata/udpay/256m_redo41.log''";
    sql "alter database rename file ''/dev/udpay/lv_redo42_256m'' to ''/oracle/oradata/udpay/256m_redo42.log''";
    sql "alter database rename file ''/dev/udpay/lv_redo51_256m'' to ''/oracle/oradata/udpay/256m_redo51.log''";
    sql "alter database rename file ''/dev/udpay/lv_redo52_256m'' to ''/oracle/oradata/udpay/256m_redo52.log''";
    sql "alter database rename file ''/dev/udpay/lv_redo61_256m'' to ''/oracle/oradata/udpay/256m_redo61.log''";
    sql "alter database rename file ''/dev/udpay/lv_redo62_256m'' to ''/oracle/oradata/udpay/256m_redo62.log''";

    switch datafile all;
    release channel a1;
    release channel a2;
  }


8. 在RMAN中執行數據庫一致性恢復
  rman target /
  RMAN> recover database;
  ------------------------------------------------------------------------------------------------------------------------------
  出現下面錯誤是正常的:
  RMAN-00571: =========================================
  RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===
  RMAN-00571: =========================================
  RMAN-03002: failure of recover command at 06/24/2015 16:02:25
  RMAN-06054: media recovery requesting unknown log: thread 1 scn 277200603
  ------------------------------------------------------------------------------------------------------------------------------

  若失敗則回到sqlplus 中嘗試:
  sqlplus /nolog;
  SQL> conn / as sysdba
  SQL> alter database open resetlogs;


補充1:
  這是另一次恢復Oracle數據庫時,出現的錯誤:
  RMAN> alter database open resetlogs;
  RMAN-00571: ===========================================================
  RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
  RMAN-00571: ===========================================================
  RMAN-03002: alter db 命令 (在 07/24/2016 16:36:40 上) 失敗
  ORA-01152: 文件 1 沒有從過舊的備份中還原
  ORA-01110: 數據文件 1: '/home/oracle/ora/oradata/dbinfo/system01.dbf'

  上面這個錯誤,網上有說:是system01.dbf中的頭部的SCN與控制文件中記錄的數據文件頭部SCN不同.
  解決方法:
    數據文件頭部start scn比控制文件記錄的數據庫文件頭部SCN要新,那麼
  就要使用日志(包括歸檔日志+聯機重做日志)前推控制文件中記錄的數據庫
  頭部SCN與數據文件start scn一致,就能保證打開數據庫。
  因為是使用備份的控制文件恢復數據庫,那麼就必須alter database open resetlogs打開數據庫

  sqlplus / as sysdba
  SQL> startup mount
  SQL> recover database using backup controlfile until cancel;
         # 注意:這一步,因為備份的控制文件沒有記錄聯機重做日志文件的scn,
   #         這裡需要手動輸入redo文件來取消恢復.
  ORA-00279: 更改 126276941 (在 07/22/2016 15:43:45 生成) 對於線程 1 是必需的
  ORA-00289: 建議:
  /home/oracle/ora/product/11.2.0.3/dbhome_1/dbs/arch1_644_810751417.dbf
  ORA-00280: 更改 126276941 (用於線程 1) 在序列 #644 中

  指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
  /tmp/redo01.log      #這是手動輸入備份的redolog文件.
  ORA-00310: 歸檔日志包含序列 642; 要求序列 644
  ORA-00334: 歸檔日志: '/tmp/redo01.log'
  注:
    總共有10個redolog,我都這樣執行了一次,不知道是否有必要.
  另注:
    我並不十分明白,這究竟是什麼原因,我還嘗試了使用ArchiveLog文件來恢復.
  但我發現歸檔文件依然不包含序列644.最後,我嘗試使用“alter database open resetlogs;”
  提示:
    alter database open resetlogs
    *
    第 1 行出現錯誤:
    ORA-01139: RESETLOGS 選項僅在不完全數據庫恢復後有效
    #  然後,我再次使用:
    alter database open;
    # 竟然打開了。神奇的事件。

補充2:
  執行:第6步時,出現以下錯誤:
  RMAN-00571: ===========================================================
  RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
  RMAN-00571: ===========================================================
  RMAN-03002: restore 命令 (在 07/24/2016 15:47:27 上) 失敗
  RMAN-06026: 有些目標沒有找到 - 終止還原
  RMAN-06023: 沒有找到數據文件4的副本來還原
  RMAN-06023: 沒有找到數據文件3的副本來還原
  RMAN-06023: 沒有找到數據文件2的副本來還原
  RMAN-06023: 沒有找到數據文件1的副本來還原

  此錯誤:網上描述這是Oracle10以後,出的一個新特性incarnation, 導致的錯誤。
    注: incarnation 是:為了解決還原resetlogs以前的備份,而出的一個特性;

    

  這個圖是我對incarnation的理解:
  意思是第一個不完全恢復到SCN(檢查點)700處,resetlogs後,incarnation+1,開始使用數據庫
  這時,SCN將從700處繼續增加,這時發現有些數據沒有,需要在往前還原, 就有了第
  二次不完全恢復,接著再繼續使用DB, 第三次,又發現還需要還原,但是, 是還原到
  前一次resetlogs後,SCN增長到800的地方的,但從上圖可以很清楚的知道, 現在若直接
  恢復到SCN800處,是第二次resetlogs後,SCN增長到800的地方,但現在要恢復到第一次
  resetlogs後,SCN增長的800的地方,就需要先回到incarnation 1的場景中。在做恢復就可以了。
  即:先reset database to incarnation 1; 在進行不完全恢復。

  還回到上面RMAN恢復時出現錯誤這個話題:
    由於當前版本是Oracle11.2.0.3,肯定是有Incarnation的問題的, 但事實上,我是做完全恢復,
  不需要incarnation特性,要想關閉它,可以直接修改 $ORACLE_HOME/dbs/init$ORACLE_SID.ora
  文件,將其中的下面兩個注釋掉,即直接在前面加“#”即可。
    #*.db_recovery_file_dest='/home/oracle/ora/flash_recovery_area'
    #*.db_recovery_file_dest_size=4070572032
  為何要這麼做? 【下面是我的理解,僅做參考】
    因為,異機恢復時,Incarnation特性,找恢復的SCN點時,這個SCN可能與備份集中的SCN一樣,就像
  上面第一次和第二次都包含SCN800一樣,因此,它從當前(就上上圖中從第二次resetlogs)的SCN中找
  恢復時指定的SCN點, 而這裡是沒有這些數據文件的。為了不讓Oracle采用這種機制,可將恢復文件
  位置注釋掉,這樣Oracle就不會到恢復文件目錄中找當前resetlogs後的備份集文件了。

第二個錯誤:
  SQL> startup
  #在Startup時,出現下面這個錯誤:[下面這個博客總結了這個錯誤.]
  # http://www.cnblogs.com/kerrycode/p/3656655.html

  ORA-01102: cannot mount database in EXCLUSIVE mode

  出現這種錯誤的三種情況:
      a、 Oracle的共享內存段或信號量沒有被釋放;
      b、 Oracle的後台進程(如SMON、PMON、DBWn等)沒有被關閉;
      c、 用於鎖內存的文件lk<sid>和sgadef<sid>.dbf文件沒有被刪除。【注:這個文件最好不要刪除,而是改名】

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved