Oracle 9i備份和恢復

gjm008發表於2009-01-22
第一章 備份和恢復的基本概念

1.        資料丟失的分類
資料丟失可分為邏輯丟失和物理丟失。
邏輯丟失:使用者錯誤操作和應用程式錯誤造成資料丟失。
物理丟失:資料庫物理結構破壞。

2. 備份和恢復的分類
邏輯備份和邏輯恢復。
物理備份和物理恢復。

物理恢復的原則:所有的檔案必須在時間點上一致。

崩潰恢復(Crash Recovery)與例項恢復(Instance Recovery):
包括快取恢復(Cache Recovery)和事務恢復(Transaction Recovery)。
   快取恢復:利用聯機重做日誌檔案進行恢復。
   事務恢復:回退(rollback)未提交的事務。
系統自動做的。

介質恢復(Media Recovery):利用歸檔重做日誌檔案和聯機重做日誌檔案進行恢復。

修復(restore)(找出檔案)和恢復(recover)(使與其他檔案同步)。

3. 邏輯備份和物理備份
邏輯備份和物理備份的內容。

物理備份可分為冷備份和熱備份。
如何要進行熱備份,資料庫必須要處於歸檔模式。
如何要進行冷備份,資料庫可以是歸檔模式,也可以是非歸檔模式。
冷備份只能將資料庫恢復到備份時的狀態。
熱備份可以將資料庫恢復到故障時的狀態,或者將資料庫恢復到一個指定的時間點(稱為基於時間點的恢復)。

物理備份的方式:整庫、表空間、資料檔案、控制檔案、歸檔重做日誌檔案
、SPfile或Pfile、密碼檔案、網路檔案(listener.ora和
tnsnames.ora)。聯機重做日誌檔案不備份!


一致性備份(Consistent Backup):shutdown immediate/normal時備份。
不需要重做日誌來進行恢復。
非一致性備份(Inconsistent Backup):open時或shutdown abort時備份。
需要重做日誌來進行恢復。
(如果聯機重做日誌檔案丟失,需要有所有資料檔案的備份。)

邏輯備份和物理備份的適用策略:
邏輯備份只能防止邏輯丟失。
物理備份既能防止邏輯丟失,又能防止物理丟失。


第二章 邏輯備份和邏輯恢復
一、邏輯備份
邏輯備份使用EXP程式完成。
邏輯備份可分為:指定表的邏輯備份、指定使用者的邏輯備份和整庫邏輯備份。

C:\>EXP -HELP
一個檔案裡只能存放一次備份。

各個引數的含義與預設值。
USERID
FULL
BUFFER
OWNER
FILE (預設備份的檔名expdat.dmp)
TABLES
COMPRESS
RECORDLENGTH
GRANTS
ROWS
PARFILE
CONSTRAINTS
CONSISTENT 交叉表的一致性,當備份時,使用者可以錄入資料這樣就有可能影響資料外來鍵的一致性。
LOG
STATISTICS 可取COMPUTE、ESTIMATE、NONE。
DIRECT
TRIGGER
FEEDBACK   值為0時禁用。

邏輯備份的三個例子:
指定表的邏輯備份
c:\>exp USERID=system/oracle@erp tables=scott.emp, scott.dept, hr.employees
file=c:\logback\ed.dmp

指定使用者的邏輯備份  備份指定使用者的所有資料(表,索引等等)
c:\>exp USERID=system/oracle@erp wner=scott file=c:\logback\scott.dmp

整庫邏輯備份
c:\>exp USERID=system/oracle@erp full=y file=c:\logback\full.dmp

注意:不能同時指定owner和tables!


用AT命令進行自動備份:
C:\>AT 15:10 exp userid=system/oracle@erp tables=scott.emp  file=c:\logback\at.dmp

也可用任務計劃進行自動備份。

可以設定一個自動備份,做為任務計劃,自動執行。

用當前日期生成一個備份檔案:
建一個C:\BACKUP.BAT指令碼
@echo off
for /f "tokens=1 delims= " %%u in ('date /t') do exp userid=system/oracle@erp tables=scott.emp  file=c:\logback\%%u.dmp log=c:\logback\%%u.log

注:在指令碼中不能換行。

tokens為標記的個數。
delims為標記之間的分隔符。

二、邏輯恢復
邏輯恢復使用IMP程式完成。

C:\>IMP  -HELP

引數的含義與預設值。
FROMUSER
TOUSER
TABLES

邏輯恢復的四個例子:
1.        表不存在(假設刪除scott使用者下的EMP和DEPT表)
c:\>imp userid=system/oracle@erp fromuser=scott tables=emp,dept file=c:\logback\ed.dmp

