5.手工備份恢復--打開數據庫的備份與恢復(練習5、6)
第3、4節介紹了從一致備份中還原并恢復一個數據庫,但弊端在于操作過程中數據庫必須被關閉。因為在實際環境中,用戶和應用系統一直在使用數據庫,數據庫是不允許被關閉,那如何實現打開數據庫的備份和恢復,本節及下一節進行討論。
在數據打開時,數據文件和控制文件被被更新,重做日志被寫入并歸檔,此時辦法是在備份時把表空間置于備份模式,然后備份數據文件,備份完畢后把表空間恢復到正常狀態。當數據庫出現故障時,可以從備份路徑下復制部分或全部文件進行還原,需要特別注意的每個數據文件首部都有一個序號,所有數據文件必須擁有同樣的SCN號時,數據庫才能夠被打開。
上面提到打開數據庫備份時需要把表空間置為備份模式,當表空間處于備份模式時處理動作如下:
- 設置該表空間文件頭標記,表明該文件即將進行熱備份;
- 表空間數據文件執行一個檢查點,內存中所有“臟”數據塊被寫入數據文件中,檢查點的SCN被寫入數據文件頭和控制文件中,這時對文件中的任何變化都是凍結的;
- 在告警日志文件中添加一個開始備份記錄
- 在數據文件中任何塊首次變動前,相關數據塊將被拷貝到重做日志中,然后針對該塊的變動生成一個標準的重做向量。
表空間處于備份模式時,可以使用操作系統的復制命令,把數據文件拷貝到其他地方。由于熱備期間重做日志必須保留每個已變化數據塊的拷貝(僅對首次變化),因此應在數據庫活動較少時進行打開數據庫的備份。
數據庫復制完畢后,表空間脫離備份模式將進行如下動作:
- 清除熱備份標志,表明備份已經結束;
- 終止記錄備份SCN,并作為重做矢量;
- 數據文件的檢查點結構解除凍結,并與數據庫的其他部分相匹配;
- 重做生成返回到正常方式。
練習5:備份打開的數據庫
本練習中,使用ALTER TABLESPACE…BEGIN BACKUP命令,對表空間中的數據文件進行打開數據庫的備份,備份完畢后,使用ALTER TABLESPACE…END BACKUP或ALTER DATABASE END BACKUP命令把表空間脫離熱備份模式。一個完整的數據庫打開備份處理需要復制每一個聯機數據文件外,還需要對當前控制文件進行備份。
步驟一:產生數據庫活動
向TINA用戶的DATE_LOG插入四十年后的數據,可以在恢復完畢后查看是否存在該筆數據以確認恢復是否成功。
2 SQL>COMMIT;
3 SQL>ALTER SESSION SET nls_date_format=’yyyy-MM-dd HH24:mi:ss’;
4 SQL>SELECT create_date FROM tina.date_log;

