關閉資料庫的備份與恢復

chance2000發表於2006-03-26
關閉資料庫的備份與恢復[@more@]

一致資料庫備份通常指冷備份。

4.1 還原整個資料庫
1、備份關閉的資料庫
1) 建立備份指令碼
--closed_backup.sql
Remark Set SQL*Plus variables to manipulate output
set feedback off heading off verify off trimspool off
set pagesize 0 linesize 200
Remark Set SQL*Plus user variables used in this script
define dir = 'd:databakpractice_new'
define fil = 'e:caiskyora-srtclosed_backup_commands.sql'
prompt *** Spooling to &fil
Remark Create a command file with file backup commands
spool &fil
select 'host copy '||lower(name)||' &dir' from v$datafile order by 1;
select 'host copy '||lower(member)||' &dir' from v$logfile order by 1;
select 'host copy '||lower(name)||' &dir' from v$controlfile order by 1;
select 'host copy '||lower(name)||' &dir' from v$tempfile order by 1;
spool off
shutdown immediate
Remark Run the copy file commands from the operating system
@&fil
Remark Start the database again
startup;
---------------------------------------------------
2) 執行備份指令碼
@closed_backup.sql

2、還原整個資料庫
1) 刪除資料檔案
利用作業系統刪除命令把資料檔案刪除
2) 執行還原指令碼
利用作業系統複製命令把備份檔案複製到初始位置
3) 開啟資料庫
startup mount 會提示錯誤
檢視告警日誌資訊
檢查一下最後檢查點的時間是否與備份前的關閉時間一致
alter session set nls_date_format='hh24:mi:ss';
select file#,status,checkpoint_change#,last_change#,last_time from v$datafile;
檢查聯機日誌檢查點的更改號scn
select group#,sequence#,status,first_change#,first_time
from v$log order by first_change#;
4) 確認資料庫還原
當資料庫開啟時,oracle自動確認資料檔案是一致的。
4.2 完全資料庫恢復
1、配置資料庫歸檔
1) 檢視v$database檢視,確定資料庫是否處於歸檔日誌模式
select dbid,name,log_mode from v$database;
. Archive Destination config
log_archive_dest_1 = "location=/oradata/practice/archive"
. Archive Format
log_archive_format = %S.arc
%S -- Sequence Number 在告警日誌和v$log檢視的sequenct#中可以查到這個序列號。
. Archive Start
log_archive_start=true

手工啟動歸檔模式
shutdown immediate;
startup mount;
alter database archivelog;
在已經開啟的例項上啟動自動歸檔模式
alter system set log_archive_dest_1 = "location=/oradata/practice/archive";
alter system archive log start;
archive log start;
檢視檢視v$archive_dest中可以確定是否設定了歸檔路徑
select dest_id,status,destination from v$archive_dest;
可以從檢視v$parameter中提取或使用sqlplus顯示引數命令show parameter來檢視引數設定
show parameter log_archive_start
show parameter log_archive_dest_1
show parameter log_archive_format
檢視歸檔資訊的sqlplus命令
archive log list;
開啟資料庫命令
alter database open;
強制切換日誌命令
alter system switch logfile;
2、執行備份指令碼
@closed_backup.sql
3、提前重做日誌
alter system switch logfile;
可以檢視警告日誌檔案或檢視v$log和v$log_history或使用archive log list命令來驗證日誌順序。
4、刪除一個資料檔案
shutdown immediate;
刪除一個資料檔案
startup;
提示找不到資料檔案
5、還原丟失的資料檔案
可以檢視v$recover_file檢視就知道那個資料檔案有問題
select file#,error,change# from v$recover_file;
當把該資料檔案的備份複製到初始目錄下後,v$recover_file將會顯示出某些不同:錯誤項沒有了,
change#列有一個數值。將這個數值與v$datafile檢視中對應於所有檔案的檢查點變化數值進行
比較,將會看到v$datafile檢視中的scn比v$recover_file中的大。v$datafile是從控制檔案中
讀取關於資料庫中資料檔案的資訊,而v$recover_file則顯示剛剛還原的檔案其頭部的變化次數。
因此,除非對應於所有聯機資料檔案的scn與資料檔案頭部已及控制檔案中的相同,否則資料庫
無法開啟。
6、恢復還原的資料檔案
為了使所有的資料檔案擁有一致的變化序號,需要來自重做日誌中的重做資訊。
透過檢視v$log_history和v$log可以找出那個重做日誌檔案是必須採用的。這需要那些序號範圍
跨越了從備份時起到當前重做日誌檔案這段時間的重做日誌檔案。
select * from v$log_history where rownum < 10 order by sequence# desc;
select * from v$log;
使用recover database命令來恢復資料庫。
7、確認資料庫已恢復
4.3 不完全資料庫恢復
以下情況可能會需要對整個資料庫進行不完全恢復:
. 由於失誤而丟失一個資料庫物件
. 丟失了部分或全部聯機重做日誌
. 在恢復過程中丟失了一個已歸檔的重做日誌
. 錯誤刪除了表空間