2.        表存在,資料丟失
c:\>imp userid=system/oracle@erp fromuser=scott tables=emp,dept file=c:\logback\ed.dmp ignore=y

當邏輯恢復的內容已存在,會出現錯誤,ignore=y將忽略繼續,ignore預設為n。

邏輯恢復順序:物件型別,表的結構,表的資料,表的索引,表的約束,檢視,函式和過程,觸發器。邏輯恢復前將約束關閉。

3.        使用者不存在(假設刪除scott使用者)
先要建立scott使用者。
c:\>imp userid=system/oracle@erp fromuser=scott file=c:\logback\scott.dmp

4.整庫丟失
先建立一個同名資料庫(注意資料庫不同名不能恢復!)。
C:\>imp userid=system/oracle@erp full=y file=c:\logback\full.dmp

因為有很多內容已存在,所以在整庫恢復過程中會出現許多錯誤提示,這是是正常的。

三、用圖形介面進行邏輯備份和邏輯恢復
演示用圖形介面進行邏輯備份和邏輯恢復(啟動管理服務)
檢查首選身份設定是否正確。
    邏輯備份:工具資料庫工具資料管理匯出
邏輯恢復:工具資料庫工具資料管理匯入

字符集不同的資料庫之間進行邏輯備份和邏輯恢復,Oracle會自動進行字符集的
轉換。


第三章 用OS方式進行物理備份

一、物理備份的基本概念
物理資料備份可分為冷備份(cold)和熱備份(hot)。
即離線備份(offline backup)和聯機備份(online backup)。

二、用OS方式冷備份
①非歸檔模式下:
    只能進行冷備份(cold),不能進行熱備份(hot)。

冷備份要備份所有檔案的控制檔案、資料檔案,不包括聯機重做日誌檔案。

恢復時也要恢復所有的控制檔案、資料檔案,不包括聯機重做日誌檔案,即使只有一個檔案破壞也需要全部恢復。

例項1:冷備份不包括聯機重做日誌檔案情況下的恢復。
檢視重做日誌組,日誌的序列號
1、sys/oracle@erp as sysdba 進入sql*plus;
2、SQL>shutdown immediate (保持所有資料檔案在時間點上的一致性)
3、拷貝c:\oracle\oradata\erp下所有檔案,不包括聯機重做日誌檔案到新的備份目錄。
假設進行如下操作:
4、SQL>startup
5、SQL>create table test(c1 number(5),c2 varcharc(10));
6、SQL>insert into text values(1,’a’);
7、SQL>commit;

此後假設有一個資料檔案壞了
8、SQL>shutdown immediate;
9、刪除一個資料檔案
SQL>startup;
提示:無法標識/鎖定資料檔案所刪除的資料檔案
SQL>shutdown immediate;
將備份的所有檔案拷貝回來
SQL>startup;
提示:日誌檔案比控制檔案更新,因為聯機重做日誌檔案為修改後的。
SQL>recover database until cancel; 完成介質恢復
SQL>alter database open resetlogs;
資料恢復完畢!
SQL>select * from test1;(沒有資料)
但備份後所執行的操作沒有恢復。

錯誤現象:
ORA-00322: 日誌 1 (執行緒 1) 不是當前副本
ORA-00312: 聯機日誌 1 執行緒 1: 'D:\ORACLE\ORADATA\ORADB\REDO01.LOG'

SQL> recover database until cancel
不完全介質恢復。

用重置日誌(resetlogs)的方式開啟資料庫:
SQL> alter database open resetlogs;

用重置日誌(resetlogs)的方式開開資料庫,Oracle會執行兩個操作:
a. 重新建立所有的聯機重做日誌檔案。
b.將日誌的序列號歸為1。生成一個新的資料庫incarnation(狀態)。

注意:冷備份後新增的資料會丟失!

例項2:冷備份包括聯機重做日誌檔案情況下的恢復。(建議採用這種方式!)
1、sys/oracle@erp as sysdba 進入sql*plus;
2、SQL>shutdown immediate (保持所有資料檔案在時間點上的一致性)
3、拷貝c:\oracle\oradata\erp下所有檔案,包括聯機重做日誌檔案到新的備份目錄。
假設進行如下操作:
4、SQL>startup
5、SQL>create table test(c1 number(5),c2 varcharc(10));
6、SQL>insert into text values(1,’a’);
7、SQL>commit;

此後假設有一個資料檔案壞了,然後將備份的所有檔案包括聯機重做日誌檔案拷貝回來。
8、SQL>shutdown immediate;
9、拷貝檔案包括聯機重做日誌檔案。

SQL>startup;
資料恢復完畢!但備份後所執行的操作沒有恢復。

