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/.
12:43:50 sys@SYBO2SZ> recover database until time '2012-08-22:12:40:55'; -->使用 until time 恢複到指定時間點
Media recovery complete.
12:44:07 sys@SYBO2SZ> alter database open resetlogs; -->介質分恢複成功之後,resetlog方式開啟資料庫
Database altered.
12:44:20 sys@SYBO2SZ> select count(*) from emp; -->emp表被成功恢複
COUNT(*)
----------
14
12:44:28 sys@SYBO2SZ> select * from dept; -->由於恢復點在插入新記錄之前,因此新記錄丟失
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
4 rows selected.
--2、unitl scn 恢複(基於系統改變號的恢複)
sys@SYBO2SZ> @db_hot_bak -->熱備資料庫
sys@SYBO2SZ> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
4 rows selected.
sys@SYBO2SZ> insert into dept select 50,'DEV','SZ' from dual; -->為表dept新增記錄
1 row created.
sys@SYBO2SZ> commit;
Commit complete.
sys@SYBO2SZ> select current_scn from v$database; -->查看當前SCN以便後續恢複使用
CURRENT_SCN
-----------
471613
sys@SYBO2SZ> insert into dept select 60,'HR','GZ' from dual; -->再次為表dept新增記錄,以便查看恢複後是否丟失
sys@SYBO2SZ> commit;
Commit complete.
sys@SYBO2SZ> delete from emp where deptno=10; -->刪除表emp上deptno=10的記錄
3 rows deleted.
sys@SYBO2SZ> commit;
Commit complete.
sys@SYBO2SZ> alter system checkpoint; -->執行檢查點進程
System altered.
sys@SYBO2SZ> shutdown immediate;
sys@SYBO2SZ> startup mount;
ORACLE instance started.
Total System Global Area 599785472 bytes
Fixed Size 2074568 bytes
Variable Size 218105912 bytes
Database Buffers 373293056 bytes
Redo Buffers 6311936 bytes
Database mounted.
sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/SYBO*.dbf /u02/database/SYBO2SZ/oradata/. -->還原資料庫
sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/sys*.dbf /u02/database/SYBO2SZ/oradata/.
sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/undotbs* /u02/database/SYBO2SZ/undo/.
sys@SYBO2SZ> recover database until change 471613 -->基於 SCN 恢複資料庫
Media recovery complete.
sys@SYBO2SZ> alter database open resetlogs; -->使用resetlog方式開啟資料庫
Database altered.
sys@SYBO2SZ> select * from dept; -->SCN之後的操作丟失
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 DEV SZ
5 rows selected.
--3、until cancel 恢複(基於放棄的恢複)
sys@SYBO2SZ> @db_hot_bak -->熱備資料庫
sys@SYBO2SZ> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 DEV SZ
sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive -->當前已經存在的歸檔日誌
total 348K
-rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc
-rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc
-rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc
sys@SYBO2SZ> alter system switch logfile; -->切換日誌
System altered.
sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive -->可以看到新增了arch_792003491_1_4.arc
total 416K
-rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc
-rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc
-rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc
-rw-r----- 1 oracle oinstall 66K 2012-08-22 17:04 arch_792003491_1_4.arc
sys@SYBO2SZ> insert into dept select 60,'HR','SHANGHAI' from dual;
sys@SYBO2SZ> insert into dept select 70,'INFRA','HONGKONG' from dual;
sys@SYBO2SZ> commit;
Commit complete.
sys@SYBO2SZ> alter system checkpoint; -->切換日誌
System altered.
sys@SYBO2SZ> alter system archive log current;
System altered.
sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive
total 420K
-rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc
-rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc
-rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc
-rw-r----- 1 oracle oinstall 66K 2012-08-22 17:04 arch_792003491_1_4.arc
-rw-r----- 1 oracle oinstall 2.5K 2012-08-22 17:07 arch_792003491_1_5.arc
sys@SYBO2SZ> insert into dept select 80,'MARKET','BEIJING' from dual;
sys@SYBO2SZ> commit;
Commit complete.
sys@SYBO2SZ> alter system archive log current;
System altered.
sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive -->系統又新增了幾個歸檔日誌
total 424K
-rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc
-rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc
-rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc
-rw-r----- 1 oracle oinstall 66K 2012-08-22 17:04 arch_792003491_1_4.arc
-rw-r----- 1 oracle oinstall 2.5K 2012-08-22 17:07 arch_792003491_1_5.arc
-rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:08 arch_792003491_1_6.arc
sys@SYBO2SZ> ho strings /u02/database/SYBO2SZ/archive/arch_792003491_1_5.arc | grep HONGKONG -->新記錄已存在于歸檔日誌
HONGKONG
sys@SYBO2SZ> ho strings /u02/database/SYBO2SZ/archive/arch_792003491_1_6.arc | grep BEIJING
BEIJING
sys@SYBO2SZ> ho rm /u02/database/SYBO2SZ/archive/arch_792003491_1_5.arc -->類比部分歸檔日誌丟失
sys@SYBO2SZ> ho ls -hltr /u02/database/SYBO2SZ/archive
total 420K
-rw-r----- 1 oracle oinstall 340K 2012-08-22 17:01 arch_792003491_1_1.arc
-rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:01 arch_792003491_1_2.arc
-rw-r----- 1 oracle oinstall 1.0K 2012-08-22 17:02 arch_792003491_1_3.arc
-rw-r----- 1 oracle oinstall 66K 2012-08-22 17:04 arch_792003491_1_4.arc
-rw-r----- 1 oracle oinstall 2.0K 2012-08-22 17:08 arch_792003491_1_6.arc
sys@SYBO2SZ> shutdown immediate;
sys@SYBO2SZ> startup mount;
ORACLE instance started.
Total System Global Area 599785472 bytes
Fixed Size 2074568 bytes
Variable Size 243271736 bytes
Database Buffers 348127232 bytes
Redo Buffers 6311936 bytes
Database mounted.
sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/SYBO*.dbf /u02/database/SYBO2SZ/oradata/. -->還原資料庫
sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/sys*.dbf /u02/database/SYBO2SZ/oradata/.
sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/backup/hotbak/undotbs* /u02/database/SYBO2SZ/undo/.
sys@SYBO2SZ> recover database until cancel; --> 基於 cancel 恢複資料庫
ORA-00279: change 494124 generated at 08/22/2012 17:02:30 needed for thread 1
ORA-00289: suggestion : /u02/database/SYBO2SZ/archive/arch_792003491_1_4.arc
ORA-00280: change 494124 for thread 1 is in sequence #4
Specify log: {=suggested | filename | AUTO | CANCEL}
/u02/database/SYBO2SZ/archive/arch_792003491_1_4.arc -->恢複到尾數為4的歸檔日誌
ORA-00279: change 494189 generated at 08/22/2012 17:04:46 needed for thread 1
ORA-00289: suggestion : /u02/database/SYBO2SZ/archive/arch_792003491_1_5.arc
ORA-00280: change 494189 for thread 1 is in sequence #5
ORA-00278: log file '/u02/database/SYBO2SZ/archive/arch_792003491_1_4.arc' no longer needed for this recovery
Specify log: {=suggested | filename | AUTO | CANCEL}
cancel -->第5個記錄檔丟失,輸入cancel
Media recovery cancelled.
sys@SYBO2SZ> alter database open resetlogs; --> resetlogs 方式開啟資料庫
Database altered.
sys@SYBO2SZ> select * from dept; -->由于歸檔日誌5丟失,因此後續所有操作的資料丟失
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 DEV SZ
5 rows selected.
oracle視頻教程請關注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html