oracle 10g數據庫備份與還原總結
一.總述
1.數據庫歸檔模式:
* 非歸檔模式:當數據庫數據只讀不會改變時,數據不會改變,數據庫適合用非歸檔模式, 這樣提高性能
* 歸檔模式:對于數據庫數據經常變動,數據庫最好用歸檔模式,這樣可以盡量避免數據庫 數據丟失,使出現問題時災害降到最低
2.非歸檔模式與歸檔模式間的切換(在命令窗口下):
@檢查當前日志操作模式
f:\>sqlplus sys/dba as sysdba
連接數據庫
sql>select log_mode from v$database;
@關閉數據庫,后裝載數據庫,只能在mount狀態下改變日志操作模式
sql>startup mount
@改變日志模式
sql>alter database achivelog;(變為歸檔方式,否則為nochivelog)
sql>alter database open;
3.查看歸檔模式相關信息:
@若采用默認設置,歸檔日志位置在快速恢復區
@配置歸檔日志位置 log_archive_dest_n (n=[1:10])
sql>alter system set
log_archive_dest_1 = 'location =c:\demo\archive [optional]';
sql>alter system set
log_archive_dest_2 = 'service =standby [mandatory] [reopen]';
其中:location 是本地
service 是遠程
optional 無論歸檔是否成功,都會覆蓋重做日志
mandatory只有成功歸檔才會覆蓋重做日志
reopen 重新歸檔時間間隔 默認是300s
@顯示歸檔信息,即顯示顯示日志操作模式
sql>select name,log_mode from v$database;
@顯示歸檔日志信息
sql>select name,sequence#,first_change# from v$archive_log;
sequence#: 歸檔序列號
first_change# : 起始SCN值
@顯示歸檔日志位置
sql>select dest_name,destination,status from v$archive_dest;
dest_name 歸檔位置參數名
destination 位置
@顯示日志歷史信息
sql>select * from v$loghist;
threade# : 重做線程號
sequence# : 日志序列號
first_change# : 起始SCN值
first_time : 起始SCN發生時間
switch_change : 切換SCN值
二.非歸檔模式下的備份與還原
. 日志采用覆蓋原有日志的方式存儲
. 出現介質失敗時,只能恢復到過去的完全備份點
. 數據庫OPEN狀態是,不能備份數據庫
. 必須先關閉數據庫,再備份,且必須備份所有數據,控制文件
1.備份==冷備份
@ 先關閉數據庫
sql>shutdown immediate
@ 拷貝所有數據文件,和控制文件
2.恢復
* 數據文件出現丟失,但備份以來的重做日志內容尚未被覆蓋,此時可以完全恢復
@裝載數據庫
sql>startup force mount
@復制數據文件備份
@恢復數據文件
sql>recover datafile 1
@打開數據庫
sql>alter database open;
* 備份文件的重做日志內容已經被覆蓋,則只能還原到備份點
@關閉數據庫
@復制所有數據和控制備份文件至原位置
@裝載數據庫,執行恢復命令
sql>startup mount
sql>recover database until cancel
提示控制文件不再使用原有重做日志
@用resetlogs選項打開數據庫
sql>alter database open resetlogs;
三.歸檔模式
. 可以防止數據丟失
. 數據處于OPEN狀態時可以進行備份
. 當出現介質失敗時,除了SYSTEM表空間中的數據文件外其他的都可以在open狀態下恢復
. 可執行完全恢復,也可以恢復到備份點與失敗點之間的某時刻
1.備份
1)冷備份
shutdown后拷貝所需數據文件和控制文件
2)熱備份
@將數據庫設置為歸檔模式
@在數據庫上發出全局檢查點,在所有的數據文件頭塊上加鎖
sql>alter database begin backup ;
@備份數據文件及控制文件
數據文件直接拷貝至其他目錄
控制文件需使用alter database backup controlfile
sql>alter database backup controlfile to 'd:\backup\demo.ctl';
@結束數據備份,為確保數據文件備份的同步性,還應該歸檔當前日志組
sql>alter database end backup;
sql>alter system archive log cuurent;
3)備份表空間
*脫機備份(表空間處于OFFLINE狀態,SYSTEM表空間和正在使用的UNDO空間不能脫機)
@確定表空間包涵的數據文件,如空間USERS
sql>select file_name from dba_data_files
where tablespace_name = 'users';
@設置表空間為脫機狀態
sql>alter tablespace users offline;
@復制數據文件
@設置表空間聯機
sql>alter tablespace users online;
*聯機備份
@確定對應關系
@設置表空間為備份模式
sql>alter tablespace users begin backup ;
@復制數據文件
@設置表空間為正常模式
sql>alter tablespace users end backup ;
*處理聯機備份失敗
當執行聯機備份時,若出現例程失敗,再次打開數據庫時,如果數據文件仍處于備 份狀態,則會出錯,此時需要結束備份
@裝載數據庫
sql>startup force mount
@查看處于聯機備份狀態的所有數據文件
sql>select file# from v$backup where status = 'active';
@結束聯機備份狀態
sql>alter tablespace end backup
或alter tablespace datafile backup;
或recover datafile 序號
@打開數據庫
sql>alter database open;
2.還原
1)完全恢復
相關命令:
recover database :恢復數據庫的多個數據文件(在MOUNT狀態下運行)
recover tadaspace :恢復多個表空間的所有數據文件(在open狀態下運行)
recover datafile :恢復一個或多個數據文件(在mount,open狀態下都可)
*在mount狀態下恢復數據文件(用于SYSTEM表空間恢復)
@裝載數據庫 mount狀態
@確定需要恢復的數據文件
sql>select file#,error from v$recover_file
@拷貝備份至原位置
@恢復數據庫 recover..上述命令
@打開數據庫 alter database open;
*在open狀態下恢復關閉后意外對視的數據文件,此時數據庫將無法打開
@裝載數據庫 mount
@確定需要恢復的數據文件
@使相應的數據文件脫機
sql>alter database datafile 4 offline;
@打開數據庫
sql>alter database open
@復制數據備份文件
@恢復數據文件
@是數據文件聯機 alter database datafile 4 online;
*在open狀態下恢復打開時意外丟失的數據文件
@確定要恢復的數據文件
@使數據文件脫機
@復制數據文件
@恢復相應的表空間或數據文件
@使相應的表空間或數據文件聯機
*在open狀態下恢復未備份的數據文件(要求在歸檔模式下,新建數據文件,其從簡歷 開始的所有歸檔日志必須全部存在)
@裝載數據庫
@確定要恢復的數據文件
@是數據文件脫機
@打開數據庫
@重新建立數據文件
sql>alter database create datafile 'd:\demo\users01.dbf';
@恢復數據文件
@使數據文件聯機
2)不完全恢復
使用已備份的數據文件,歸檔日志,和重做日志,將數據庫恢復到備份點與失敗點之間 某個時刻的狀態
*恢復分類
基于時間的恢復:誤刪除表,誤截斷表,提交了錯誤的數據
基于取笑恢復:恢復到某個日志序列號之前的狀態
基于SCN的恢復:恢復到特定SCN值的狀態
基于備份控制文件恢復:表空間被意外刪除,或所有控制文件全部損壞
*不完全恢復指令
recover database until time
recover database until change
recover database until cancel
recover database .. using backup controlfile
*基于時間的恢復
@關閉數據庫(為防止備份失敗,應備份當前數據庫所有文件
@裝載數據庫 startup mount
@復制所有備份數據文件,并確定備份文件的時間點
sql>select file#,to_char(time,'yyyy-mm-dd hh24:mi:ss)
from v$recover_file;
@執行recover database until time
sql>recover database until time "2006-09-26 16:40:33'
@以resetlogs方式打開數據庫,并檢查恢復結果
sql>alter database open resetlogs;
@備份數據庫所有數據文件和控制文件,因為當以resetlogs方式打開數據庫后 會重新建立重做日志,清空原有重做日志的所有內容,并將日志序列號復位為1
sql>select name from v$datafile;
sql>alter database begin backup;
拷貝數據文件
sql>alter database end backup;
sql>alter database backup controlfile
to 'd:\backup\demo.ctl' reuse;
sql>alter system archive log cuurent;
*基于SCN恢復
@關閉數據庫
@裝載數據庫 mount
@復制所有備份數據文件,確定備份文件SCN值
sql>select file#,change#, from v$recover_file;
@執行recover database until change
sql>recover database until change 675978;
@以resetlogs方式打開數據庫
@備份數據庫所有數據文件和控制文件
*基于取消恢復
@關閉數據庫
@裝載數據庫
@復制所有備份的數據文件,確定備份文件的SCN值
sql>select file#,change# from v$recover_file;
@執行recover database until cancle
sql>recover database until cancel
@以resetlogs方式打開數據庫
@備份所有數據文件和控制文件
*基于備份控制文件的恢復
@通過查看alert文件,確定誤操作時間
@關閉數據庫
@復制所有備份的數據文件,控制文件
@裝載數據庫
@執行recover database ..using backup controlfile
sql>recover database until time '2004-09-26 19:51:06'
using backup controlfile
@以resetlogs 方式打開數據庫
@備份所有數據文件和控制文件