冷備份可用物理資料庫的移植。

例項3:冷備份的情況下能否恢復單個資料檔案?
一種情況:在聯機重做日誌檔案沒有覆蓋的情況下
檢視重做日誌組,切換到新日誌檔案,假設當前聯機重做日誌檔案為redo02.log

1、sys/oracle@erp as sysdba 進入sql*plus;
2、SQL>shutdown immediate (保持所有資料檔案在時間點上的一致性)
3、拷貝c:\oracle\oradata\erp下一個資料檔案到新的備份目錄。

假設進行如下操作:
4、SQL>startup
5、SQL>create table test(c1 number(5),c2 varcharc(10));
6、SQL>insert into text values(1,’a’);
7、SQL>commit;
再次切換到新日誌檔案,假設當前聯機重做日誌檔案為redo03.log
SQL>shutdown immediate
此刪除一個資料檔案。
SQL>startup(提示資料檔案有問題。)
SQL>shutdown immediate
此時將丟失的檔案拷貝回來。
SQL>startup
提示需要介質恢復拷貝回的檔案。
SQL>recover datafile ‘c:\oracle\oradata\erp\user01.dbf’
SQL>alter database open;
SQL>select * form. test;
可以查詢出記錄。

注:若切換到新的聯機重做日誌檔案(例redo03.log),執行了運算元據,再切換到新的聯機重做日誌檔案(例redo01.log),也執行了運算元據,此時,若進行恢復,就可以恢復到redo01.log時所做的操作,只要在做備份時的聯機重做日誌檔案(例redo02.log)沒有被覆蓋。

另一種情況:在聯機重做日誌檔案被覆蓋的情況下,
執行上面的操作,
SQL>Alter system switch logfile; 切換聯機重做日誌檔案
SQL>Alter system switch logfile; 切換聯機重做日誌檔案
將聯機重做日誌檔案切換到備份時的聯機重做日誌檔案,此時,就將備份時的聯機重做日誌檔案覆蓋。
SQL>Set linesize 2600
SQL>Select * from v$log;
SQL>Shutdown immediate
此刪除一個資料檔案。
SQL>startup
提示資料檔案有問題。此時將丟失的檔案拷貝回來。
SQL>shutdown immediate
SQL>startup
提示需要介質恢復拷貝回的檔案。
SQL>recover datafile ‘c:\oracle\oradata\erp\user01.dbf’
介質恢復失敗,因為此時備份時的日誌檔案已經更新。


在聯機重做日誌檔案沒有覆蓋的情況下,可以恢復單個資料檔案。並且不丟失資料。

在聯機重做日誌檔案被覆蓋的情況下,不能恢復單個資料檔案。只能將所有檔案拷貝回來,備份後所做的操作丟失。

例項4:冷備份的情況下,如果聯機重做日誌檔案沒有覆蓋,能否不丟失資料?
1、        sys/oracle@erp as sysdba 進入sql*plus;
2、檢視重做日誌組,假設當前聯機重做日誌檔案為redo02.log
3、SQL>shutdown immediate (保持所有資料檔案在時間點上的一致性)
4、拷貝c:\oracle\oradata\erp下所有檔案,不包括聯機重做日誌檔案到新的備份目錄。
SQL>startup
5、SQL>Alter system switch logfile; 切換聯機重做日誌檔案
檢視當前聯機重做日誌檔案假設為redo03.log
假設進行如下操作:
6、SQL>startup
7、SQL>create table test(c1 number(5),c2 varcharc(10));
8、SQL>insert into text values(1,’a’);
9、SQL>commit;
10、SQL>Alter system switch logfile; 切換聯機重做日誌檔案
檢視當前聯機重做日誌檔案假設為redo01.log
假設進行如下操作:
11、SQL>startup
12、SQL>create table test1(c1 number(5),c2 varcharc(10));
13、SQL>insert into text1 values(1,’a’);
14、SQL>commit;
當前聯機重做日誌檔案為redo01.log
若此時資料檔案出現問題。
10、SQL>shutdown immediate;
11、拷貝檔案, 不包括聯機重做日誌檔案。此時沒有聯機重做日誌檔案。
SQL>startup;
提示日誌檔案與資料檔案不一致。
SQL>recover database until cancel using backup controlfile;
然後按順序提供聯機重做日誌檔案
c:\oracle\oradata\erp\REDO02.LOG (按順序,要從備份起始的聯機重做日誌檔案開始。)
c:\oracle\oradata\erp\REDO03.LOG
c:\oracle\oradata\erp\REDO01.LOG
SQL>alter database open resetlogs;
SQL>select * from test;
結果可以查出。
要求:聯機重做日誌檔案沒有覆蓋