步驟二:創建熱備份腳本
創建的腳本將完成如下工作:
- 切換日志文件,確保在備份前歸檔所有更改;
- 將一個表空間設置為熱備模式;
- 用操作系統命令復制該空間下的文件;
- 將該表空間脫離熱備份模式;
- 對于每一個表空間,重復2-4操作;
- 切換日志文件,歸檔備份中所做的更改;
- 備份當前控制文件
在下面創建使用的的文件有:
- 備份腳本文件(open_backup.sql) 使用文本編輯器創建的熱備腳本;
- 備份命令文件(open_backup_command.sql) 該文件是在open_back.sql中創建并執行的;
- 備份命令文件輸出文件(open_backup_output.list) 用于記錄open_backup_command.sql執行的結果
1 set feedback off pagesize 0 heading off verify off linesize 200 trimspool on
2 define dir = 'D:\oracle\CODE\chap5'
3 define fil = 'D:\oracle\CODE\tmp\open_backup_commands.sql'
4 define spo = '&dir\open_backup_output.lst'
5 prompt *** Spooling to &fil
6 set serveroutput on
7 spool &fil
8 prompt spool &spo
9 prompt archive log list;;
10 prompt alter system switch logfile;;
11 DECLARE
12 CURSOR cur_tablespace IS
13 SELECT tablespace_name FROM dba_tablespaces
14 WHERE status <> 'READ ONLY';
15 CURSOR cur_datafile (tn VARCHAR) IS
16 SELECT file_name
17 FROM dba_data_files
18 WHERE tablespace_name = tn;
19 BEGIN
20 FOR ct IN cur_tablespace LOOP
21 dbms_output.put_line('alter tablespace ' || ct.tablespace_name || ' begin backup;');
22 FOR cd IN cur_datafile(ct.tablespace_name) LOOP
23 dbms_output.put_line('host copy ' || cd.file_name || ' &dir');
24 END LOOP;
25 dbms_output.put_line('alter tablespace ' || ct.tablespace_name || ' end backup;');
26 END LOOP;
27 END;
28 /
29 prompt alter system switch logfile;;
30 prompt alter database backup controlfile to '&dir\backup.ctl' REUSE;;
31 prompt archive log list;;
32 prompt spool off;;
33 spool off;
34 @&fil
- 第1行設置SQL*Plus變量,避免從數據庫中提取的結果在命令文件中顯示不必要的內容;
- 第2-4行在腳本范圍內為命令制定用戶變量, dir變量指定了備份文件將被拷貝的路徑位置,fil則指定了生成備份命令的文件名稱,spo變量定義腳本執行的日志。在接下來的腳本中,可以通過在變量名前加&來引用該變量;
- 第6行使用SQL*Plus提示命令顯示輸出結果;
- 第7行通知SQL*Plus將所有的屏幕結果輸出結果寫入一個文件,該文件名為變量fil所定義的open_backup_commands.sql;
- 第8行向spool文件open_backup_commands.sql寫入一條spool命令,當運行open_backup_commands.sql腳本時,可以把執行日志記錄到open_backup_output.list文件中;
- 第9行向命令文件寫入顯示當前正在歸檔信息命令,當恢復數據庫時,需要了解當前日志文件的序號;
- 第10行將日志文件從當前日志文件切換到下一個日志文件,這將對所有數據文件進行一次檢查點并創建一個新的歸檔日志文件;
- 第11-27行分別進行將表空間置于備份模式、復制所有的數據文件到備份目標路徑以及向表空間脫離備份模式。這里使用了兩個游標:分別是數據庫所有表空間列表和每個表空間數據文件列表。其具體處理過程如下:循環獲取表空間游標值,首先置表空間于備份模式,然后獲取該表空間下所有數據文件并復制到目標備份路徑,復制完畢后,該表空間接觸備份模式;
- 第28行將當前日志文件切換到下一個日志文件,以保證熱備過程中創建的中動作得以歸檔;
- 第29行在數據文件備份完成后應立即創建控制文件的備份。腳本中使用一個SQL語句生成該文件的拷貝,REUSE關鍵字表示如果存在該文件將覆蓋;
- 第30-32行指示open_backup_commands.sql文件將歸檔信息列出到備份腳本的spool文件,然后文件終止假脫機;
- 第33行執行創建的熱備腳本
步驟三:運行備份腳本
在SQL*Plus中執行步驟二創建的腳本,該腳本運行時,表空間和數據文件被置于備份模式,此時可以通過另一個SQL*Plus會話中查看v$backup視圖,查看哪些文件處于備份模式。


在備份結束后,也可以將用戶表空間置于備份模式,查看聯機數據文件的備份狀態。
2 SQL>SELECT d.tablespace_name tablespace, b.file#, b.status, b.change#, b.time
3 FROM dba_data_files d, v$backup b
4 WHERE b.file#=d.file_id
5 ORDER BY tablespace_name;

打開備份運行后,查看告警日志,將得到如下的備份模式記錄。

