Oracle常規恢復的實驗測試

shilei1發表於2013-04-20
---轉自guoyJoe

***********************************
                 使用者管理恢復
************************************
  


一、Oracle恢復的體系結構
二、恢復型別:例項恢復、介質恢復
1、例項恢復的前提是資料檔案、控制檔案和線上日誌均沒有損壞,完全自動
2、介質恢復:在檔案有物理損壞的情況下,將其還原、恢復、最後使資料庫得以正常開啟的操作稱為介質恢復,人工干預
三、恢復方式:完全恢復、不完全恢復
四、恢復技術:使用者管理恢復和RMAN恢復
    
           
                
五、完全恢復案例
      v$recover_file  //哪個檔案需要恢復 select file#,change# from v$recover_file;
      v$log           //線上日誌 select min(first_change#) from v$log where status!='INACTIVE';
      v$archived_log   //歸檔日誌 select min(first_change#) from v$archived_log;
      v$recovery_log  //需要哪些archvielog做恢復
1、***場景1:資料庫關閉時的恢復(system,sysaux,undo,whole database):system表空間為例(冷備)
      select * from v$dbfile;
      shutdown immediate;
      cp -rf /u01/app/oracle/oradata/ocp/* /backup/cold        --冷備整個資料檔案
      startup
      conn gyj/gyj
      insert into t1 values(4,'gyj4');
      commit;
      alter system switch logfile;  --切換日誌
      rm -rf system01.dbf          --冊除system系統表空間
      shutdown abort;               --異常關機
      cp /backup/cold/system01.dbf /u01/app/oracle/oradata/ocp/   --用備份先做還原
      startup;                      --會報錯:ORA-01157,ORA-01110
      recover datafile 1;           --恢復
      一直回車
      alter database open;
2、***場景2:資料庫開啟時的恢復以使用者資料的表空間為例(熱備)
     create tablespace tp5 datafile '/u01/app/oracle/oradata/ocp/tp5.dbf' size 10M;
     conn gyj/gyj
     create table t5 (id int,name varchar2(10)) tablespace tp5;
     insert into t5 values(1,'gyj1');
     commit;
     alter tablespace tp5 begin backup;   --熱備
     !cp /u01/app/oracle/oradata/ocp/tp5.dbf /backup/hot
     alter tablespace tp5 end backup;
     conn gyj/gyj
     insert into t5 values(2,'gyj2');
     commit;
     rm -rf tp5.dbf;
     alter database datafile 9 offline;
     !cp /backup/hot/tp5.dbf /u01/app/oracle/oradata/ocp/  --用備份先做還原
     recover datafile 9;                                   --恢復
     alter database datafile 11 online;
    
3、控制檔案的恢復
           select controlfile_sequence# from v$database;--當前控制元件檔案記錄的序列號
    select hxfil as file#,FHCSQ from x$kcvfh; 
           select controlfile_change# from v$database; --控制自身的檢查點
    select file#,checkpoint_change# from v$datafile_header;
           select checkpoint_change#  from v$database;  --資料庫的檢查點
           select file#,checkpoint_change#  from v$datafile; --從控制檔案中讀的scn
         
    (1)***場景1:控制檔案沒有全壞,有一個是好的
            rm -rf control02.ctl
            shutdown abort;
            cp control01.ctl  control02.ctl
            startup
    (2)***場景2:所有控制檔案都壞了,但損壞前有備份(二進位制)
            alter database backup controlfile to '/backup/control/control.bin';
            alter system checkpoint;
            rm -rf control*
            shutdown abort;
            cp /backup/control.bin control01.ctl
            cp /backup/control.bin control02.ctl
     cp /backup/control.bin control03.ctl
            startup
            select checkpoint_change# from v$database;
            select checkpoint_change# from v$datafile;
            select checkpoint_change# from v$datafile_header;
            recover database using backup controlfile;
            redologfile 一個個試
            alter database open resetlogs;
   (3)***場景3:所有控制檔案都壞了,但損壞前有備份(文字)
             alter database backup controlfile to trace as '/backup/control/control.txt';
             rm -rf control*
             shutdown abort;
             vi control.bak  --重構一個新的控制檔案
             conn /as sysdba
             @/backup/control/control.txt
             recover database;
             alter database open;

   (4) ***場景4:備份控制檔案的恢復,控制檔案中不包含資料檔案,但聯機日誌中有
           alter database backup controlfile to '/backup/control/control.bin';
           create tablespace tp6 datafile '/u01/app/oracle/oradata/ocp/tp6.dbf' size 10M;
           conn gyj/gyj
           create table t6(id int,name varchar2(10)) tablespace tp6;
           insert into t6 values(1,'gyj1');
           commit;
           rm -rf control*
           shutdown abort;
           cp /backup/control/control.bin  control01.ctl
           cp /backup/control/control.bin  control02.ctl
           cp /backup/control/control.bin  control03.ctl
           startup mount;
           select file#,checkpoint_change# from v$datafile;
           select file#,checkpoint_change# from v$datafile_header;
           alter database open; //提示控制檔案舊了
           recover database using backup controlfile;
          輸入:/oradata/orcl/redo01.log  --狀態是current
          提示有一個檔案不識別
          select file#,name from v$datafile;
          alter database rename file '/u01/app/oracle/product/11g/dbs/UNNAMED00005' to '/u01/app/oracle/oradata/ocp/tp6.dbf';  
   --看上面提示或 看alert.log日誌
          recover database using backup controlfile;
          輸入:/oradata/orcl/redo01.log  --一select * from v$log;
          alter database open resetlogs;
        
二、不完全恢復案例
   1、不完全恢復的動因
     (1)被動恢復:原計劃執行完全恢復,但是恢復的過程中發現recover命令需要的至少一個歸檔日誌或未歸檔的ACTIVE/CURRENT線上日誌損壞
     (2)主動恢復:由於人為錯誤碼或惡意篡改破壞了資料庫內大量的資訊(update,truncate)
  2、不完全恢復:recover命令的四種情況
     (1)精確到重做日誌的基於日誌序列號的“recover database until sequence”--僅適用RMAN
     (2)精確到到重做日誌的基於手動互動式的“recover database until cancel”--僅適用SQL*PLUS
     (3)精確到重做記錄的基於時間的 “recover database until time”--適用RMAN和SQL*PLUS
     (4)精確到重做記錄的基於SCN的“recover database until scn”--僅適用RMAN
3、基本時間的不完全恢復
(1)***場景1:誤操作刪除表,控制檔案沒損壞
     shutdown immediate;
     !cp /u01/app/oracle/oradata/ocp/*  /backup/cold/  --做一個冷備
     startup
     conn gyj/gyj
    insert into t1 values(3,'gyj3');
    commit;
    select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') from dual;--恢復此時間之前的資料
    insert into t1 values(4,'gyj4');
    commit;
    drop table t1;   --模擬誤操作
    shutdown immediate;
    rm -rf /u01/app/oracle/oradata/ocp/*.dbf    --刪除所有資料(不刪控制檔案和重做日誌檔案)
    cp -rf /backup/cold/*.dbf  /u01/app/oracle/oradata/ocp/  --restore所有資料
    startup mount;
    recover database until time '2013-03-29 09:49:05'; ---基於時間的不完全恢復
    alter database open resetlogs;
(2) ***場景1:誤操作刪除表,控制檔案也被損壞了
      shutdown immediate;
      !cp /u01/app/oracle/oradata/ocp/*  /backup/cold/  --做一個冷備
      startup
      conn gyj/gyj
      insert into t1 values(6,'gyj6');
      commit;
      select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') from dual;--誤操作前的時間
      2012-06-22:17:09:08
      insert into t1 values(7,'gyj7');
      commit;
      drop table t1;       --模擬誤操作
      shutdown abort;
      rm -rf /u01/app/oracle/oradata/ocp/*.dbf   --刪除資料檔案
      rm -rf /u01/app/oracle/oradata/ocp/*.ctl   --刪除控制檔案,(不刪除重做日誌檔案)
      cp -rf /backup/cold/*.dbf   /u01/app/oracle/oradata/ocp/  --還原所有資料
      cp -rf /backup/cold/*.ctl   /u01/app/oracle/oradata/ocp/    --還原控制檔案
      startup mount;
      recover database until time '2012-10-31:11:47:15' using backup controlfile; --用了備份的控制檔案
      alter database open resetlogs;
4、基本Cancel的不完全恢復
     (1)***場景1:寫到資料檔案,歸檔沒保留
         shutdown immediate;
         !cp -rf /u01/app/oracle/oradata/ocp/* /backup/cold/  --重生做一個冷備
  startup
         conn gyj/gyj
         insert into t1 values(4,'gyj4');
         commit;
         alter system switch logfile;
         insert into t1 values(5,'gyj5');
         commit;
         select group#,status from v$log; 
         alter system checkpoint; --寫到資料檔案,歸檔沒保留
  rm -rf /u01/app/oracle/oradata/ocp/*    --把所有的/oradata/orcl/* 全部刪掉
         shutdown abort;            
         cp /backup/cold/*.dbf /u01/app/oracle/oradata/ocp/   --controlfile,redolog都沒了
         cp /backup/cold/*.ctl /u01/app/oracle/oradata/ocp/ 
         startup mount;
;    recover database using backup controlfile until cancel; --用了備份的控制檔案
         --如歸檔存在,直接回車
         --如歸檔不存在,輸入cancel,因為redolog全刪了
         alter database open resetlogs;
         alter tablespace temp add tempfile '/u01/app/oracle/oradata/bxdb/temp.dbf' size 10M; 
         select *  from t;   --資料少了一條
         ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf' REUSE;


****************************************          
                      RMAN恢復
****************************************

1、RMAN完全恢復
(1)***場景1:引數檔案損壞
   backup spfile;
   --create pfile='/tmp/pfile.ora' from spfile;
   shutdown immediate;
   rm -rf $ORACLE_HOME/dbs/spfileocp.ora
   startup pfile='/tmp/pfile.ora' nomount;
   set dbid 43434343
   restore spfile from autobackup;
   restore spfile to '/temp/spfile.ora' from autobackup;
  
(2)***場景2:控制檔案損壞
     backup current controlfile;
     rm -rf control*
     startup nomount;
     set dbid=2690543208;
     restore controlfile from autobackup;--db_recovery_file_dest或$ORACLE_HOME/dbs(set dbid)
     alter database mount;
     recover database;
     alter database open resetlogs;
(3) ***場景3 system表空間資料檔案損壞
      backup database;
      rm -rf system01.dbf;
      shutdown abort;
      startup mount;
      restore datafile 1;
      recover datafile 1;
      alter database open;
(4)***場景4 undo表空間損壞
     startup mount;
     restore tablespace UNDOTBS1;
     recover database;
     alter database open;
(5)***場景5:磁碟損壞
     rm -rf tp1.dbf
     select name,file# from v$datafile;
     run{ shutdown abort;
     startup mount;
     set newname for datafile 6 to '/u01/app/oracle/oradata/ocm/tp1.dbf';
     restore  datafile 6;
     switch datafile 6 ;
     recover database;
     alter database open;}
(6)***場景6:普通資料檔案損壞
     rm -rf tp1.dbf
   方法一 
   run{
     shutdown abort;
     startup mount;
     restore datafile 6;
     recover datafile 6;
     alter database open;}
   方法二 
   run{
     sql 'alter database datafile 6 offline';
     restore datafile 6;
     recover datafile 6;
     sql 'alter database datafile 6 online';}
   方法三 
   run{
     shutdown abort;
     startup mount;
     sql 'alter database datafile 6 offline';
     alter database open;
     restore datafile 6;
     recover datafile 6;
     sql 'alter database datafile 6 online';}
(7)控制檔案無損的情況下,只讀檔案損壞
   ***場景1:只讀資料檔案丟失
          run{
    shutdown abort;
    startup mount;
           restore datafile 5;
           alter database open;}
  ***場景2:只讀資料檔案在例項執行時丟失
           run{
               sql 'alter database datafile 5 offline';
               restore datafile 5;
               sql 'alter database datafile 5 online';}
  ***場景3:只讀資料檔案內部資料塊損壞
          run{
              sql 'alter database datafile 5 offline';
              restore datafile 5 force;
              sql 'alter database datafile 5 online';}
***場景4:起先資料檔案備份時是隻讀狀態,後來其表空間改為讀寫狀態,但沒有備份,現資料檔案壞了
        run{
            sql 'alter database datafile 6 offline';
            restore datafile 6;
            recover datafile 6;
            sql 'alter database datafile 6 online';}
(8)控制檔案損壞的情況下,只讀檔案損壞
    分析只讀表空間在控制檔案的情況
        alter database backup controlfile to trace as '/backup/control.bak01';
        alter tablespace  read only;
        alter database backup controlfile to trace as '/backup/control.bak02';
        diff control.bak01 control.bak02     --比較兩個備份的控制檔案
alter database rename file '' to ''; --只讀表空間在重構時不考慮,要在資料庫開啟後,重新命名資料檔案
        alter database tp1 online;
   ***場景1:只讀資料檔案連同控制元件檔案一併損壞或丟失
          run{
      shutdown abort;
      startup nomount;
             restore controlfile from autobackup;
             alter  database mount;
             restore datafile 6;
             recover database;
             alter database open resetlogs;}
    
   ***場景2:在資料檔案為只讀狀態時,對該檔案和控制檔案進行了備份,隨且對該表空間改為讀寫狀態,但該檔案和控制檔案均未再有過備份,此時該資料檔案連同控制元件檔案一併損壞或丟失
         run{
      shutdown abort;
      startup nomount;
             restore controlfile from  '/backup/rman/full_0cnnlmfd_1_1';
             mount database;
             restore datafile 6;
             recover database;
             recover database;  --注意再次執行
             alter database open resetlogs;}

二、RMAN不完全恢復
(1)***場景1:基本時間的不完全恢復
     startup
     conn gyj/gyj
     insert into t1 values(6,'gyj6');
     commit;
     select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') from dual;
     insert into t1 values(9,'gyj9');
     commit;
     drop table t1; --誤操作
     run{
         shutdown abort;
         startup mount;
         set until time  "to_date('2013-04-14:11:42:18','yyyy-mm-dd:hh24:mi:ss')";
         restore database;
         recover database;
         alter database open resetlogs;}

(2)***場景2:基於sequence的不完全恢復
     conn gyj/gyj
     insert into t1 values(9,'gyj9');
     commit;
     alter system switch logfile;
     alter system switch logfile;
     alter system switch logfile;
     insert into t1 values(10,'gyj10');
     commit;
     alter system switch logfile;
     alter system switch logfile;
     insert into t1 values(11,'gyj11');
     alter system switch logfile;
     rman target /
     
     run{
     shutdown abort;
     startup mount;
     set until sequence 10 thread 1;
        restore database;
        recover database;
        alter database open resetlogs;}


***********************************************
                                         總結
***********************************************


一、關於recover database命令
  (1)SQL>recover database;
    該命令用來對所有資料檔案進行恢復,並且只能使用儲存在檔案系統上的歸檔日誌及線上日誌。使用此命令的前提是控制檔案不可以是還原或重建得來的。
    Oracle會以當前controlfile所記錄的SCN為準,利用archive log和 redo log的redo entry, 把相關的datafile 的 block恢復到“當前controlfile所記錄的SCN”
  (2)SQL>recover database using backup controlfile;
    該命令用來對所有資料檔案及控制檔案進行恢復,並且只使用儲存在檔案系統上的歸檔及線上日誌。
    Oracle需要把資料恢復到比當前controlfile所記錄的SCN還要靠後的位置(比如說,control file是backup controlfile , 或者 controlfile是根據trace create的。),這時候,就需要用using backup controlfile.   恢復就不會受“當前controlfile所記錄的SCN”的限制。
  (3)RMAN>recover database;
    該命令用來對所有資料檔案及控制檔案進行恢復,並且可以使用增量備份、備份中的和檔案系統上的歸檔日誌,以及線上日誌。
二、關於resetlogs命令
   (1)用備份的控制檔案做恢復必須要resetlogs,使用resetlogs的原因是recover命令只能修復控制檔案中資料庫物理結構資訊,而無法修改控制檔案中的當前重做日誌的序列號等資訊
   (2)不完全恢復的resetlogs
三、資料庫的化身--Incarnation
     v$database_incarnation
     RMAN>list incarnation

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/196700/viewspace-758961/,如需轉載,請註明出處,否則將追究法律責任。

相關文章