Oracle冷備份級冷備份的不完全恢復

mahanso發表於2010-12-20
一、Oracle  冷備份通常步驟:
今天看到一個非常好冷備份的博文,一目瞭然:http://space.itpub.net/12778571/viewspace-166613

1  正常關閉資料庫
2  備份所有重要的檔案到備份目錄(資料檔案、控制檔案、重做日誌檔案等)
3  完成備份後啟動資料庫
  用冷備份進行恢復時,只需要將所有檔案恢復到原有位置,就可以啟動資料庫了 。

1  進入資料庫#sqlplus "/as sysdba"
2  如果沒有啟動則要啟動:SQL>startup
3  查詢資料檔案datafile的所在目錄:
SQL>SELECT name FROM v$datafile;
     查詢控制檔案controlfile的所在目錄:
 SQL>SELECT name FROM v$controlfile;
     查詢重做日誌檔案的所在目錄:
  SQL>SELECT member FROM v$logfile;
4  關閉資料庫
   SQL>shutdown
5  備份檔案到備份的目錄
    #cp /u01/app/oracle/oradata/orcl/*.dbf  /home/mzl/BackupDatabase
    #cp /u01/app/oracle/oradata/orcl/*.ctl  /home/mzl/BackupDatabase
    #cp /u01/app/oracle/oradata/orcl/*.log  /home/mzl/BackupDatabase
6  然後啟動資料庫
   #sqlplus "/as sysdba"
   SQL>startup

二、oracle冷備份下的不完全恢復

