歸檔模式下的備份與恢復

首先,將數據庫設置爲歸檔


歸檔模式下,可以用冷備,也可以用熱備,冷備方法同非歸檔模式(過程略)。

歸檔模式下的熱備:
    1) 查看有沒有其他用戶在熱備
 SQL> select * from v$backup;

    2) 將數據庫或表空間設置爲備份狀態
 SQL> alter database begin backup;
  --將整個數據庫設置爲備份狀態
 
 SQL> alter tablespace users begin backup;
  --將一個表空間設置爲備份狀態
 
    3) 在操作系統下拷貝文件
   操作系統下拷文件,必須在已設置爲備份狀態時才行,如果不設置爲備份狀態
 隨意拷,那這個拷貝是無效的,沒辦法恢復

    4) 結束數據庫或表空間的備份狀態
 SQL> alter database end backup;

 SQL> alter tablespace users end backup;

例:
    hot_get_file.sql
 set heading off;
 set feedback off;
 set pagesize 0;
 set trimspool on;
 spool /share/ocp/backup_script/hot_backup_command.sql;
 select 'alter database begin backup;' from dual
 union all
 select 'host cp '||name||' /u03/backup/' from v$datafile
 union all
 select 'host cp '||name||' /u03/backup/' from v$controlfile
 union all
 select 'host cp $ORACLE_HOME/dbs/spfile${ORACLE_SID}.ora /u03/backup/' from dual
 union all
 select 'host cp $ORACLE_HOME/dbs/orapw${ORACLE_SID} /u03/backup/' from dual
 union all
 select 'alter database end backup;' from dual;
 spool off;

 SQL> @/share/ocp/backup_script/hot_get_file.sql


自動熱備的實現
     參見非歸檔模式下的自動備份

SCN 
    SCN 是數據庫中一個非常重要的數據結構,可認爲是oracle的內部時鐘,是一個只會增長
    不少減少的一個數值,這個數值可以用來表示各種操作的時間點。 與備份恢複相關的重要SCN
    號有:
 1)數據文件頭的系統檢查的SCN號
  v$datafile_header.CHECKPOINT_CHANGE#

 2)控制文件中數據文件的系統檢查點SCN號
  v$datafile.CHECKPOINT_CHANGE#

     如果 v$datafile_header 和 v$datafile 記錄的數據文件
            SCN號不一致,就要進行介質恢復

 3)數據文件的終止SCN號
  v$datafile.LAST_CHANGE#  上次停庫時的SCN,只要是運行,該值就爲空
 
     這個SCN號主要是判斷啓動時,是否要進行實例恢復
 
    