忽略剩餘的重做日誌資訊是透過以resetlogs選項開啟資料庫來實現的。重置(resetting)
日誌檔案建立了資料庫的一個新實體。已恢復的資料庫的序號將以新的日誌序列流開始,
起始的日誌序號為1。
1、刪除表空間
刪除表空間會向告警日誌寫入資訊,而刪除表或截斷表都不會寫入。
drop tablespace indx including contents;
alter system switch logfile;
檢視v$tablespace和dba_tablespaces檢視是否還存在該表空間
2、檢查恢復
在資料庫出現錯誤時,你可能會接到反應問題的電話。使用者或開發人員可能並不知道事故發生的
準確時間。根據已經發生的事故,有時可以確定出事故是何時發生的。因為對資料庫結構所做的
變動(如刪除表空間)將在alter.log中新增資訊。而對於物件的變動,如刪除表,你就必須利用
有關人員提供的近似時間了。另外,也可以使用LogMiner試著找出更準確的時間。在還原並恢復
資料庫之前,請檢查告警日誌檔案、v$log表和v$log_history表,以確定如何最好地恢復資料庫。
3、還原資料檔案和控制檔案
當執行不完全恢復時,希望從備份的時間之前的某個備份還原除聯機重做日誌檔案以外的所有資料
庫檔案。沒有一個資料檔案能夠擁有更改號大於所希望備份到的時間的更改號。
4、不完全恢復資料庫
使用alter database命令恢復資料庫,並用until子句指定恢復過程的持續時間。可以將資料庫
恢復到某一特定時間、更改號或重做日誌。
. 基於時間的恢復
透過指定時間引數,告知資料庫例項應用重做日誌檔案,直到日期所指定的時刻。重做日誌是在
已歸檔日誌中找到的,同時對於任何資料檔案,聯機重做日誌檔案以最小的更改號開始。日期必須
是符合YYYY-MM-DD:HH24:MI:SS格式的字元。
alter database recover automatic until time '2002-01-04:09:07:10';
. 基於變更的恢復
可以指定一個scn值用於恢復
alter database recover automatic until scn 64300;
. 基於取消的恢復
可以使用cancel關鍵字,執行不完全資料庫恢復。基於取消的恢復過程對資料庫進行恢復,指定
輸入了cancel。重做日誌是一個接一個地應用,直到用到了希望停止的那個重做日誌檔案。
alter database recover until cancel using backup controlfile;
如果使用關鍵字automatic,oracle會自動從init.ora引數中提取出歸檔日誌檔名稱和路徑,
並應用所找到的各個檔案。
5、以重置日誌選項resetlogs開啟資料庫
完成了不完全恢復後,必須重新設定聯機重做日誌。當使用resetlogs選項開啟資料庫時,所有
的資料檔案都獲得一個新的resetlogs scn和時間戳。已歸檔的重做日誌在它們的頭部也有這兩
個值。oracle軟體透過為資料庫提供與重做日誌檔案相匹配的resetlogs scn和時間戳,來防止
用舊的歸檔日誌破壞資料檔案。
開啟資料庫並重新設定日誌命令
alter database open resetlogs;
select group#,sequence#,archived,status from v$log;
6、確認資料庫恢復

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

第五章 從開啟的資料庫備份與恢復

資料檔案首部的scn值:
在資料檔案的首部,有多個scn值。當建立資料檔案時,就分配一個建立scn。當檔案在經歷
其最後一個檢查點時,檢查點scn標示出資料庫或資料檔案的狀態。這是個重要的scn值,用於
確保在啟動時資料檔案與控制檔案保持一致。在資料檔案離線時,離線scn描繪了資料檔案的
狀態;當資料檔案返回到聯機狀態時,聯機scn將被更新。備份scn則記錄下何時表空間被置與
熱備份模式,重置日誌scn用於記錄何時資料庫是使用resetlogs引數開啟的。控制檔案中類似
的scn值能確保在資料庫啟動和恢復時,所有的資料檔案與控制檔案一致,而且資料檔案之間
也相互一致。