完全恢復:基於三種情況
  一 冷備份.
     建立表空間test,使用者test,表名test 插入資料
  insert into test.test(a,b) values(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate,'yyyy-mm-dd hh24:mi’));
  commit;
  alter system  archive log  current;
  進行了兩個事務(commit)和日誌切換
  commit;
  alter system  archive log  current;日誌切換同時歸檔
  
  select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
  1  984675  983549  984675 初始備份時的scn
  此時進行冷備份
  執行shutdown immediate
  複製所有的資料檔案,控制檔案,線上日誌檔案,歸檔日誌檔案,如果需要,spfile,密碼檔案
  最好多複製幾份,以便反覆測試使用。
  二、新增資料檔案
  startup
  開啟資料庫
  刪除test.test 表中的所有資料
  然後插入資料
  insert into test.test(a,b) values(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate,'yyyy-mm-dd hh24:mi’));
  commit;
  alter system  archive log  current;
  進行了兩個事務(commit)和日誌切換
  commit;
  前14條每兩個進行一個commit,同時alter system  archive log  current;
  後面的
  每一個進行commit;
  alter system  archive log  current;
  select * from test.test
    產生scn的歷史記錄是
  select * from V$log_History
    21  21  577298563  1  21  988328  2005-12-17 16:42:08  988445
  此時
  select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
  1  987945  987670  987945
  shutdown immediate ;
  再次完全冷備份當前的資料檔案、控制檔案、日誌檔案,歸檔日誌檔案(沒有歸檔日誌檔案恢復就成了空話)(當不完全恢復不成功或反覆使用時使用,這點很重要,在實際你的生產執行資料庫恢復時也是要這樣。)


  
恢復:三種方法
  基於時間
  (alter database ) recover database (automatic) until time ‘2005-12-16 11:09:01’;
  (alter database ) recover database (automatic) until time ‘2005-12-16 11:09:01’ using backup controlfile;
  
  基於變更
  (alter database ) recover database   until change 985822;
  (alter database ) recover database   until change 985822using backup controlfile;
  
  基於撤銷
   (alter database ) recover database until cancel ;
  (alter database ) recover database until cancel until change 985822using backup controlfile;
  這裡的是否使用控制檔案,取決於原有的控制檔案是否損壞,和控制檔案發生了變化(比如刪除了表空間的操作,而,刪除資料和表的操作時不會影響到控制檔案的變化)
  
  A、  基於時間恢復(不使用備份的控制檔案)
  shutdown immediate
  使用原來備份的資料檔案,控制檔案使用最新的,而不是備份的資料檔案;
  SQL> shutdown immediate
  資料庫已經關閉。
  已經解除安裝資料庫。
  ORACLE 例程已經關閉。
  SQL> startup mount
  ORACLE 例程已經啟動。
  
    資料庫裝載完畢。
  SQL> recover database until time  '2005-12-17 16:30:07' ;
  ORA-00279: 更改 984674 (在 12/17/2005 16:14:05 生成) 對於執行緒 1 是必需的
  ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00003.001
  ORA-00280: 更改 984674 對於執行緒 1 是按序列 # 3 進行的
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  auto
  ORA-00279: 更改 985596 (在 12/17/2005 16:28:34 生成) 對於執行緒 1 是必需的
    
  
  已應用的日誌。
  完成介質恢復。
  SQL> alter database open resetlogs;
  
  資料庫已更改。
  ------------------------------
  到此恢復成功
  因為使用的是介質恢復(不完全恢復)
  故一定要使用resetlogs,重置日誌序列號,和將日誌scn歸零,當再次新增資料或引起scn變化的時候 archive_change#將得到和其他連個相近(?)的數字
  可以查詢一下
  
  
  SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
  
  CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
  ------------------ --------------- -------------------
              985935               0              985997
  
  
  SQL> select * from test.test;
  
  A                    B
  -------------------- --------------------
    
  已選擇6行。
  查詢第六行的時間和log_history的記錄發現是scn=985822
  故恢復的時候如果直接恢復到第六條資料,就可使用scn=985822

  b  
基於時間恢復(使用備份的控制檔案)
  複製第一次冷備份的所有的資料檔案,控制檔案
  SQL> shutdown immediate
  ORA-01109: 資料庫未開啟
  
  
  已經解除安裝資料庫。
  ORACLE 例程已經關閉。
  SQL> startup mount
  ORACLE 例程已經啟動。
  
   資料庫裝載完畢。
  SQL>  recover database until time  '2005-12-17 16:30:07'  using backup controlfile;
  ORA-00279: 更改 984674 (在 12/17/2005 16:14:05 生成) 對於執行緒 1 是必需的
  ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00003.001
  ORA-00280: 更改 984674 對於執行緒 1 是按序列 # 3 進行的
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  auto
    
  已應用的日誌。
  完成介質恢復。
  SQL> alter database open resetlogs;
  
  資料庫已更改。
  
  SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
  
  CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
  ------------------ --------------- -------------------
              985935               0              985997
  
  SQL> select * from test.test;
  
  A                    B
  -------------------- --------------------
    
  已選擇6行。
  
  SQL>
  
  
  
  
  
  
   B、a 基於變更的恢復(不包含備份的控制檔案)
  SQL> recover database  until change 985822;
  ORA-00905: 缺少關鍵字
  
  
  SQL> recover database  until change 985822;
  ORA-00279: 更改 984674 (在 12/17/2005 16:14:05 生成) 對於執行緒 1 是必需的
  ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00003.001
  ORA-00280: 更改 984674 對於執行緒 1 是按序列 # 3 進行的
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  auto
    
  
  已應用的日誌。
  完成介質恢復。
  SQL> alter database open resetlogs;
  
  資料庫已更改。
  
  SQL> select * from test.test;
  
  A                    B
  -------------------- --------------------
   
  已選擇6行。
  
  SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
  
  CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
  ------------------ --------------- -------------------
  985824               0              985886

  B、b 基於變更的恢復(包含備份的控制檔案)

  SQL> shutdown immediate
  資料庫已經關閉。
  已經解除安裝資料庫。
  ORACLE 例程已經關閉。
  SQL> startup mount
  ORACLE 例程已經啟動。
  
   資料庫裝載完畢。
  SQL> recover database automic until change 985822 using backup controlfile;
  ORA-00905: 缺少關鍵字
  #說明這裡的automic 是不能使用的
  
  
  SQL> recover database until  change 985822 using backup controlfile;
  ORA-00279: 更改 984674 (在 12/17/2005 16:14:05 生成) 對於執行緒 1 是必需的
  ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00003.001
  ORA-00280: 更改 984674 對於執行緒 1 是按序列 # 3 進行的
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  auto
   
  已應用的日誌。
  完成介質恢復。
  SQL> alter database open resetlogs;
  
  資料庫已更改。
  
  SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
  
  CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
  ------------------ --------------- -------------------
              985824               0              985885
  
  SQL> select * from test.test;
  
  A                    B
  -------------------- --------------------
    
  已選擇6行。
  
  SQL>
  SQL> shutdown immediate
  資料庫已經關閉。
  已經解除安裝資料庫。
  ORACLE 例程已經關閉。
  SQL> startup
  ORACLE 例程已經啟動。
  
    資料庫裝載完畢。
  資料庫已經開啟。
  SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
  
  CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
  ------------------ --------------- -------------------
              987124               0              987124
  
  SQL
  這裡關閉後重啟發現 CHECKPOINT_CHANGE和controlfile_change# from v$database
  數字變了,而ARCHIVE_CHANGE#依然是0,說明什麼問題呢???
  如果新增資料後
  SQL> insert into test.test(a,b) values(to_char(sysdate,'YYYY-MM-DD hh24:mi:ss'),to_char(sysdate,'YYYY-MM-DD hh24:mi
  :ss'));
  
  已建立 1 行。
  
  SQL> commit;
  
  提交完成。
  
  SQL> alter system archive log current;
  
  系統已更改。
  
  SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
  
  CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
  ------------------ --------------- -------------------
  987124          987744              987747
  新增資料後發現archive 和控制檔案的scn一致,但check_point 的scn沒變
  下面的事件
  
  SQL> shutdown immediate
  資料庫已經關閉。
  已經解除安裝資料庫。
  ORACLE 例程已經關閉。
  SQL> startup
  ORACLE 例程已經啟動。
  
   資料庫裝載完畢。
  資料庫已經開啟。
  SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
  
  CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
  ------------------ --------------- -------------------
              987906          987744              987906
  
  SQL>
  發現CHECKPOINT_CHANGE# 和CONTROLFILE_CHANGE#序號始終一致,而日誌scn
  值得思考????????

  C a基於取消(不包含備份的控制檔案)

  SQL> shutdown immediate
  資料庫已經關閉。
  已經解除安裝資料庫。
  ORACLE 例程已經關閉。
  SQL> startup mount
  ORACLE 例程已經啟動。
  
   資料庫裝載完畢。
  SQL> recover database until cancel;
  ORA-00279: 更改 984674 (在 12/17/2005 16:14:05 生成) 對於執行緒 1 是必需的
  ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00003.001
  ORA-00280: 更改 984674 對於執行緒 1 是按序列 # 3 進行的
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  
  ORA-00279: 更改 985596 (在 12/17/2005 16:28:34 生成) 對於執行緒 1 是必需的
  ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00004.001
  ORA-00280: 更改 985596 對於執行緒 1 是按序列 # 4 進行的
  ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORACLE92\RDBMS\ARC00003.001'
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  
  ORA-00279: 更改 985702 (在 12/17/2005 16:29:20 生成) 對於執行緒 1 是必需的
  ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00005.001
  ORA-00280: 更改 985702 對於執行緒 1 是按序列 # 5 進行的
  ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORACLE92\RDBMS\ARC00004.001'
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  
  ORA-00279: 更改 985822 (在 12/17/2005 16:29:54 生成) 對於執行緒 1 是必需的
  ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00006.001
  ORA-00280: 更改 985822 對於執行緒 1 是按序列 # 6 進行的
  ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORACLE92\RDBMS\ARC00005.001'
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  cancel
  介質恢復已取消。
  SQL> alter database open resetlogs;
  
  資料庫已更改。
  
  SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
  
  CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
  ------------------ --------------- -------------------
              985824               0              985886
  
  SQL> select * from test.test;
  
  A                    B
  -------------------- --------------------
  2005-12-17 16:29:14  2005-12-17 16:29:14
  2005-12-17 16:28:26  2005-12-17 16:28:26
  2005-12-17 16:28:27  2005-12-17 16:28:27
  2005-12-17 16:29:12  2005-12-17 16:29:12
  2005-12-17 16:29:49  2005-12-17 16:29:49
  2005-12-17 16:29:49  2005-12-17 16:29:49
  
  已選擇6行。
  
  SQL>

  C b基於取消(包含備份的控制檔案)

  SQL> shutdown immediate
  資料庫已經關閉。
  已經解除安裝資料庫。
  ORACLE 例程已經關閉。
  SQL> recover database until cancel using backup controlfile;
  ORA-01034: ORACLE not available
  
  
  SQL> startup mount
  ORACLE 例程已經啟動。
  
  Total System Global Area  135338868 bytes
  Fixed Size                   453492 bytes
  Variable Size             109051904 bytes
  Database Buffers           25165824 bytes
  Redo Buffers                 667648 bytes
  資料庫裝載完畢。
  SQL> recover database until cancel using backup controlfile;
  ORA-00279: 更改 984674 (在 12/17/2005 16:14:05 生成) 對於執行緒 1 是必需的
  ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00003.001
  ORA-00280: 更改 984674 對於執行緒 1 是按序列 # 3 進行的
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  
  ORA-00279: 更改 985596 (在 12/17/2005 16:28:34 生成) 對於執行緒 1 是必需的
  ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00004.001
  ORA-00280: 更改 985596 對於執行緒 1 是按序列 # 4 進行的
  ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORACLE92\RDBMS\ARC00003.001'
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  
  ORA-00279: 更改 985702 (在 12/17/2005 16:29:20 生成) 對於執行緒 1 是必需的
  ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00005.001
  ORA-00280: 更改 985702 對於執行緒 1 是按序列 # 5 進行的
  ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORACLE92\RDBMS\ARC00004.001'
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  
  ORA-00279: 更改 985822 (在 12/17/2005 16:29:54 生成) 對於執行緒 1 是必需的
  ORA-00289: 建議: D:\ORACLE\ORACLE92\RDBMS\ARC00006.001
  ORA-00280: 更改 985822 對於執行緒 1 是按序列 # 6 進行的
  ORA-00278: 此恢復不再需要日誌檔案 'D:\ORACLE\ORACLE92\RDBMS\ARC00005.001'
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  cancle
  ORA-00308: 無法開啟存檔日誌 'cancle'
  ORA-27041: 無法開啟檔案
  OSD-04002: 無法開啟檔案
  O/S-Error: (OS 2) 系統找不到指定的檔案。
  
  
  指定日誌: {=suggested | filename | AUTO | CANCEL}
  cancel
  介質恢復已取消。
  SQL> alter database open resetlogs;
  
  資料庫已更改。
  
  SQL> select checkpoint_change#,archive_change# ,controlfile_change# from v$database;
  
  CHECKPOINT_CHANGE# ARCHIVE_CHANGE# CONTROLFILE_CHANGE#
  ------------------ --------------- -------------------
              985824               0              985886
  
  SQL> select * from test.test;
  
  A                    B
  -------------------- --------------------
  2005-12-17 16:29:14  2005-12-17 16:29:14
  2005-12-17 16:28:26  2005-12-17 16:28:26
  2005-12-17 16:28:27  2005-12-17 16:28:27
  2005-12-17 16:29:12  2005-12-17 16:29:12
  2005-12-17 16:29:49  2005-12-17 16:29:49
  2005-12-17 16:29:49  2005-12-17 16:29:49
  
  已選擇6行。
  
  SQL>

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

相關文章