一症副、恢復(fù)的相關(guān)概念
? ? 1.1)實例恢復(fù)
? ? ? ? ? ? 是指數(shù)據(jù)庫在遭遇突然情況下崩潰,在處理的事務(wù)中有提交的闹啦,有沒有提交的窍奋,
? ? ? ? ? ? 也就是說有臟數(shù)據(jù)琳袄,數(shù)據(jù)庫系統(tǒng)本身有某種記錄狀態(tài)和數(shù)據(jù)的機制窖逗。在下次重啟之后餐蔬,再次運行該實例時,
? ? ? ? ? ? 系統(tǒng)自動檢查相關(guān)狀態(tài)并有專有進程將該實例的狀態(tài)音同、數(shù)據(jù)恢復(fù)到崩潰的那個時候瘟斜。? ?
? ? 1.2)介質(zhì)恢復(fù)
? ? ? ? 首先使用備份還原數(shù)據(jù),然后再應(yīng)用歸檔日志橡类、重做日志的恢復(fù)方式稱為介質(zhì)恢復(fù)芽唇。
? ? ? ? 介質(zhì)恢復(fù)能將一個經(jīng)過還原的數(shù)據(jù)更新到當前的時間點或之前的某個時間點匆笤。
? ? ? ? 通常介質(zhì)恢復(fù)這個術(shù)語專指對數(shù)據(jù)文件進行恢復(fù)的過程炮捧。
? ? ? ? 數(shù)據(jù)塊的介質(zhì)恢復(fù)指數(shù)據(jù)文件中的個別數(shù)據(jù)塊出現(xiàn)錯誤時進行的特殊恢復(fù)操作咆课。
? ? ? ? 介質(zhì)恢復(fù)通常又可以分為完全恢復(fù)和不完全恢復(fù)
? ? ? ? 1.2.1)完全恢復(fù)
? ? ? ? 使用數(shù)據(jù)庫,表空間或數(shù)據(jù)文件的備份進行還原,再使用歸檔,重做日志或增量備份將數(shù)據(jù)更新到當前時間點
? ? ? ? 用戶可以實現(xiàn)基于對數(shù)據(jù)庫、表空間喇澡、數(shù)據(jù)文件執(zhí)行完全恢復(fù)
? ? 1.2.2)不完全恢復(fù)
? ? ? 是將數(shù)據(jù)恢復(fù)到某一個特定的時間點或特定的SCN晴玖。
? ? ? ? 不完全介質(zhì)恢復(fù)的幾種類型:
? ? ? ? ? ? 基于時間的恢復(fù)(Time-based recovery) 將數(shù)據(jù)恢復(fù)到指定的時間點
? ? ? ? 用戶控制的恢復(fù)(Cancel-based recovery) 當用戶提交CANCEL后停止恢復(fù)
? ? ? ? ? ? ? ? ? (此選項在使用RMAN時無效)
? ? ? ? 基于SCN 的恢復(fù)(Change-based recovery) 將數(shù)據(jù)恢復(fù)到指定的SCN
? ? ? ? ? ? 按重做日志序號恢復(fù)(Log sequence recovery)將數(shù)據(jù)恢復(fù)到指定的重做日志序號
? ? ? ? ? ? (僅使用RMAN時有效)
二、基于用戶管理恢復(fù)的方法
? ? 數(shù)據(jù)恢復(fù)時的常用視圖
? ? ? ? v$reover_file? ? --查詢需要恢復(fù)的文件,該視圖信息來自控制文件,
? ? ? ? ? ? ? ? ? ? ? ? ? ? 如控制文件來自備份或重建過則信息會不準
? ? ? ? v$archived_log? ? --查詢所有歸檔日志列表
? ? ? ? v$recovery_log? ? --查詢所有需要用于恢復(fù)的日志
? ? 常用的recover命令
? ? ? ? --mount狀態(tài)下執(zhí)行恢復(fù)
? ? ? ? ? ? SQL> recover database;
? ? ? ? --open狀態(tài)下執(zhí)行恢復(fù)
? ? ? ? ? ? SQL> recover tablespace users;
? ? 配置恢復(fù)自動使用歸檔日志
? ? ? ? 在介質(zhì)恢復(fù)前通過設(shè)置set autorecovery on來自動應(yīng)用歸檔日志實現(xiàn)恢復(fù)
? ? ? ? 也可以在輸入歸檔日志路徑榨惰、文件名時輸入auto
? ? 恢復(fù)文件到新路徑
? ? ? alter database rename file '<dir>' to '<dir>'
三静汤、完全恢復(fù)?
? ? ? 3.1) 恢復(fù)數(shù)據(jù)庫
? ? ? ? ? ? 3.1.1)備份數(shù)據(jù)庫
? ? ? ? ? ? ? ? ? RMAN> backup database;
? ? ? ? ? ? 3.1.2) 刪除所有數(shù)據(jù)文件
SQL> SELECT 'rm -f? '||file_name? FROM DBA_DATA_FILES;
tail -f /opt/oracle/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log
3.1.3)恢復(fù)數(shù)據(jù)庫
? ? ? SQL> startup;
? ? ? SQL> select OPEN_MODE from v$database;
? ? ? SQL> set linesize 200
? ? ? ? ? ? col ERROR format a20
? ? ? ? ? ? select * from v$recover_file;
? ? ? rman target /
? ? ? RMAN> restore database ;
? ? ? SQL>? set linesize 200
? ? ? ? ? ? col ERROR format a20
? ? ? ? ? ? select * from v$recover_file;
? ? ? ? ? ? recover database ;?
? ? ? ? ? ? alter database open;
3.2) 恢復(fù)表空間:恢復(fù)表空間時候琅催,記得OFFLINE表空間居凶,恢復(fù)完成ONLINE;
? ? 3.2.1)創(chuàng)建表空間并插入數(shù)據(jù)
? ? ? ? ? create tablespace rman_tablespace_test datafile '/opt/oracle/oradata/WEISIDB/dbfile_01.dbf' size 100M;
? ? ? ? ? alter user weisi default tablespace rman_tablespace_test;
? ? ? ? ? backup databae;
? ? sqlplus weisi/weisi@weisi
? ? create table big_rman_t tablespace rman_tablespace_test as select * from sys.dba_objects ;? ? ? ?
? ? select count(1) from big_rman_t;
? ? select file_name from dba_data_files where tablespace_name='RMAN_TABLESPACE_TEST' ;
? ? /opt/soft/rman/ORCL/datafile/o1_mf_rman_tab_ckrv2vky_.dbf
? ? rm -f? /opt/oracle/oradata/WEISIDB/dbfile_01.dbf
? ? ? ? ? ? /opt/soft/rman/ORCL/datafile/o1_mf_rman_tab_ckrv2vky_.dbf
? ? select count(1) from big_rman_t;
? ? select file_name,online_status from dba_Data_files;
? ? alter database datafile '/opt/oracle/oradata/WEISIDB/dbfile_01.dbf' offline;
? ? col TABLESPACE_NAME format a30
? ? col file_name format a50
? ? select file_name,online_status from dba_Data_files;
? ? select tablespace_name , status from dba_tablespaces;
? ? alter tablespace rman_tablespace_test offline;
? ? alter tablespace rman_tablespace_test offline immediate;
? ? RMAN> restore tablespace rman_tablespace_test;
? ? ? ? ? recover tablespace rman_tablespace_test;
? ? alter tablespace rman_tablespace_test online;
? ? select count(1) from big_rman_t;
3.3)? 恢復(fù)數(shù)據(jù)文件
? ? ? select file_name,online_status from dba_Data_files;
? ? ? ? rm -f /opt/soft/rman/ORCL/datafile/o1_mf_rman_tab_ckh42899_.dbf
? ? ? ? select count(1) from big_rman_t;
? ? ? ? alter system flush buffer_cache;
? ? ? ? alter database datafile 8 offline;
? ? ? ? RMAN> restore? datafile 8;
? ? ? ? ? ? ? ? ? ? ? ? ? recover datafile 8;
? ? ? ? ? ? ? ? ? alter database datafile 8 online; ?
? ? ? ? ? 總結(jié):
? ? ? ? ? ? ? 數(shù)據(jù)庫處于關(guān)閉狀態(tài)下的恢復(fù):包括系統(tǒng)表空間(系統(tǒng)數(shù)據(jù)文件)、Undo 表空間藤抡、整個數(shù)據(jù)庫
? ? ? ? ? ? ? 1.關(guān)閉實例
? ? ? ? ? ? ? 2.startup mount;
? ? ? ? ? ? ? 3.還原數(shù)據(jù)文件
? ? ? ? ? ? ? 4.使用歸檔日志更新到最新
? ? ? ? ? ? ? 5.打開數(shù)據(jù)庫
? ? ? ? ? 數(shù)據(jù)庫處于打開狀態(tài)下侠碧,非系統(tǒng)數(shù)據(jù)文件丟失的恢復(fù)
? ? ? ? ? 1.將數(shù)據(jù)文件offline(alter database datafile n offline)
? ? ? ? ? 2.還原數(shù)據(jù)文件(restore)
? ? ? ? ? 3.恢復(fù)數(shù)據(jù)文件(recover datafile n)
? ? ? ? ? ? 4.使數(shù)據(jù)文件online (alter database datafile n online)
四:控制文件恢復(fù)
Oracle 控制文件為二進制文件,記錄了當前數(shù)據(jù)庫的物理結(jié)構(gòu)信息,多路復(fù)用的原則缠黍。
在mount階段被讀取,open階段一直被使用
? ? ? ? 控制文件中包含的內(nèi)容:
? ? ? ? ? ? 數(shù)據(jù)庫的名字瓷式、ID替饿、創(chuàng)建的時間戳
? ? ? ? ? ? 表空間的名字
? ? ? ? ? ? 聯(lián)機日志文件、數(shù)據(jù)文件的位置贸典、個數(shù)视卢、名字
? ? ? ? ? ? 聯(lián)機日志的Sequence號碼
? ? ? ? ? ? 檢查點的信息
? ? ? ? ? ? 歸檔信息
? ? ? ? ? ? 備份信息
? ? ? ? alter database backup controlfile to trace as '/opt/soft/control.sql';
? ? ? ? SHOW PARAMETER CONTROL_FILES? ? --列出控制文件的名字、狀態(tài)廊驼、位置等
? ? ? ? 備份控制文件
? ? ? ? 1.alter database backup controlfile to '/opt/soft/control.ctl';
? ? ? ? 2.alter database backup controlfile to trace as '/opt/soft/control.sql' ;
? ? ? ? 3.RMAN>? backup current controlfile;
? ? ? ? 備份:SPFILE
? ? ? ? backup spfile;
? ? ? ? 恢復(fù)SPFILE
? ? ? ? /opt/oracle/product/11.2.0/dbhome/dbs/spfileORCL.ora
? ? ? ? 實驗:
? ? ? ? 1.完全備份數(shù)據(jù)庫
? ? ? ? 2.關(guān)閉數(shù)據(jù)庫
? ? ? ? 3.刪除SPFILE
? ? ? ? ? cd /opt/oracle/product/11.2.0/dbhome/dbs/
? ? ? ? 4.恢復(fù)SPFILE
? ? ? ? ? RMAN> startup force nomount;
? ? ? ? ? RMAN> restore spfile;
? ? ? ? ? RMAN> restore spfile from autobackup;
? ? ? ? ? RMAN> restore spfile from '/opt/oracle/flash_recovery_area/WEISIDB/backupset/2016_12_11/o1_mf_ncsnf_TAG20161211T113526_d4slkyt2_.bkp';
? ? ? ? ? RMAN> restore spfile to '/opt/soft/spfile' from '/opt/soft/recover/ORCL/backupset/2016_04_23/o1_mf_nnsnf_TAG20160423T072145_ckodj973_.bkp';
? ? ? ? ? RMAN> shutdown immediate;
? ? ? ? ? RMAN> start;
? ? ? ? 恢復(fù)控制文件:
? ? ? ? /opt/oracle/oradata/ORCL/control01.ctl, /opt/oracle/oradata/ORCL/control02.ctl
? ? ? ? ? RMAN>? backup current controlfile;
? ? ? ? ? SQL> shutdown immediate;
? ? ? ? ? mv? /opt/oracle/oradata/ORCL/control01.ctl? /opt/oracle/oradata/ORCL/control01.ctl_20160424
? ? ? ? ? mv? /opt/oracle/oradata/ORCL/control02.ctl? /opt/oracle/oradata/ORCL/control02.ctl_20160424
? ? ? ? ? cd opt/soft/recover/ORCL/backupset/
? ? ? ? ? ll -th
? ? ? ? ? SQL>? startup
? ? ? ? ? RMAN> restore controlfile from? '/opt/oracle/flash_recovery_area/WEISIDB/backupset/2016_12_11/o1_mf_ncnnf_TAG20161211T142803_d4swhn8w_.bkp';
? ? ? ? ? RMAN> alter database mount;
? ? ? ? ? RMAN> recover database;
? ? ? ? ? RMAN> alter database open resetlogs;
手動創(chuàng)建控制文件
? ? ? ? ? SQL> alter database backup controlfile to trace as '/opt/soft/control.sql' ;
? ? ? ? ? ? ? shutdown immediate;
? ? ? ? ? ? ? mv? /opt/oracle/oradata/ORCL/control01.ctl? /opt/oracle/oradata/ORCL/control01.ctl_20160424_4
? ? ? ? ? ? ? mv? /opt/oracle/oradata/ORCL/control02.ctl? /opt/oracle/oradata/ORCL/control02.ctl_20160424_4
? ? ? ? ? ? ? sqlplus / as sysdba
? ? ? ? ? ? ? SQL> startup nomount;
? ? ? ? ? ? ? CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS? ARCHIVELOG
? MAXLOGFILES 40
? MAXLOGMEMBERS 3
? ? MAXDATAFILES 100
? ? MAXINSTANCES 8
? ? MAXLOGHISTORY 292
LOGFILE GROUP 2 '/opt/oracle/oradata/ORCL/redo02.log'? SIZE 50M BLOCKSIZE 512, GROUP 3 '/opt/oracle/oradata/ORCL/redo03.log'? SIZE 50M BLOCKSIZE 512
DATAFILE? '/opt/oracle/oradata/ORCL/system01.dbf','/opt/oracle/oradata/ORCL/sysaux01.dbf', '/opt/oracle/oradata/ORCL/undotbs01.dbf', '/opt/oracle/product/11.2.0/dbhome/dbs/data_D-ORCL_I-1434170406_TS-USERS_FNO-4_0vr1prk2', '/opt/oracle/oradata/ORCL/weisi_catalog_01.dbf','/opt/oracle/oradata/ORCL/undo02.dbf','/opt/soft/oracle/rman_tbs_01.dbf'? CHARACTER SET AL32UTF8;
RECOVER DATABASE using backup controlfile;
alter database open resetlogs;
? ? ? ? 數(shù)據(jù)文件無備份情況下的恢復(fù)
? ? ? ? 前提是非系統(tǒng)表空間
? ? ? ? 控制文件未被重新創(chuàng)建或恢復(fù)到以前的版本(丟失數(shù)據(jù)文件的描述信息應(yīng)在數(shù)據(jù)字典和控制文件中)
? ? ? ? 該數(shù)據(jù)文件從文件開始到丟失期間的所有日志必須存在
? ? ? ? 使用下面的命令重建數(shù)據(jù)文件
? ? ? ? ? ? alter database create datafile 'filename';
? ? ? ? ? ? alter database create datafile 'filename' as 'new file name'; --可以放置到不同目錄
? ? ? ? 步驟:-->先將丟失數(shù)據(jù)文件脫機-->重建數(shù)據(jù)文件-->應(yīng)用歸檔日志-->聯(lián)機恢復(fù)的數(shù)據(jù)文件
? ? ? ? SQL> create tablespace rman_datafile_nobackup datafile '/opt/oracle/oradata/ORCL/no_back.dbf' size 100M
? ? ? ? ? ? ? create user wuzhenxing identified by wuzhenxing default tablespace rman_datafile_nobackup;
grant select on DBA_OBJECTS to wuzhenxing;
grant connect to wuzhenxing;
grant resource to wuzhenxing;
wuzhenxing
? ? ? ? ? ? ? create table t as select * from sys.dba_objects;
? ? ? ? ? ? ? insert into t select * from t;
? ? ? ? ? ? ? select count(1) from t;
? ? ? ? ? ? ? SYS
? ? ? ? ? ? ? alter system switch logfile;
? ? ? ? ? ? ? alter system checkpoint;
? ? ? ? ? ? ? os
? ? ? ? ? ? ? rm -f /opt/oracle/oradata/ORCL/no_back.dbf
? ? ? ? ? ? ? SYS
? ? ? ? ? ? ? alter system flush buffer_cache;
? ? ? ? ? ? ? wuzhenxing
? ? ? ? ? ? ? select count(1) from t;
? ? ? ? ? ? ? SYS
? ? ? ? ? ? ? select * from dba_data_files;
? ? ? ? ? ? ? 5?
? ? ? ? ? ? ? alter database datafile 5 offline;
? ? ? ? ? ? ? select * from v$recover_file;
? ? ? ? ? ? ? alter database create datafile 5;
? ? ? ? ? ? ? select * from v$recovery_log;
? ? ? ? ? ? ? select name,checkpoint_change# from v$datafile_header;
? ? ? ? ? ? ? recover datafile 5;
? ? ? ? ? ? ? alter database datafile 5 online;
? ? ? wuzhenxing
? ? ? select count(1) from t;
? ? ? rm -f /opt/oracle/oradata/ORCL/no_back.dbf
? ? ? ps -ef |grep dbw
? ? ? cd /proc/11573/fd
? ? ? ll | grep no
? ? ? cp 31 /opt/oracle/oradata/ORCL/no_back.dbf
? ? ? alter database datafile 9 offline;
? ? ? recover datafile 9;
? ? ? alter database datafile 4 online;
? resetlogs
? 數(shù)據(jù)在啟動時候是要做一致性檢查的据过,oracle在open階段要做兩次檢查
1. 檢查數(shù)據(jù)文件頭的檢查點計數(shù)(checkpoint cnt)是否和控制文件的檢查點計數(shù)(checkpoint cnt)一致。目的是確認數(shù)據(jù)文件
? ? 是否來自同一版本妒挎,而不是從備份中恢復(fù)的绳锅。如果這一步檢查通過,就進行第二步檢查
2. 檢查數(shù)據(jù)文件頭的開始scn和控制文件中記錄該文件的結(jié)束scn是否一致酝掩。如果數(shù)據(jù)文件頭的開始scn和控制文件中該文件的結(jié)束scn
? ? 相等鳞芙,那說明這個數(shù)據(jù)文件就不需要恢復(fù),否則就要恢復(fù)文件
? 如果以上兩步檢查都通過庸队,那就可以正常打開數(shù)據(jù)庫积蜻,鎖定數(shù)據(jù)文件,同時將控制文件中每個數(shù)據(jù)文件的結(jié)束scn設(shè)置無窮大彻消。
? 我們在某些條件下打開數(shù)據(jù)竿拆,會提示讓用resetlogs選項open數(shù)據(jù)庫,為什么要用resetlogs呢宾尚?它是干嘛用的呢丙笋?問號一大堆了吧,
下面來具體分析下。
? resetlogs的作用
? 防止陳舊的數(shù)據(jù)進入數(shù)據(jù)庫(保證數(shù)據(jù)庫的一致性)煌贴,用resetlogs打開數(shù)據(jù)庫御板,一定要立即對數(shù)據(jù)庫做個全備。
? 在控制文件牛郑,data file header怠肋,redo log header里存儲”resetlogs data“,當open resetlogs被執(zhí)行時淹朋,可以通過這些內(nèi)容檢查一致性笙各。
什么時候用resetlogs
1. 不完全恢復(fù)
2. 用備份的控制文件恢復(fù)
3. 新創(chuàng)建的控制文件來恢復(fù)