第五章 從打開的數据庫進行備份与恢复

  一致備份的嚴重弊端在於:數据庫必須關閉(冷備份)。由於戶及應用程序一直在使用資料庫,因此不可能關閉數据庫。如果你的數据庫必須一直保持可用狀態,那么關閉數据庫備份就不可取了。只能採用熱備份方式。

數据庫打開時,數据庫文件的狀態一直是變化。數据文件和控制文件被更新,重做日誌被寫入并歸檔。對於備份一個已經打開的數据庫,用戶管理的辦法是把每一個表空間都置於備份模式,然後備份數据文件。在備份完數据文件之後,再把表空間恢复到正常狀態。

  創建了一個打開數据庫的備份之後(也稱熱備份),就擁有了一個可以在數据庫出現故障時用於還原的備份文件。假設必須修复某個遭到損坏的數据庫,可以從備份路徑下拷貝一個或多個數据文件。在從一致備份還原文件時,如果沒有恢复數据庫,將無法打開數据庫,原因在於數据文件是一致的。記住,每個數据文件在其首部都有一個序號,該序號給出了數据文件的最新數据庫狀態,在一個數据庫可以被打開之前,所有聯机文件必須擁有相同的系統更改號(SCM)

  SCN ORACLE 自身相關的記時机制。當這些隨机數据文件擁有相同的SCN時,它們是一致的。在打開的數据庫上進行的備份不會產生一致的數据文件。這樣,在打開一個使用了從打開的數据庫備份中還原的數据文件之前,必須進行介質恢复。一旦所有必需的重做信息都被應用而保持SCN一致時,就可以打開數据庫了。在一個打開的數据庫上實施備份可以允許用戶以及應用程序在整個備份操作期間使用數据庫。

  數据文件首部的SCN值: 在數据文件的首部,有多個SCN值,當創建數据文件時,就分配一個創建SCN值。當文件在經歷其最後一個檢查點時,檢查點SCN標示出數据文件的狀態。這是個重要的SCN值,用於确保在啟動數据文件与控制文件保持一致。在數据文件脫机時,脫机SCN描繪了數据文件的狀態;當數据文件返回到聯机狀態時,脫机SCN將被更新;備份SCN則記錄下何時表空間被置於熱備份模式,重置日誌SCN用於記錄何時數据庫是使用RESETLOGS參數打開的。控制文件中類似的SCN值能确保在數据庫啟動和恢复時,所有的數据文件与控制一致,而且數据文件之間也相互一致。

為了在數据庫打開時進行整体備份,所有的數据文件都被拷貝到其他位置(通常是磁盤或磁帶)。在數据文件被拷貝期間,對該數据文件的改動不斷地進行著。當拷貝完成後,數据庫會會繼續改變已拷貝的數据文件。為了能夠在數据文件被改動時進行拷貝,必須要將數据文件所在表空間置於備份模式。將一個表空間置於備份模式即是通知Oracle更新該表空間的數据文件的首部Oracle同時也修改其對應這些數据文件的重做日誌記錄。當表空間處理備份模式時,會發生以下事件:

  1) 每個文件首部的標記都被設置,指出即將進行熱備份。

  2) 表空間數据文件執行某一檢查點。內存中所有“臟”數据都被寫入文件中。檢查點的SCN被寫入數据文件的首部和控制文件中,這個開始備份SCN標識出對文件所做的最新改動。這時SCN結构對於文件中的任何變化都是凍結的。

  3) alert.log添加一個開始備份記錄。

  4) 在數据文件中的任何塊被首次改變之前,有關每個已變化塊的一個塊映像將拷貝到重做日誌中。

  表空間處於備份模式時,可以使用操作系統的複製命令,將數据文件拷貝到其他地方。如果多個用戶正在更新這些表空間,則熱備份期間產生的重做日誌數量會明顯增加,因為重做日誌中必須保留每個已變化數据塊的一個拷貝(僅對第一次變化)。因為,應在數据庫活動較少時進行打開數据庫的備份。

  數据文件拷貝完畢後,將表空間脫离備份模式。當標誌一個表空間結束備份時,發生事件:

  1) 熱備份標誌被清除,說明備份已經結束。

  2) 在重做流中記錄下終止備份SCN,作為一個重做矢量。Oracle 利用這個重做記錄,可以知道在數据文件恢复過程中何時將表空間脫离熱備份。

  3) 重做生成返回到正常方式,就像表空間被設置為備份模式之前的那樣。

  由於備份期間所做的更改必須保存在重做流中,而且不能丟失,因為數据庫必須處於歸檔日誌模式,以便用於打開數据庫備份。