②        歸檔模式下,冷備份可以備份單個資料檔案。
例項1:恢復時可以恢復單個資料檔案。
1、sys/oracle@erp as sysdba 進入sql*plus;
2、SQL>shutdown immediate (保持所有資料檔案在時間點上的一致性)
3、拷貝c:\oracle\oradata\erp下一個資料檔案,到新的備份目錄。

4、運算元據
5、SQL>Alter system switch logfile; 切換聯機重做日誌檔案
6、運算元據
7、SQL>Alter system switch logfile; 切換聯機重做日誌檔案
8、運算元據
9、SQL>Alter system switch logfile; 切換聯機重做日誌檔案
  此時聯機重做日誌檔案已經被覆蓋

10、SQL>shutdown immediate
11、刪除資料檔案
12、SQL>startup
提示出錯
13、SQL>shutdown immediate
14、拷貝回備份的資料檔案
15、SQL>startup
提示出錯
16、SQL>recover datafile ‘c:\oracle\oradata\erp\user01.dbf’;
因為有歸檔日誌檔案,直接回車。
17、SQL>alter database open;
最後操作的資料也存在。

例項2:在歸檔模式下用冷備份恢復整個資料庫。
1、sys/oracle@erp as sysdba 進入sql*plus;
2、SQL>shutdown immediate (保持所有資料檔案在時間點上的一致性)
3、拷貝c:\oracle\oradata\erp下所有資料檔案,(注不包括聯機重做日誌檔案)到新的備份目錄。

4、運算元據
5、SQL>Alter system switch logfile; 切換聯機重做日誌檔案
6、運算元據
7、SQL>Alter system switch logfile; 切換聯機重做日誌檔案
8、運算元據
9、SQL>Alter system switch logfile; 切換聯機重做日誌檔案
  此時聯機重做日誌檔案已經被覆蓋

10、SQL>shutdown immediate
11、刪除資料檔案
12、SQL>startup
提示出錯
13、SQL>shutdown immediate
14、拷貝回備份的所有的資料檔案,不包括聯機重做日誌檔案
15、SQL>startup
提示出錯
16、SQL>recover database until cancel using backup controlfile;
因為有歸檔日誌檔案,直接回車。
然後還提示需要檔案,此時將聯機重做日誌檔案一個一個的試,直至恢復成功。
17、SQL>alter database open resetlogs;
最後操作的資料也存在。
此時要將歸檔檔案刪除,因為新做的日誌恢復,不刪除的話,會出現檔名重複,出錯。

恢復方法:
SQL> recover database until cancel using backup controlfile
注意應用歸檔日誌檔案和聯機重做日誌檔案的方法:
       如果有所需要的歸檔日誌檔案,按Enter鍵。
       如果沒有所需要的歸檔日誌檔案,依次用每一個聯機重做日誌檔案來試。

完全介質恢復。

SQL> alter database open resetlogs
注意:在歸檔模式下冷備份後新增的資料不會丟失!
在歸檔模式下備份整個資料庫不能備份聯機重做日誌檔案,因為備份聯機重做日誌檔案會帶來的危險:
1.造成不完全恢復。 2. 重複生成具有相同順序號的聯機重做日誌檔案。



三、用OS方式進行熱備份(在資料庫執行時進行的備份恢復),
資料庫必須要執行在歸檔模式,自動歸檔!

1.        演示:非歸檔模式為什麼不能進行熱備份?
如果聯機重做日誌檔案沒有覆蓋,可以。
如果聯機重做日誌檔案志覆蓋,不可以。

2. 資料庫在歸檔模式下,控制檔案的備份和恢復
首先進行控制檔案的備份:
  SQL> alter database backup controlfile to ‘c:\control.bak’;
   將資料庫關閉後刪除所有的控制檔案。
SQL>startup (提示錯誤ora-00205)
SQL>Shutdown immediate
將c:\control.bak複製三份到c:\oracle\oradata\erp下,依次改名為控制檔名
SQL>startup
SQL> recover database until cancel using backup controlfile;
注意應用歸檔日誌檔案和聯機重做日誌檔案的方法:
       如果有所需要的歸檔日誌檔案,按Enter鍵。
       如果沒有所需要的歸檔日誌檔案,依次用每一個聯機重做日誌檔案來試。
       直到完成介質恢復。
SQL> alter database open resetlogs;
用重置日誌(resetlogs)的方式開開資料庫,Oracle會執行兩個操作:
a. 重新建立所有的聯機重做日誌檔案。
b.將日誌的序列號歸為1。生成一個新的資料庫incarnation。

3. 資料庫在歸檔模式下,聯機重做日誌檔案的恢復
聯機重做日誌檔案沒有備份,只能有命令來恢復。

