Oracle 資料恢複從恢複類型來說,拋開具體的檔案,總共可分為兩大類型的恢複,一是完全恢複,一個是不完全恢複。其實,熟悉了Oracle體繫結構之後,對於Oracle恢複就會有一個總體的概念。因為Oracle組成的外圍部分,主要由不同的檔案來組成,每種不同類型的檔案有不同的作用,因此只要瞭解了其作用,更利於瞭解與掌握Oralce資料庫的備份與恢複。言歸正傳,完全恢複即是把資料庫恢複到最新的SCN,出故障前的那一刻,是無損恢複。而不完全恢複即是有損恢複,多用於恢複使用者誤操作,歸檔日誌丟失等情形。本文主要描述基於使用者管理的不完全恢複。
一、不完全恢複特性
1、不完全恢複
不完全恢複僅僅是將資料恢複到某一個特定的時間點或特定的SCN,而不是目前時間點。不完全恢複會影響整個資料庫,需要在MOUNT狀 態下進行。在不完全恢複成功之後,通常需要使用 resetlogs 選項來開啟資料庫。當使用resetlogs後,SCN 計數器不會被重設,原來的日 志序號 log sequence 會結束,從新開始新的記錄序號。在Oracle裡稱之為產生一個新的incarnation。同時Oracle還會重設聯機重做日 志內容,因此resetlogs之後建議重新全備資料庫。
2、不完全恢複的情形
介質故障(media failure)導致部分或全部聯機重做日誌(online redo log)損壞
使用者操作失誤(user error)導致資料丟失,例如,使用者由於疏忽而移除了表,提交了無效的資料到表
由于歸檔重做日誌(archived redo log)丟失而無法進行完全恢複(complete recovery)
當前控制檔案(control file)丟失,必須使用備份的控制檔案開啟(open)資料庫
3、不完全恢複的步驟
關閉資料庫並備份資料庫(以防止恢複失敗)
啟動資料庫到mount 狀態
還原所有資料檔案,同時可以選擇還原控制檔案(注意需要還原所有資料檔案,而不僅僅是受損檔案)
將資料庫恢複至某個時間點、序列、或系統改變號
使用RESETLOGS關鍵字開啟資料庫
4、注意
不完全恢複的前提條件是Oracl資料庫夠到mount狀態,即參數檔案,控制檔案
在做不完全恢複前建議在恢複前後做一次備份,避免恢複失敗導致不必要的損失
不完全恢複完成後,建議不要直接使用OPEN RESETLOGS 命令以讀/寫入模式開啟(open)資料庫,而應先以唯讀模式開啟資料庫,並檢查是否已 將資料庫恢複到正確的時間點。如果恢複的時間點有誤,在沒有使用OPEN RESETLOGS命令的情況下,重新執行恢複操作相對簡單。
對於恢複結果早於指定的時間點,只需重新執行恢複操作。如果恢複結果超過了指定的時間點,則應再次還原資料庫並重新進行恢複。
本文中的樣本為便於示範,沒有在恢複前備份故障資料,也沒有在resetlog之後進行備份。
注:Oracle 10g中已經可以在 resetlogs 之後不備份資料庫,恢複的時候能夠穿越resetlogs
5、不完全介質恢複的幾種類型
基於時間的恢複(Time-based recovery) 將資料恢複到指定的時間點
使用者控制的恢複(Cancel-based recovery) 當使用者提交CANCEL後停止恢複(此選項在使用RMAN時無效)
基於SCN 的恢複(Change-based recovery) 將資料恢複到指定的SCN
按重做日誌序號恢複(Log sequence recovery)將資料恢複到指定的重做日誌序號(僅使用RMAN時有效)
二、示範基於使用者管理的不完全恢複
--1、until time 恢複(恢複到指定時間點)
sys@SYBO2SZ> conn / as sysdba
Connected.
sys@SYBO2SZ> archive log list; -->當前資料庫處于歸檔模式
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u02/database/SYBO2SZ/archive/
Oldest online log sequence 0
Next log sequence to archive 1
Current log sequence 1
sys@SYBO2SZ> @db_hot_bak -->對資料庫進行熱備份
ho cp /u02/database/SYBO2SZ/oradata/sysSYBO2SZ.dbf /u02/database/SYBO2SZ/backup/hotbak
ho cp /u02/database/SYBO2SZ/undo/undotbsSYBO2SZ.dbf /u02/database/SYBO2SZ/backup/hotbak
ho cp /u02/database/SYBO2SZ/oradata/sysauxSYBO2SZ.dbf /u02/database/SYBO2SZ/backup/hotbak
ho cp /u02/database/SYBO2SZ/undo/undotbsSYBO2SZ2.dbf /u02/database/SYBO2SZ/backup/hotbak
ho cp /u02/database/SYBO2SZ/oradata/SYBO2SZ_system_tbl.dbf /u02/database/SYBO2SZ/backup/hotbak
ho cp /u02/database/SYBO2SZ/oradata/SYBO2SZ_account_tbl.dbf /u02/database/SYBO2SZ/backup/hotbak
ho cp /u02/database/SYBO2SZ/oradata/SYBO2SZ_stock_tbl.dbf /u02/database/SYBO2SZ/backup/hotbak
ho cp /u02/database/SYBO2SZ/oradata/SYBO2SZ_stock_l_tbl.dbf /u02/database/SYBO2SZ/backup/hotbak
sys@SYBO2SZ> set time on;
12:40:07 sys@SYBO2SZ> create table dept as select * from scott.dept;
12:40:31 sys@SYBO2SZ> create table emp as select * from scott.emp;
12:40:41 sys@SYBO2SZ>
12:40:55 sys@SYBO2SZ> truncate table emp; -->對錶emp進行truncate
Table truncated.
12:41:02 sys@SYBO2SZ> insert into dept select 50,'DEV','SZ' from dual; -->為表dept新增兩條記錄並提交
12:41:14 sys@SYBO2SZ> insert into dept select 60,'HR','GZ' from dual;
12:41:19 sys@SYBO2SZ> commit;
Commit complete.
12:41:22 sys@SYBO2SZ> alter system checkpoint; -->執行檢查點進程以寫入日誌
System altered.
12:41:31 sys@SYBO2SZ> shutdown immediate; -->關閉資料庫
12:42:25 sys@SYBO2SZ> startup mount; -->啟動資料庫到mount狀態
ORACLE instance started.
Total System Global Area 599785472 bytes
Fixed Size 2074568 bytes
Variable Size 213911608 bytes
Database Buffers 377487360 bytes
Redo Buffers 6311936 bytes
Database mounted. -->下面將備份的資料進行還原,由於並非所有資料檔案位於相同路徑,因此進行多次cp
12:42:36 sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/SYBO*.dbf /u02/database/SYBO2SZ/oradata/.
12:42:57 sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/sys*.dbf /u02/database/SYBO2SZ/oradata/.
12:43:24 sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/undotbs* /u02/database/SYBO2SZ/undo/.