該警告顯示SYSTEM表空間打開備份操作的時間信息,2010-1-16 11:17:52執行腳本生成命令,將SYSTEM表空間置于備份模式,隨之SYSTEM表空間真正處于備份模式,在這等待的過程中,數據庫進行相關的操作;復制SYSTEM數據文件所需要的時間38秒,2010-1-16 11:18:30提交命令,將SYSTEM表空間脫離備份模式,隨之SYSTEM表空間恢復為正常模式。
本練習中的命令實現了Oracle推薦的連續備份方式,該方式可以是ALTER TABLESPACE…BEGIN/END BACKUP語句之間的時間間隔減少到最少,避免在熱備過程中產生龐大的重做信息,另外如果在熱備過程中數據庫崩潰,結束一個表空間中部分數據文件的備份要比結束對所有包括總舵數據庫文件的多個空間的備份要快得多、容易得多。
步驟四:檢查備份命令
查看腳本創建的文件open_backup_commands.sql,該文件有助于了解熱備的整個流程。

練習6:備份歸檔日志文件
在練習5中我們已經對數據庫數據文件進行了熱備,實際中備份后,數據庫不斷創建歸檔日志文件,經過一段時間累積這些文件將填滿歸檔路徑。這就需要我們定期對歸檔路徑進行清理,可以把這些歸檔文件轉義至一個磁帶備份設備或者一臺遠程機器上,當由于災害(洪水、火災、地震等)而導致機器損毀,可以通過脫機數據文件、控制文件、脫機歸檔文件可用于恢復數據庫。
步驟一:尋找歸檔文件
歸檔文件存在在數據庫初始化文件配置節log_archive_dest參數定義路徑下,可以通過參數文件、SHOW PARAMETER命令或從v$archive_dest視圖進行查看。如何設置該參數請參考練習3步驟一描述。

步驟二 :創建歸檔文件腳本
可以使用操作系統move命令來異動已經歸檔的文件從歸檔路徑轉移到其他地方。在archive_backup.sql的文件中,生成一個備份命令文件archive_back_commands.sql。該命令首先從v$archive_log視圖中找出昨日創建的所有歸檔日志文件,使用move命令將這些歸檔日志轉移到一個備份路徑下。
2 define dir = 'D:\oracle\CODE\chap5\ARCHIVE'
3 define fil = 'D:\oracle\CODE\tmp\archive_back_commands.sql'
4 spool &fil
5 prompt archive log next;;
6 SELECT 'host copy ' || name || ' &dir'
7 FROM v$archived_log
8 WHERE completion_time >= trunc(sysdate) - 1
9 AND completion_time < trunc(sysdate);
10 spool off;
11 @&fil
- 第2-3行設置SQL*Plus需要使用的變量,dir變量指定了備份文件將被拷貝的路徑位置;
- 第4行和第10行分別開始和終止將SQL輸出記錄到一個文件中;
- 第5行通知數據庫對任何未歸檔的聯機重做日志文件進行歸檔。該命令非常重要,由于數據庫處于歸檔狀態中,重做活動繁多,ARCHIVE LOG NEXT命令可以確保在返回到SQL*Plus命令提示符控制之前,所有需要歸檔的聯機重做日志得到歸檔。需注意該命令有兩個分號,這個在生成的命令文件中產生一個分號;
- 第6-9行從v$archived_log視圖中獲取已歸檔日志文件,利用各文件名稱,對路徑會生成一個move命令。在這個腳本中將轉移昨天創建的文件,trunc功能將刪除sysdate變來那個的時間(time)部分,該腳本轉移從昨天00:00:00至23:59:59之間24小時內創建的所有歸檔;
- 第11行運行spool文件的內容;
步驟三:運行歸檔文件腳本
創建完畢archive_backup.sql內容后,以SYS身份登錄,從SQL*Plus運行這個腳本。如果多次運行這個腳本,將會得到消息提示:移動命令沒有找到文件,這是正常的,因為歸檔文件已經被轉移了。

步驟四:確認歸檔日志備份
打開歸檔備份路徑,確認文件已經被轉移到目標路徑上,查看是否所期望的所有歸檔日志文件被成功轉移。


浙公網安備 33010602011771號