數據庫的冷備份指的是數據庫處于關閉或者MOUNT狀態下的備份,備份文件包括數據文件、日志文件和控制文件。數據庫冷備份所用的時間主要受數據庫大小和磁盤I/O性能的影響。由于數據庫需要關閉才能進行冷備份,所以這種備份技術并不適用7×24小時的系統。盡管冷備份并不需要開啟歸檔模式,但還是建議開啟了歸檔模式后進行冷備份。當數據庫發生災難時,只要歸檔日志和在線日志存在,歸檔模式下的冷備份可做到數據不丟失。
9.2.1 冷備份數據庫步驟
在關閉數據庫之前,可以從數據庫視圖中查找所需要備份的文件。
- 備份數據文件
可以從視圖V D A T A F I L E 中查找所需要備份的數據文件,如下所示: S Q L > s e l e c t n a m e f r o m v DATAFILE中查找所需要備份的數據文件,如下所示: SQL> select name from v DATAFILE中查找所需要備份的數據文件,如下所示:SQL>selectnamefromvdatafile;
NAME
/ora10205/oradata/ora10205/system01.dbf
/ora10205/oradata/ora10205/users02.dbf
/ora10205/oradata/ora10205/sysaux01.dbf
/ora10205/oradata/ora10205/users01.dbf
/ora10205/oradata/ora10205/test01.dbf
/ora10205/oradata/ora10205/manual01.dbf
/oradata/ZHOUL/datafile/o1_mf_zhoul_8cppdlq7_.dbf
/ora10205/oradata/ora10205/undotbs2.dbf
/ora10205/oradata/ora10205/test_lmt01.dbf
9 rows selected.
需要注意的是,由于臨時文件是不永久存放業務數據的,所以在冷備份時并不需要備份臨時文件。而且臨時文件往往被撐得很大,備份臨時文件會導致備份時間變長。
2. 備份日志文件
可以從V L O G F I L E 中獲取所需要備份的日志文件,如下所示: S Q L > s e l e c t m e m b e r f r o m v LOGFILE中獲取所需要備份的日志文件,如下所示: SQL> select member from v LOGFILE中獲取所需要備份的日志文件,如下所示:SQL>selectmemberfromvlogfile where type<>‘STANDBY’;
MEMBER
/ora10205/oradata/ora10205/redo02.log
/ora10205/oradata/ora10205/redo01.log
/ora10205/oradata/ora10205/redo05.log
/ora10205/oradata/ora10205/redo04.log
/ora10205/oradata/ora10205/redo03.log
需要注意的是,如果數據庫創建有STANDBYREDOLOG,該文件在日常運行的過程中不需要用到,所以在冷備份過程中可以不備份。
3. 備份控制文件
可以從V C O N T R O L F I L E 中獲取所需要備份的控制文件,如下所示: S Q L > s e l e c t n a m e f r o m v CONTROLFILE中獲取所需要備份的控制文件,如下所示: SQL> select name from v CONTROLFILE中獲取所需要備份的控制文件,如下所示:SQL>selectnamefromvcontrolfile;
NAME
/ora10205/oradata/ora10205/control02.ctl
/ora10205/oradata/ora10205/control01.ctl
如果在MOUNT狀態使用操作系統命令備份控制文件,則需要注意分裂塊。分裂塊指的是數據塊在更新過程中同時被另外的進程拷貝,以致拷貝出來的數據塊一部分是拷貝前的數據,一部分是拷貝后的數據。這些分裂塊對Oracle來說就是損壞塊。損壞塊意味著不可用。由于控制文件的BLOCK SIZE和操作系統的最小I/O單位不同,因此在拷貝控制文件的過程中可能會產生分裂塊,所以不建議在數據庫MOUNT狀態或者OPEN狀態中使用操作系統命令拷貝控制文件,雖然拷貝出來的控制文件在絕大多數情況下是可用的。
4. 備份參數文件
參數文件默認位于 O R A C L E H O M E / d b s 下,其名字默認為 i n i t ORACLE_HOME/dbs下,其名字默認為init ORACLEH?OME/dbs下,其名字默認為initORACLE_SID.ora或者spfile O R A C L E S I D . o r a 。由于參數文件不存放業務數據,所以理論上來講,參數文件即使丟失了也可以重建。但參數文件重建需要時間,所以在冷備份的過程中最好也備份參數文件。由于數據庫在 N O M O U N T 的過程中會讀取參數文件,然后將讀取的內容寫進警告日志。所以當參數文件丟失且沒有備份時,可以從警告日志中獲取數據庫參數列表重建參數文件。 5. 備份監聽相關配置文件監聽相關的配置文件指的是 l i s t e n e r . o r a 、 s q l n e t . o r a 、 t n s n a m e s . o r a 等。默認位于 ORACLE_SID.ora。由于參數文件不存放業務數據,所以理論上來講,參數文件即使丟失了也可以重建。但參數文件重建需要時間,所以在冷備份的過程中最好也備份參數文件。由于數據庫在NOMOUNT的過程中會讀取參數文件,然后將讀取的內容寫進警告日志。所以當參數文件丟失且沒有備份時,可以從警告日志中獲取數據庫參數列表重建參數文件。 5. 備份監聽相關配置文件 監聽相關的配置文件指的是listener.ora、sqlnet.ora、tnsnames.ora等。默認位于 ORACLES?ID.ora。由于參數文件不存放業務數據,所以理論上來講,參數文件即使丟失了也可以重建。但參數文件重建需要時間,所以在冷備份的過程中最好也備份參數文件。由于數據庫在NOMOUNT的過程中會讀取參數文件,然后將讀取的內容寫進警告日志。所以當參數文件丟失且沒有備份時,可以從警告日志中獲取數據庫參數列表重建參數文件。5.備份監聽相關配置文件監聽相關的配置文件指的是listener.ora、sqlnet.ora、tnsnames.ora等。默認位于ORACLE_HOME/network/admin中。當Oracle軟件不可用時,雖然可以重裝Oracle軟件來解決,但配置文件中的內容需要重建,尤其是tnsnames.ora配置文件,它往往和數據庫中的DBLINK相關。當tnsnames.ora配置文件不存在或者配置有問題時,DBLINK往往也會隨之失效(如果建DBLINK時采用tnsnams.ora中的連接串)。tnsnames.ora在分布式事務中起著舉足輕重的作用,但在數據庫備份過程中很容易被DBA忽視。此外,冷備份數據庫時最好也備份/etc/fstab、/etc/filesystems或者/etc/hosts等操作系統配置文件,因為要考慮到操作系統不可用的情況。
9.2.2 冷備份下的數據庫恢復
如果數據庫的冷備份是在非歸檔模式下進行的備份。那么當發生災難時,只要將冷備份中數據文件、控制文件、日志文件拷貝至生產系統的原目錄中,就可以打開數據庫了。此時的恢復時間取決于數據庫的大小和磁盤的I/O速度。如果冷備份放在其他主機或介質中,那么恢復時間還取決于從其他系統中導出的時間和網絡帶寬。非歸檔模式下的備份可能會導致數據丟失。
如果數據庫的冷備份是在歸檔模式下進行的備份。那么發生災難時,只要控制文件、歸檔日志文件、在線日志文件沒損壞,那么就可以只將冷備份的數據文件拷貝至生產系統的原目錄中,然后應用歸檔日志和在線日志,這樣就可以做到數據不丟失了。以下為模擬數據庫災難的過程。
(1)假設有一張T1表,建立在zhou1用戶下,如下所示:
SQL> select count(*) from zhou1.t1;
COUNT(*)
51732
(2)數據庫某個數據文件損壞導致了表zhou1.t1讀取異常,如下所示:
SQL> select count() from zhou1.t1;
select count() from zhou1.t1
*
ERROR at line 1:
ORA-00376: file 4 cannot be read at this time
ORA-01110: data file 4: ‘/ora10205/oradata/ora10205/users01.dbf’
(3)如果數據文件有冷備份,只要將備份集拷貝至生產系統原目錄中,然后應用歸檔日志和在線日志就可以恢復數據,如下所示:
SQL> alter database datafile 4 offline;
Database altered.
[ora10205@mcdbatest bak]$ cp users01.dbf …/users01.dbf
SQL> recover datafile 4;
ORA-00279: change 12770129123740 generated at 12/06/2012 14:52:43 needed for
thread 1
ORA-00289: suggestion : /archlog/ora10205/1_19_800383891.dbf
ORA-00280: change 12770129123740 for thread 1 is in sequence #19
Specify log: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 12770129124885 generated at 12/06/2012 15:02:40 needed for
thread 1
ORA-00289: suggestion : /archlog/ora10205/1_20_800383891.dbf
ORA-00280: change 12770129124885 for thread 1 is in sequence #20
ORA-00278: log file ‘/archlog/ora10205/1_19_800383891.dbf’ no longer needed for
this recovery
…
Log applied.
Media recovery complete.
SQL> alter database datafile 4 online;
Database altered.
SQL> select count(*) from zhou1.t1;
COUNT(*)
51732