如果丟失非當前重做日誌組的聯機重做日誌檔案:(當前是redo01.log,丟失redo02.log)
SQL>alter database clear logfile  'D:\ORACLE\ORADATA\ERP\REDO02.LOG';
(重新建立聯機重做日誌檔案)
SQL>alter database open;

如果丟失當前重做日誌組的聯機重做日誌檔案:
SQL> shutdown immediate(不能shutdown abort,否則不能恢復)
SQL>startup
SQL> recover database until cancel; (重新建立所有聯機重做日誌檔案)
SQL> alter database open resetlogs;

再刪除現有應用歸檔日誌檔案,在C:\oracle\ora92\rdbms\arc*.001。

如果recover database untile cancel;則必須alter database open resetlogs;

演示:(無法恢復)
SQL> shutdown abort;
然後刪除所有的聯機重做日誌檔案。
SQL> recover database until cancel;
SQL> alter database open resetlogs;
    要點: abort方式關閉資料庫時如果丟失聯機重做日誌檔案,資料庫不能恢復。只能用以前的備份恢復。

4. 資料庫在歸檔模式下,資料檔案的備份和恢復
能否只拷貝檔案來備份資料庫?
不能!要防止斷裂資料塊(Fractured Block)。

在備份資料檔案之前首先要將資料檔案所在的表空間設成備份模式:
SQL>alter tablespace users begin backup;
將檔案複製出來。
然後結束表空間的備份模式:
SQL>alter tablespace users end backup;

對該表空間的操作記錄在聯機重做日誌檔案。

恢復資料檔案時先將該檔案還原,然後進行恢復:
SQL>recover datafile ‘c:\oracle\oradata\erp\users01.dbf’;
SQL>alter database open;

    驗證備份的檔案是否完整:
    C:\> dbv file=d:\users01.dbf  blocksize=8192
   

第四章 用恢復管理器(Recover Manager)進行熱備份

一、恢復目錄(recovery catalog)的概念
  沒有恢復目錄和有恢復目錄的區別:
  沒有恢復目錄:備份資訊存放在備份資料庫的控制檔案中。
    有恢復目錄:備份資訊存放在恢復目錄中。

建立恢復目錄的步驟:
每個資料庫中已經有了RMAN使用者,恢復目錄也有了。
先要解除RMAN使用者的鎖定,然後然後用SQL*PLUS登入修改其密碼。

二、使用RMAN進行熱備份
1. 使用RMAN
沒有恢復目錄:
c:\>RMAN target=sys/oracl@erp nocatalog

有恢復目錄:
c :\>RMAN target=sys/oracle@erp catalog=rman/rman@oemrep
   
    2. 如果要刪除和建立恢復目錄
    RMAN> drop catalog;
RMAN> create catalog tablespace tools;

3. 備份之前首先要註冊資料庫
RMAN> register database;

檢視恢復管理器的配置:
RMAN>show all;

4.備份命令
備份整個資料庫:
RMAN>run {
allocate channe cl type disk;
backup full filesperset 3
(database format ‘rm_%s%p.%d’);
release channel cl;
}

備份集(backup set)和備份段(backup piece)的含義。

格式的定義:
%p:piece備份段號。 %d:database 資料庫名。                 %s:備份集號。
%c(copy號):總為1。 %u:自動生成的8個字元的唯一名稱。    %t:時間。
預設格式為 %U=%u_%p_%c。

可用下面的簡化命令備份整個資料庫:
RMAN> backup database;
備份集的預設路徑是C:\Oracle\Ora92\Database。
通道的分配和釋放可以省略。

指定備份集的路徑:
RMAN> backup database format ‘c:\rman\db_%U’;

備份一個表空間:
RMAN> backup
tablespace users format  ‘c:\rman\ts_%U’;

備份一個資料檔案:
RMAN> backup datafile ‘c:\oracle\oradata\erp\users01.dbf’ format  ‘c:\rman\df_%U’;

備份控制檔案:
RMAN>Backup current controlfile ‘c:\rman\ctl_%U’;

備份歸檔日誌檔案:
RMAN>backup filesperset 20 format  ‘c:\rman\al_%U’
archivelog all  delete input;
   
也可以採用複製的方式備份資料檔案和控制檔案。

複製資料檔案:
RMAN>copy datafile 'c:\oracle\oradata\ERP\users01.dbf' to 'c:\rman\users01.dbf';

複製控制檔案:
RMAN>copy current controlfile to  ’c:\rman\ctl.bak’;
   
5.        管理備份集的命令
    檢視資料庫的備份:
RMAN>list backup of database;

檢視廢棄的資料庫備份:
RMAN> report obsolete;