在開啟一個使用了開啟的資料庫備份中還原檔案的資料庫之前,必須進行介質恢復。

當表空間處於備份模式下時發生如下事件:
1) 每個檔案首部的標記都被設定,指出即將進行熱備份
2) 表空間資料檔案執行某一檢查點。記憶體中所有髒資料塊都被寫入該檔案中。檢查點的scn
被寫入資料檔案的首部和控制檔案中,這個開始備份scn標識出對檔案所做的最新改動。這時
scn結構對於檔案中的任何變化都是凍結的
3) 為告警日誌檔案新增一個開始備份記錄
4) 在資料檔案中的任何塊被首次改變之前,有關每個已變化塊的一個塊映像將被複製到重做
日誌中。然後針對該塊上的變動生成一個標準的重做向量。接下來對同一塊所做的所有改變將
產生正常的重做更改向量。

應在資料庫活動較少時進行開啟資料庫的備份。

當標誌一個表空間備份模式終止時,會發生以下事件:
1) 熱備份標誌被清除,說明備份已經結束
2) 在重做流中記錄下終止備份scn,作為一個重做向量。oracle利用這個重做記錄,可以知道在
資料檔案恢復過程中何時將表空間脫離熱備份
3) 資料檔案的檢查點結構解除凍結,並與資料庫的其他部分匹配
4) 重做生成返回到正常方式,就像表空間被設定為備份模式之前的那樣。

由於備份期間所做的更改必須儲存在重做流中,而且不能丟失,因此資料庫必須處於歸檔日誌模式,
以便用於開啟資料庫備份。

注意:不能將一個只讀表空間設定為備份模式,因為該表空間無法被資料庫更改。也不能將一個
臨時本地管理的表空間設定為備份模式。要還原或恢復一個本地管理的臨時表空間,只需重新建立
即可。

alter tablespace ... begin backup;
alter tablespace ... end backup;

建立熱備份指令碼
--open_backup.sql
set feedback off pagesize 0 heading off verify off linesize 100 trimspool on
define dir = 'd:databakpracticech5'
define fil = 'e:caiskyora-srtopen_backup_commands.sql'
define spo = '&diropen_backup_output.lst'
prompt *** Spooling to &fil
set serveroutput on
spool &fil
prompt spool &spo
prompt archive log list;;
prompt alter system switch logfile;;
declare
cursor cur_tablespace is
select tablespace_name from dba_tablespaces
where status <> 'READ ONLY'
and contents <> 'TEMPORARY';
cursor cur_datafile(tn varchar2) is
select file_name from dba_data_files
where tablespace_name = tn;
begin
for ct in cur_tablespace loop
dbms_output.put_line('alter tablespace '||
ct.tablespace_name||' begin backup;');
for cd in cur_datafile(ct.tablespace_name) loop
dbms_output.put_line('host copy '||cd.file_name||' &dir');
end loop;
dbms_output.put_line('alter tablespace '||
ct.tablespace_name||' end backup;');
end loop;
end;
/
prompt alter system switch logfile;;
prompt alter database backup controlfile to '&dirbackup.ctl' reuse;;
prompt archive log list;;
prompt spool off
spool off
@&fil
--------------------------------------------------

檢視錶空間是否在backup模式下 檢視v$datafile,v$backup

尋找歸檔檔案 檢視v$archive_dest,v$archived_log

建立歸檔日誌備份指令碼
--archive_backup.sql
set feedback off heading off verify off trimspool off
set pagesize 0 linesize 200
define dir = 'd:databakpracticech5'
define fil = 'e:caiskyora-srtarchive_backup_commands.sql'
spool &fil
prompt archive log next;;
select 'host move '||name||' &dir'
from v$archived_log
where completion_time >= trunc(sysdate) - 1
and completion_tome < trunc(sysdate);
spool off
@&fil
-----------------------------------------------------
archive log next命令可以確保在返回到sql*plus命令提示符控制之前,所有需要歸檔的聯機
重做日誌得到歸檔。

在典型的產品資料庫環境下,歸檔檔案是使用作業系統工具來備份到磁帶上的,然後從磁碟上
刪除這些檔案。

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

相關文章