[@more@]
--**************************************************************
-- open_backup [open_backup.sql]
--
-- 2001-11-22 by HuiYi.Zhang
--
--   No part of this SQL script may be copied. Sold or distributed
--      without the express consent of HuiYi.Zhang
--**************************************************************
-- set sql*plus variable to output
set feedback off heading off trimspool on verify off
set pagesize 0
set linesize 130
set verify off
set serveroutput on
-- set sql*plus user variable
define l_path='G:BBackuphot'
define l_file='.open_backup_command.sql'
define l_log='&l_pathopen_backup_output.lst'
--
prompt ... spooling to &l_file
spool &l_file
--
prompt spool &l_log
prompt archive log list;;
prompt alter system switch logfile;;
declare
   cursor cur_space is
      select tablespace_name from dba_tablespaces where status'READ ONLY' and contents'TEMPORARY';
   cursor cur_datafile(p_spacename varchar2) is
      select file_name from dba_data_files where tablespace_name=p_spacename;
begin
   for rect in cur_space loop
      dbms_output.put_line('alter tablespace '||rect.tablespace_name||' begin backup;');
      for recd in cur_datafile(rect.tablespace_name) loop
         dbms_output.put_line('host copy '||recd.file_name||' &l_path'||'/y');
      end loop;
      dbms_output.put_line('alter tablespace '||rect.tablespace_name||' end backup;');
   end loop;
end;
/
prompt alter system switch logfile;;
prompt alter database backup controlfile to '&l_pathbackup.ctl' reuse;;
prompt archive log list;;
prompt spool off
--
spool off
@ &l_file;


SYS@HUIYI>alter tablespace tbs01 begin backup;

Tablespace altered.

SYS@HUIYI>select * from v$backup;

     FILE# STATUS                                  CHANGE# TIME
---------- ------------------------------------ ---------- ------------------
         1 NOT ACTIVE                            486062334 08-Mar-07 13:56:36
         2 NOT ACTIVE                            486062343 08-Mar-07 13:56:38
         3 NOT ACTIVE                            486062351 08-Mar-07 13:56:38
         4 NOT ACTIVE                            486062359 08-Mar-07 13:56:38
         5 NOT ACTIVE                            486062367 08-Mar-07 13:56:38
         6 NOT ACTIVE                            486062375 08-Mar-07 13:56:38
         7 NOT ACTIVE                            486062383 08-Mar-07 13:56:38
         8 NOT ACTIVE                            486062391 08-Mar-07 13:56:38
         9 NOT ACTIVE                            486062399 08-Mar-07 13:56:39
        10 ACTIVE                                486154130 09-Mar-07 12:42:10

10 rows selected.

SYS@HUIYI>alter tablespace tbs01 end backup;

Tablespace altered.

SYS@HUIYI>select * from v$backup;

     FILE# STATUS                                  CHANGE# TIME
---------- ------------------------------------ ---------- ------------------
         1 NOT ACTIVE                            486062334 08-Mar-07 13:56:36
         2 NOT ACTIVE                            486062343 08-Mar-07 13:56:38
         3 NOT ACTIVE                            486062351 08-Mar-07 13:56:38
         4 NOT ACTIVE                            486062359 08-Mar-07 13:56:38
         5 NOT ACTIVE                            486062367 08-Mar-07 13:56:38
         6 NOT ACTIVE                            486062375 08-Mar-07 13:56:38
         7 NOT ACTIVE                            486062383 08-Mar-07 13:56:38
         8 NOT ACTIVE                            486062391 08-Mar-07 13:56:38
         9 NOT ACTIVE                            486062399 08-Mar-07 13:56:39
        10 NOT ACTIVE                            486154130 09-Mar-07 12:42:10

10 rows selected.

  

  當數据庫處理事務時,會產生重做日誌文件并歸檔這些重做日誌。經過一段時間,這些重做日誌會累積起來,并填滿歸檔路徑。重做日誌無法歸檔時數据庫活動會中斷。歸檔路徑必須定期清理。大多數的數据庫安裝會將歸檔文件轉移到一個磁帶備份設置或一台遠程机器上,然後磁帶脫机存儲。如果由於環境災難(洪水、火災、地震等)而導致机器損毀,那么配合脫机數据文件和控制文件備份,脫机歸檔文件可以用於恢复數据庫。

--**************************************************************
-- archive_backup [archive_backup.sql]
--
-- 2001-11-22 by HuiYi.Zhang
--
--   No part of this SQL script may be copied. Sold or distributed
--      without the express consent of HuiYi.Zhang
--**************************************************************
-- set sql*plus variable to output
set feedback off heading off trimspool on verify off
set pagesize 0
set linesize 130
set verify off
set serveroutput on
-- set sql*plus user variable
define l_path='G:BBackuparchive'
define l_file='.archive_backup_command.sql'
--
prompt ... spooling to &l_file
spool &l_file
prompt archive log next;;
select 'host move '||name||' &l_path' from v$archived_log where completion_time between trunc(sysdate-1) and trunc(sysdate);
spool off
@ &l_file;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8799875/viewspace-903584/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8799875/viewspace-903584/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值