刪除廢棄的資料庫備份:
RMAN> delete obsolete;
注意不要直接刪除備份集的檔案。

刪除一個備份集:
RMAN>change backuppiece 'C:\ORACLE\ORA92\DATABASE\08FKRJDB_1_1' delete;  
RMAN>change backupset 9 unavailable;

6. 管理備份指令碼的命令
建立指令碼:RMAN> create script. MyBackup {
                    Allocate channe cl type disk;
Backup full filesperset  3
(database format  ‘rm_%s%p.%d’);
                        release channel c1;
}

      執行指令碼:RMAN> run { execute script. MyBackup; }
      修改指令碼:RMAN> replace script. MyBackup {  ... }
      刪除指令碼:RMAN> delete script. MyBackup;
      檢視指令碼:RMAN> print script. MyBackup; (注意指令碼名區分大小寫。)
查詢備份內容:檢視RC_DATABAE、RC_STORED_SCRIPT、RC_STORED_SCRIPT_LINE。

第五章 用恢復管理器進行物理恢復

一、恢復命令

從資料集中復原一個資料檔案:
RMAN> restore datafile 'C:\oracle\oradata\ERP\users01.dbf';

恢復一個資料檔案:
RMAN> recover datafile 'C:\oracle\oradata\ERP\users01.dbf';

從資料集中復原一個表空間:
RMAN>restore tablespace users;

恢復一個表空間:
RMAN>recover tablespace users;

二、恢復例項
1. 丟失單個資料檔案
(假設丟失資料檔案C:\oracle\oradata\ERP\users01.dbf)
恢復步驟:
RMAN> restore datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN> recover datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN>sql ‘alter database open’;

2.        丟失多個資料檔案
(假設丟失資料檔案C:\oracle\oradata\ERP\users01.dbf 和
C:\oracle\oradata\ERP\tools01.dbf)
   
恢復步驟:
RMAN> restore datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN> recover datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN>sql ‘alter database open’;
  這一步會出錯,繼續恢復下一個資料檔案。
RMAN> restore datafile 'C:\oracle\oradata\ERP\tools01.dbf';

RMAN> recover datafile 'C:\oracle\oradata\ERP\tools01.dbf';

RMAN>sql ‘alter database open’;

3. 在有恢復目錄的情況下丟失所有檔案。
首先做一個資料庫的整庫備份:
RMAN> backup database format ‘c:\rman\%U’;
  
  備份完後一定要切換一次日誌檔案:
SQL> alter system switch logfile; (演示如果沒有這一步的結果。)
  
  然後將資料庫關閉,刪除所有檔案。
  準備啟動資料庫:
  SQL>startup   
這一步會出錯,然後進行恢復。

首先恢復控制檔案:
RMAN> restore controlfile;

接著恢復所有的資料檔案:
RMAN> restore database;
RMAN> shutdown immediate;
RMAN> startup;

下面的兩步要用SQL * PLUS來完成
SQL> recover database until cancel using backup controlfile;
(演示recover database until cancel 的錯誤。)
SQL> alter database open resetlogs;

注意:恢復完後要新增臨時檔案。

注意:用resetlogs的方式開啟資料庫後要在恢復目錄中重置目標資料庫,否則不
能備份。
RMAN>reset database;

4. 基於時間點的恢復
首先做一個資料庫的整庫備份:
RMAN> backup database format ‘c:\rman\%U’;
      
      將資料庫改成MOUNT狀態:
      RMAN>shutdown immediate;
      RMAN>startup mount;

      設定時間格式的環境變數
退出RMAN
C:/>set nls_date_format = yyyy-mm-dd hh24:mi:ss
      
      重新登入RMAN
RMAN>run {
set until time  ‘2004-9-13 14:28:00’;
allocate channe cl type disk;
restore database;
recover database;
release channel cl;
}

SQL> alter database open resetlogs;

5.        線上恢復
將資料庫關閉後刪除資料檔案C:\oracle\oradata\ERP\users01.dbf。
將資料檔案C:\oracle\oradata\ERP\users01.dbf離線後啟動資料庫:
SQL> ALTER DATABASE DATAFILE ‘C:\oracle\oradata\ERP\users01.dbf’ OFFLINE;


恢復步驟:
RMAN> restore datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN> recover datafile 'C:\oracle\oradata\ERP\users01.dbf';

然後在SQL * PLUS 中將資料檔案聯機:
SQL> ALTER DATABASE DATAFILE ‘C:\oracle\oradata\ERP\users01.dbf’ ONLINE;