歸檔模式下的完全恢復(控制文件完好的情況下)  

    歸檔模式下完全恢復的一般流程:
     1) 如果能夠offline就offline,如果不能offline就必須啓動到mount狀態。
     2) 還原數據文件
    把備份數據文件,拷貝過去
    cp  ...


     3) 應用日誌前滾
    recover datafile ......
    recover tablespace ......
    recover database


     4) online或alter database open

    1、恢復數據文件
 SQL> create table t1 as select * from scott.emp;
 SQL> create table t2 as select * from scott.emp;
 SQL> create table t3 as select * from scott.emp;

 SQL> select table_name,tablespace_name from user_tables;

 TABLE_NAME      TABLESPACE_NAME
 --------------- ------------------------------
 DEPT            T2
 EMP             T2
 BONUS           T2
 SALGRADE        T2
 T1              T2
 T2              T2
 T3              T2

 


 SQL> select TABLESPACE_NAME,FILE_NAME from dba_data_files
      order by tablespace_name;

 TABLESPACE_NAME                FILE_NAME
 ------------------------------ ---------------------  
 T1                             /u02/t101.dbf
 T2                             /u02/t201.dbf

 
 SQL> shutdown immediate;
 
 SQL> host rm /u02/t201.dbf

 SQL> startup
 
 ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
 ORA-01110: data file 7: '/u02/t201.dbf'

 可看到數據庫已無法啓動了,因爲剛纔刪除了數據文件 t201.dbf
 這時,不要急於馬上恢復t201.dbf,先把數據庫啓啓來,讓其他的有服務不要停止了

 SQL> alter database datafile 7 offline;

 SQL> alter database open;

 SQL> host cp /u03/backup/t201.dbf /u02/   --把備份文件拷過來

 SQL> recover datafile 7;
 ORA-00279: change 834606 generated at 06/17/2012 09:47:06 needed for thread 1
 ORA-00289: suggestion : /u02/arch_log/1_25_783790158.dbf
 ORA-00280: change 834606 for thread 1 is in sequence #25


 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
 auto   --輸入auto 讓他自己找歸檔日誌
 
 SQL> alter database datafile 7 online;


    2、磁盤壞了,數據文件丟了,而且磁盤目錄無法訪問,必須恢復到其他位置
 
 SQL> shutdown immediate;
 SQL> host rm /u02/t201.dbf

 SQL> startup

 SQL> alter database datafile '/u02/t201.dbf' offline;

 SQL> alter database open;

 SQL> host cp /u03/backup/t201.dbf /u03/  

 SQL> alter database rename file '/u02/t201.dbf' to '/u03/t201.dbf';

 SQL> recover datafile '/u03/t201.dbf';

 SQL> alter database datafile '/u03/t201.dbf' online;

    3、數據文件無備份的恢復
 無備份份的數據文件恢復前提:從創建開始的日誌文件一直要在

 SQL> create tablespace test datafile '/u02/test01.dbf' size 50m;
 SQL> alter system switch logfile;


 SQL> create table test1 tablespace test as select * from emp;
 SQL> alter system switch logfile;
 

 SQL> create table test2 tablespace test as select * from emp;
 SQL> alter system switch logfile;
 

 SQL> create table test3 tablespace test as select * from emp;
  SQL> alter system switch logfile;


 SQL> create table test4 tablespace test as select * from emp;


 SQL> host rm /u02/test01.dbf

 SQL> shutdown abort

 SQL> startup

 SQL> alter database datafile '/u02/test01.dbf' offline;

 SQL> alter database open;

 SQL> alter database create datafile '/u02/test01.dbf';

 

    4、恢復表空間
 SQL> create table a1 tablespace t1 as select * from scott.emp;
 SQL> alter system switch logfile;


 SQL> create table a2 tablespace t1 as select * from scott.emp;
 SQL> alter system switch logfile;

 SQL> create table a3 tablespace t1 as select * from scott.emp;
 SQL> alter system switch logfile;

 SQL> host rm /u02/t101.dbf

 SQL> startup
 
 ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
 ORA-01110: data file 6: '/u02/t101.dbf'

 SQL> alter database datafile '/u02/t101.dbf' offline;
  --在這裏,由於是在啓動階段報錯的,停在mount狀態,所以不能把tablespace
           offline,只能一個文件一個文件的 offline,如果表空間有多個文件,要
                  把所有的數據文件offline

     --如果是在打開狀態,可以 alter tablespace t1 offline;

 SQL> alter database open;

 SQL> host cp /u03/backup/t101.dbf /u02/  

 SQL> recover tablespace t1;

 SQL> alter tablespace t1 online;

    5、全庫恢復
 啓動到mount 把所有的數據文件還原,之後 SQL> recover database


