2021年10月1日 星期五

11.1 冷備份與熱備份

Oracle 資料庫的備份方式可以分為兩類,冷備份與熱備份,冷備份指的是在資料庫完全靜止的狀態之下進行備份;而熱備份則是在資料庫處於運行的狀態之下進行備份。


Oracle 資料庫是由 Control File 、 Data File … 等檔案所構成,所以資料庫備份就是針對這些檔案來做備份,使用冷備份必須把資料庫 shutdown ,讓資料庫完全處於靜止的狀態,然後把 Control File 、 Data File … 等檔案複製起來做一個備份,結束後再重新將資料庫 startup ,這樣一個過程就完成了冷備份。

SQL> shutdown immediate

SQL> exit;

$ cp /u01/oradata/* /u01/orabak

$ sqlplus / as sysdba

SQL> startup


使用冷備份的資料庫還原,只需要把複製出來的備份檔案再 copy 回來,這樣就完成了資料庫還原的動作,這邊要注意的是,由於冷備份是在資料庫完全處於靜止的狀態之下將所有檔案複製出來,因此還原的時候必須把所有檔案一起複製回來,不能只單獨還原某一個檔案。


在某種程度上,使用 export (Datapump) 的方式將資料進行備份,也屬於冷備份的一種,雖然執行 export 的時候資料庫無須 shutdown ,但 export 出來的資料是當下做 export 那個時間點的資料,並不會包括後續的資料異動,例如在每日的 02:00 進行 export 的動作,如果早上 10:00 資料庫有異狀需要進行還原,那麼 import 回來也只有 02:00 那個時間點的資料, 02:00 ~ 10:00 中間的異動等於就遺失了。


熱備份是在資料庫運行的狀態之下進行備份,資料庫必須是使用 archive log 模式才能夠使用熱備份,藉由 archive log 不僅可以讓資料庫在運行的狀態之下進行備份,而資料庫還原的時候更可以讓資料庫還原到最接近現在的時間點,減少中間資料的遺失。熱備份同樣也是把資料庫的檔案複製備份出來,只是在資料庫運行的當下必須先使用 alter database begin backup 指令,然後再複製檔案,複製結束後再使用 alter database end backup ,這樣就完成了一個熱備份。

SQL> alter database begin backup;

SQL> !cp /u01/oradata/* /u01/orabak

SQL> alter database end backup;


熱備份的原理是在執行 begin backup 的當下,資料庫會暫時把 Data File 的 SCN 凍結起來不再更新,雖然凍結了 SCN 但不會影響到資料庫的運行,這時間所發生的交易都會保存在 archive log 當中,當備份結束後執行了 end backup ,此時資料庫會 apply 這中間所產生的 archive log ,讓 Data File 的 SCN 更新到目前的時間點。由於 archive log 在熱備份當中扮演了重要的角色,因此在備份檔案的時候不要忘了將 archive log 複製備份起來。


使用熱備份的還原,同樣的是把備份的檔案 copy 回來,與冷備份不同的是,將熱備份的檔案 copy 回來之後,可以再使用 archive log 將資料庫還原到最接近現在的時間點,將資料庫開啟到 mount 狀態,使用 recover database until cancel using backup controlfile開始 apply archive log :

SQL> !cp /u01/orabak/* /u01/oradata

SQL> startup mount

SQL> recover database until cancel using backup controlfile;


執行了 recover 之後,系統會提示所需要的 archive log 序號以及檔案:


系統會顯示 archive log 的檔案位置,如果位置正確的話,可以使用 AUTO 讓資料庫自行 apply 所有需要的 archive log ,如果路徑不正確的話,也可以自行提供 archive log 檔案的絕對路徑給它:


資料庫會一直 apply archive log 直到找不到下一個檔案為止,例如上述以經 apply 到 #41 號的 archive log ,而此時 #42 序號的交易可能還在線上的 Redo Log 裡面還沒 switch 出來,如果線上的 Redo Log 沒有遺失的話,此時可以提供線上的 Redo Log 讓它 recover ,這樣的話就可以達到完整的資料庫還原,資料是完全沒有遺失的;如果線上的 Redo Log 已經遺失不存在了,那麼我們就只能 apply 到 #41 這個序號,這樣就會損失一個 Redo Log 的交易資料,雖然如此,但熱備份的還原已經是可以還原到最接近現在的時間點了。


recover 完成後,使用 alter database open resetlogs 將資料庫開啟,完成資料庫還原的程序:


由於有 archive log 的存在,因此熱備份是可以只單獨還原某一個檔案的,同樣需經過 recover 的程序,例如單獨將 users01.dbf 這個檔案進行還原:

SQL> alter database datafile '/u01/oradata/users01.dbf' offline;

SQL> !cp /u01/orabak/users01.dbf /u01/oradata/

SQL> recover datafile '/u01/oradata/users01.dbf';

SQL> alter database datafile '/u01/oradata/users01.dbf' online;


實務上來說,資料庫系統必須 7x24 不停地提供服務,不太會為了備份而將資料庫 shutdown ,因此冷備份很少使用,幾乎都是以熱備份為主要的方式。



沒有留言:

張貼留言