三、增量備份
1.增量備份可分為0-4級。0級為完全備份。
增量備份可分為:
差異式:最近一次<=n級增量備份以後變化了的資料。
累加式:最近一次
增量備份
RMAN> Backup incremental level 0 Differential
tag backup_db_level_0
filesperset 6
format  ‘c:\rman\db_%U’
database;

累加式增量備份的關鍵字為cumulative。
在增量備份與歸檔日誌之間,RMAN優先採用增量備份。
採用增量備份進行恢復比採用歸檔日誌進行恢復效率要高。

2. 跳過只讀檔案
RMAN>backup
full
#  skip offline
#  skip readonly
skip inaccessible
tag b_db_full
filesperset 6
format  ‘c:\rman\db_%U’
database;

四、用圖形介面進行物理備份和物理恢復
節點的首選身份證明設成Administrator(密碼不能為空)。
在"本地安全策略"中給Administrator分配"作為批處理作業登入"許可權。

圖形介面的備份和命令列的備份可以互用。
  
  圖形介面可以恢復控制檔案。
可以恢復丟失除所有檔案的情況,要結合命令完成。
可以做基於時間點的恢復。
資料庫開啟時,可以線上恢復。

五、刪除目標資料庫的註冊:

用rman/rman登入oemrep資料庫。
SQL>select * from db;
SQL>execute dbms_rcvcat.unregisterdatabase(DB_KEY,DB_ID);
SQL>select * from db;

六、SQL *Loader的使用
   SQL *Loader的作用:將文字檔案中的資料載入到Oracle 資料庫中。
  
先建立資料檔案c:\data.txt
   
10001,"Scott Tiger", 1000, 40
10002,"Frank Naude", 500, 20

然後建立控制檔案c:\control.txt
load data
infile 'c:\data.txt'
append into table emp
fields terminated by "," optionally enclosed by '"'
( empno, empname, sal, deptno )

表空,用INSERT(預設)。
表非空,用APPEND、REPLACE、TRUNCATE。

   然後執行SQL *Loader:
c:\>sqlldr system/oracle@erp control=c:\control.txt


練習一 用EXP和IMP進行邏輯備份和邏輯恢復

1. 首先用EXP進行一個資料庫的整庫邏輯備份
c:\>exp USERID=system/oracle@erp full=y file=c:\logback\full.dmp

2.        然後進行下面三種情況下的邏輯恢復:

a. 表不存在的情況:
刪除scott使用者下的EMP和DEPT表,然後用下面的命令恢復刪除的表:
c:\>imp userid=system/oracle@erp fromuser=scott tables=emp,dept file=c:\logback\full.dmp
      恢復完後檢查資料是否完整。

b. 表存在,資料丟失的情況:
刪除scott使用者下的EMP表的所有資料,但表不要刪除,然後用下面的命令恢復刪除表的資料:
c:\>imp userid=system/oracle@erp fromuser=scott tables=emp file=c:\logback\full.dmp ignore=y

c.        使用者不存在的情況:
刪除scott使用者,然後用下面的命令恢復刪除的使用者:
c:\>imp userid=system/oracle@erp fromuser=scott file=c:\logback\full.dmp
  檢查出現的錯誤。

建立scott使用者,並將它新增到connect和resource角色。然後再用下面的命令恢復刪除的使用者:
c:\>imp userid=system/oracle@erp fromuser=scott file=c:\logback\full.dmp


練習二 在非歸檔模式下進行資料庫的冷備份和恢復

1.        將資料庫關閉,然後進行資料庫的冷備份。
SQL>shutdown immediate

將資料庫所有的控制檔案、資料檔案複製到c:\cold目錄。

2.        啟動資料庫。
SQL>startup
然後將scott使用者刪除。

將資料庫關閉,將冷備份的檔案從c:\cold目錄複製到資料庫檔案所在的目錄。
啟動資料庫,將出現下面錯誤:

錯誤現象:
ORA-00322: 日誌 1 (執行緒 1) 不是當前副本
ORA-00312: 聯機日誌 1 執行緒 1: 'D:\ORACLE\ORADATA\ORADB\REDO01.LOG'

進行不完全介質恢復。
SQL> recover database until cancel
不完全介質恢復。

用重置日誌(resetlogs)的方式開啟資料庫:
SQL> alter database open resetlogs;

恢復完後檢查scott使用者及其方案下的資料是否存在。


練習三 在有恢復目錄的情況下用RMAN進行資料庫的熱備份

1. 假設要備份的目標資料庫是ERP,恢復目錄存放在OEMREP資料庫中。

每個資料庫中已經有了RMAN使用者,恢復目錄也有了。
在OEMREP資料庫中,先要解除RMAN使用者的鎖定,然後然後用SQL*PLUS登入修改其密碼。