控制文件的恢復
    實驗前先備份控制文件
 SQL> alter database backup controlfile to '/home/oracle/ctl.bak';
  SQL> alter database backup controlfile to trace as '/home/oracle/ctl.sql';

 進行一系統操作
  
 SQL> select name from v$controlfile;

 破壞,並以abort 方式關閉
 SQL> host rm /u01/app/oracle/oradata/orcl/control01.ctl
 SQL> host rm /u02/control02.ctl
 SQL> host rm /u03/control03.ctl
 SQL> shutdown abort


    有控制文件備份時的恢復

 SQL> startup
  這時由於控制文件的丟失無法啓動

 SQL> shutdown immediate;

 恢復過程:

 1) 拷備份的控制文件
   SQL> host cp /u03/backup/control01.ctl /u01/app/oracle/oradata/orcl/
  SQL> host cp /u03/backup/control02.ctl /u02/
  SQL> host cp /u03/backup/control03.ctl /u03/
 
 2) SQL> startup
     由於控制文件是老的,所以要前滾控制文件,讓數據文件、控制文件一致
    SQL> recover database using backup controlfile;
  auto  -- 讓自己去找歸檔

  完了以後,提示有個歸檔找不到,查一下確實也沒有這個歸檔,
  這樣極有可能是這個日誌還沒歸檔,這時用聯機日誌去前滾,再次運行

    SQL> recover database using backup controlfile;
  /u01/app/oracle/oradata/orcl/redo01.log  --一個一個去試聯機日誌了

    SQL> recover database using backup controlfile;
  /u01/app/oracle/oradata/orcl/redo02.log  --一個一個去試聯機日誌了

  提示恢復完成後,要以resetlogs 的方式打開數據庫,
         而打開後,最好把數據庫備份一下


    SQL> alter database open resetlogs  


    無備份的恢復:
 根據自身數據庫的情況,用腳本來創建控制文件(這種創建一定不要丟了一些數據文件、日誌文件)


 SQL> host rm /u01/app/oracle/oradata/orcl/control01.ctl
 SQL> host rm /u02/control02.ctl
 SQL> host rm /u03/control03.ctl

 SQL> shutdown abort;

 SQL> startup nomount


 寫個創建控制文件的腳本
 
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log'  SIZE 50M,
  GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log'  SIZE 50M,
  GROUP 4 '/u01/app/oracle/oradata/orcl/redo04.log'  SIZE 50M,
  GROUP 5 '/u01/app/oracle/oradata/orcl/redo05.log'  SIZE 50M
DATAFILE
  '/u01/app/oracle/oradata/orcl/system01.dbf',
  '/u01/app/oracle/oradata/orcl/undotbs01.dbf',
  '/u01/app/oracle/oradata/orcl/sysaux01.dbf',
  '/u01/app/oracle/oradata/orcl/users01.dbf',
  '/u02/example01.dbf',
  '/u02/t101.dbf',
  '/u03/t201.dbf',
  '/u02/users02.dbf',
  '/u02/bgts101.dbf',
  '/u02/ORCL/datafile/o1_mf_xx_7x5h9kv4_.dbf',
  '/u02/undo201.dbf',
  '/u02/perfstat01.dbf'
CHARACTER SET WE8ISO8859P1
;


 再運行這個腳本
 SQL> @/home/oracle/create_controlfile.sql

 運行該腳本後,數據庫自動MOUNT了
 
 
 SQL> recover database;
 SQL> alter database open;

 
不完全恢復:
    不完全恢復的基本流程:
 1) 關閉數據庫,對現場作個冷備
 
 2) 從備份中拷貝所有的數據文件

 3) 數據庫啓動到mount 執行一種方式的不完全恢復
    不完全恢復的方式有:
    基本時間的不完全恢復
                recover database until time 'yyyy-mm-dd hh24:mi:ss';
  如
  recover database until time '2012-06-17 14:23:55';

    基於SCN號的不完全恢復
  SQL> recover database until change ...
  RMAN> recover database until scn ...

    基於撤消的不完全恢復(常用於日誌丟失):
  SQL> recover database until cancel;
  RMAN> recover database until sequence;

 4) 以resetlogs 的方式打開數據庫

 5) 恢復後對數據庫做個備份
  

    例:誤刪除一個用戶的恢復(基於時間點的恢復,不涉及控制文件的變化)
 SQL> set time on
        14:36:32 SQL> drop user scott cascade;
 14:37:06 SQL> shutdown abort;

 1) 還原所有的數據文件
