Oracle 9i備份和恢復
第一章 備份和恢復的基本概念
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;
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 9i的備份和恢復機制(轉)Oracle
- Oracle 備份和恢復Oracle
- Oracle 9i統計資訊備份與恢復Oracle
- oracle冷備份、恢復和異機恢復Oracle
- Oracle 備份和恢復介紹Oracle
- Oracle備份恢復之熱備份恢復及異機恢復Oracle
- ORACLE備份和恢復 - 邏輯備份 exp/impOracle
- 備份和恢復
- CUUG筆記--oracle備份和恢復筆記Oracle
- oracle備份和恢復策略簡介Oracle
- Oracle備份和恢復工具介紹Oracle
- Oracle 備份恢復概念Oracle
- oracle備份恢復PPTOracle
- ORACLE備份&恢復案例Oracle
- 【備份恢復】Oracle 資料備份與恢復微實踐Oracle
- windwos server 路由備份和恢復 路由表備份和恢復Server路由
- redis 備份和恢復Redis
- 備份和恢復redisRedis
- Mysql備份和恢復MySql
- 【oracle】統計資訊的恢復和備份Oracle
- ORACLE備份&恢復案例(轉)Oracle
- Oracle 備份 與 恢復 概述Oracle
- Oracle 備份恢復之 FlashbackOracle
- Oracle RAC備份與恢復Oracle
- ORACLE備份&恢復案例(3)Oracle
- ORACLE備份&恢復案例(5)Oracle
- ORACLE備份&恢復案例(4)Oracle
- ORACLE備份&恢復案例(7)Oracle
- ORACLE備份&恢復案例(6)Oracle
- ORACLE備份&恢復案例(8)Oracle
- ORACLE備份&恢復案例(1)Oracle
- ORACLE備份&恢復案例(2)Oracle
- Oracle備份與恢復 (zt)Oracle
- Oracle備份與恢復案例Oracle
- Oracle備份與恢復(轉)Oracle
- Backup And Recovery User's Guide-備份和恢復概覽-備份和恢復介紹-備份和恢復的目的GUIIDE
- Backup And Recovery User's Guide-備份和恢復介紹-Oracle備份和恢復解決方案GUIIDEOracle
- oracle rman備份驗證和備份/恢復進度監控Oracle