2. 使用RMAN進行熱備份
使用RMAN
c :\>RMAN target=sys/oracle@erp catalog=rman/rman@onmrep
   
備份之前首先要註冊資料庫
RMAN> register database;

檢視恢復管理器的配置:
RMAN>show all;

4.備份命令
備份整個資料庫:
RMAN>run {
allocate channe cl type disk;
backup full filesperset 3
(database format ‘rm_%s%p.%d’);
release channel cl;
}

備份集(backup set)和備份段(backup piece)的含義。

格式的定義:
%p:piece備份段號。 %d:database 資料庫名。                 %s:備份集號。
%c(copy號):總為1。 %u:自動生成的8個字元的唯一名稱。    %t:時間。
預設格式為 %U=%u_%p_%c。

可用下面的簡化命令備份整個資料庫:
RMAN> backup database;
備份集的預設路徑是C:\Oracle\Ora92\Database。
通道的分配和釋放可以省略。

指定備份集的路徑:
RMAN> backup database format ‘c:\rman\db_%U’;

備份一個表空間:
RMAN> backup
tablespace users format  ‘c:\rman\ts_%U’;

備份一個資料檔案:
RMAN> backup datafile ‘c:\oracle\oradata\erp\users01.dbf’ format  ‘c:\rman\df_%U’;

備份控制檔案:
RMAN>Backup current controlfile ‘c:\rman\ctl_%U’;

備份歸檔日誌檔案:
RMAN>backup filesperset 20 format  ‘c:\rman\al_%U’
archivelog all  delete input;
   
也可以採用複製的方式備份資料檔案和控制檔案。

複製資料檔案:
RMAN>copy datafile 'c:\oracle\oradata\ERP\users01.dbf' to 'c:\rman\users01.dbf';

複製控制檔案:
RMAN>copy current controlfile to  ’c:\rman\ctl.bak’;
   
6.        管理備份集的命令
    檢視資料庫的備份:
RMAN>list backup of database;

檢視廢棄的資料庫備份:
RMAN> report obsolete;

刪除廢棄的資料庫備份:
RMAN> delete obsolete;
注意不要直接刪除備份集的檔案。

刪除一個備份集:
RMAN>change backuppiece 'C:\ORACLE\ORA92\DATABASE\08FKRJDB_1_1' delete;  
RMAN>change backupset 9 unavailable;


練習四 在有恢復目錄的情況下用RMAN進行資料庫的恢復

1. 首先做一個資料庫的整庫備份:
RMAN> backup database format ‘c:\rman\%U’;
  
丟失單個資料檔案(假設丟失資料檔案C:\oracle\oradata\ERP\users01.dbf)
  關閉資料庫,刪除資料檔案C:\oracle\oradata\ERP\users01.dbf。
  丟失單個資料檔案

恢復步驟:

RMAN>startup
RMAN> restore datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN> recover datafile 'C:\oracle\oradata\ERP\users01.dbf';

RMAN>sql ‘alter database open’;

2. 在有恢復目錄的情況下丟失所有檔案。
首先做一個資料庫的整庫備份:
RMAN> backup database format ‘c:\rman\%U’;
  
  備份完後一定要切換一次日誌檔案:

SQL> alter system switch logfile; (演示如果沒有這一步的結果。)
  
  然後將資料庫關閉,刪除所有檔案。
  準備啟動資料庫:
  SQL>startup   
這一步會出錯,然後進行恢復。

首先恢復控制檔案:
RMAN> restore controlfile;

接著恢復所有的資料檔案:
RMAN> restore database;
RMAN> shutdown immediate;
RMAN> startup;

下面的兩步要用SQL * PLUS來完成
SQL> recover database until cancel using backup controlfile;
(演示recover database until cancel 的錯誤。)
SQL> alter database open resetlogs;

注意:恢復完後要新增臨時檔案。

注意:用resetlogs的方式開啟資料庫後要在恢復目錄中重置目標資料庫,否則不
能備份。
RMAN>reset database;

3. 基於時間點的恢復
首先做一個資料庫的整庫備份:
RMAN> backup database format ‘c:\rman\%U’;
      
      將資料庫改成MOUNT狀態:
      RMAN>shutdown immediate;
      RMAN>startup mount;

      設定時間格式的環境變數
退出RMAN
C:/>set nls_date_format = yyyy-mm-dd hh24:mi:ss
      
      重新登入RMAN
RMAN>run {
set until time  ‘2004-9-13 14:28:00’;
allocate channe cl type disk;
restore database;
recover database;
release channel cl;
}

SQL> alter database open resetlogs;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16486600/viewspace-543076/,如需轉載,請註明出處,否則將追究法律責任。

相關文章