host cp /u03/backup/system01.dbf /u01/app/oracle/oradata/orcl/system01.dbf
host cp /u03/backup/undotbs01.dbf /u01/app/oracle/oradata/orcl/undotbs01.dbf
host cp /u03/backup/sysaux01.dbf /u01/app/oracle/oradata/orcl/sysaux01.dbf
host cp /u03/backup/users01.dbf /u01/app/oracle/oradata/orcl/users01.dbf
host cp /u03/backup/example01.dbf /u02/example01.dbf
host cp /u03/backup/t101.dbf /u02/t101.dbf
host cp /u03/backup/t201.dbf /u03/t201.dbf
host cp /u03/backup/users02.dbf /u02/users02.dbf
host cp /u03/backup/bgts101.dbf /u02/bgts101.dbf
host cp /u03/backup/o1_mf_xx_7x5h9kv4_.dbf /u02/ORCL/datafile/o1_mf_xx_7x5h9kv4_.dbf
host cp /u03/backup/undo201.dbf /u02/undo201.dbf
host cp /u03/backup/perfstat01.dbf /u02/perfstat01.dbf
host cp /u03/backup/test01.dbf /u02/test01.dbf   


 2)
    SQL> startup mount

 3)
    SQL> recover database until time '2012-06-17 14:36:29';
 
    SQL> alter database open resetlogs;


    誤刪除表空間的恢復(涉及到控制文件的變化)
 SQL> create table t1 tablespace test as select * from emp;
 SQL> alter system switch logfile;
 

 SQL> create table t2 tablespace test as select * from emp;
 SQL> alter system switch logfile;
 

 SQL> create table t3 tablespace test as select * from emp;
  SQL> alter system switch logfile;


 SQL> create table t4 tablespace test as select * from emp;

 15:44:43 SQL> drop tablespace test including contents and datafiles;


 在這裏由於表空間是正常刪除的,所以控制文件中已經沒有test表空間的信息了
 這時,不能拿這個控制文件來恢復test表空間,而要用以前備份的控制文件,
 且這個文件有test表空間信息

 
 1) 還原控制文件和所有數據文件
host cp /u03/backup/control01.ctl /u01/app/oracle/oradata/orcl/control01.ctl
host cp /u03/backup/control02.ctl /u02/control02.ctl
host cp /u03/backup/control03.ctl /u03/control03.ctl
  
host cp /u03/backup/system01.dbf /u01/app/oracle/oradata/orcl/system01.dbf
host cp /u03/backup/undotbs01.dbf /u01/app/oracle/oradata/orcl/undotbs01.dbf
host cp /u03/backup/sysaux01.dbf /u01/app/oracle/oradata/orcl/sysaux01.dbf
host cp /u03/backup/users01.dbf /u01/app/oracle/oradata/orcl/users01.dbf
host cp /u03/backup/example01.dbf /u02/example01.dbf
host cp /u03/backup/t101.dbf /u02/t101.dbf
host cp /u03/backup/t201.dbf /u03/t201.dbf
host cp /u03/backup/users02.dbf /u02/users02.dbf
host cp /u03/backup/bgts101.dbf /u02/bgts101.dbf
host cp /u03/backup/o1_mf_xx_7x5h9kv4_.dbf /u02/ORCL/datafile/o1_mf_xx_7x5h9kv4_.dbf
host cp /u03/backup/undo201.dbf /u02/undo201.dbf
host cp /u03/backup/perfstat01.dbf /u02/perfstat01.dbf
host cp /u03/backup/test01.dbf /u02/test01.dbf


 2) SQL> startup mount

 3)
    SQL> recover database until time '2012-06-17 15:44:40';
 
    SQL> alter database open resetlogs;


聯機日誌丟失的處理
    1、非活動組的丟失、損壞
 可以直接刪除掉
 也可以
 SQL> alter database clear logfile group 4;

    2、活動組和當前組的處理
 如果及時發現了,趕緊輸入
 SQL> alter system checkpoint;

 然後切日誌
 SQL> alter system switch logfile;

 之後
 SQL> alter database clear unarchived logfile group 4;
 
 修復完後要及時對數據庫備份,否則以後恢復時,剛纔第4組日誌沒歸檔,會導致恢復失敗


 如果沒有時發現,停庫重啓後,發現的
 那最好進行不完全恢復

 如果沒有備份,不能進行不完全恢復,用隱含參數強制打開數據庫,把數據導出去,
 再重新建庫,把數據導進來。

 隱含參數:
     SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;

 

 
   
 
 

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