您好,登錄后才能下訂單哦!
一、測試環境
數據庫版本是11GR2,在做完一份完全備份之后,關機,做一份快照,每一次開機之后都執行數次alter system switch logfile以產生歸檔日志。
之后的測試都是基于這么一個完全備份來恢復。
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/%F';
backup incremental level 0 format '/backup/%T_%f' database;
二、數據文件丟失的測試
2.1丟失所有數據文件的測試
1.啟動數據庫至mount狀態
startup mount;
2.啟動RMAN
[oracle@mycentos orcl]$ rman target /
3.還原數據庫
RMAN>restore database;
4.恢復數據庫
RMAN>recover database;
恢復完成之后,查看各個文件的狀態是否正常。
select file_name,file_id,status from dba_data_files;
--查看臨時表空間文件
select status,enabled, name, bytes/1024/1024 file_size
from v$tempfile;
select file_name from dba_temp_files;
2.2丟失單個數據文件的測試
2.2.1非關鍵數據文件丟失
以丟失數據文件’/u01/app/oracle/oradata/orcl/users01.dbf’為例,當數據庫處于未崩潰狀態時:
1)alter database datafile'/u01/app/oracle/oradata/orcl/users01.dbf' offline;
2)RMAN 模式下restore/recover數據文件
restore datafile '/u01/app/oracle/oradata/orcl/users01.dbf';
recover datafile '/u01/app/oracle/oradata/orcl/users01.dbf'
3)數據文件上線
alter database datafile'/u01/app/oracle/oradata/orcl/users01.dbf' online;
當數據庫因意外而崩潰時:
[oracle@mycentos ~]$ sqlplus /nolog
SQL> conn /as sysdba
SQL> startup;
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/users01.dbf'
--可以直接先啟動至mount狀態
啟動RMAN:
restore datafile '/u01/app/oracle/oradata/orcl/users01.dbf';
recover datafile '/u01/app/oracle/oradata/orcl/users01.dbf'
alter database datafile'/u01/app/oracle/oradata/orcl/users01.dbf' online;
alter database open;
非關鍵數據文件丟失后,先使數據文件處于offline狀態,在恢復數據文件之后,再將其轉成online狀態。
2.2.2關鍵數據文件丟失
[oracle@mycentos orcl]$ rm system01.dbf;
關閉數據庫后,過程與崩潰后恢復數據非關鍵數據文件的過程一樣。
三、日志文件丟失的測試
當前的配置是所有的group都只有一個成員,在group1中新增一個成員,使其變成2個成員,其他group仍然只有一個成員。
3.1丟失inactive日志文件的恢復測試
刪除第二個日志組,并且模擬數據庫崩潰
在未關機狀態下,數據庫能繼續運行,但是日志文件中會有告警信息。
shutdown abort;
startup mount;
alter database clear unarchived logfile group 2; #此命令會重建第二組日志文件
alter database open;
刪除第一組日志的一個成員:
rm redo01.log
shutdown abort;
startup;
數據庫可以正常打開。redo01.log的狀態變成了INVALID.
使用alter database clear unarchived logfile group 1;重建日志文件
3.2丟失CURRENT日志文件的恢復測試
當第一組為CURRENT或actives時,刪除第一組日志的一個成員,數據庫可以正常打開。
第三組為CURRENT,并且只有一個成員時,刪除第三組的日志。
startup 命令報錯,并且在執行clear unarchived logfile時會報
ORA-01624: log 3 needed for crash recovery of instance orcl (thread 1)的錯誤。
alter database open;#會報ORA-00313的錯誤
因此需要用其他方式來打開數據庫:
方法一:使用不完全恢復:
RMAN>RESTORE DATABASE;
RMAN>RECOVER DATABASE UNTIL TIME 'SYSDATE-5/1440';#具體的時間可以看歸檔日志的生成時間
SQL>alter database open resetlogs;
方法二:直接使用不完全恢復,不用RMAN。
SQL>alter system set "_allow_resetlogs_corruption"=true scope=spfile;
SQL>shutdown abort;
SQL>startup mount;
SQL> recover database until cancel;
SQL> alter database open resetlogs;
3.3丟失歸檔日志文件,并且需要恢復數據庫。
使用RMAN不完全恢復至某一個時間點。
3.4丟失所有聯機重做日志文件的測試
參照丟3.2失CURRENT日志文件的恢復測試
四、丟失控制文件的測試
4.1當控制文件有多個副本時,刪除其中一個控制文件,模擬數據庫崩潰的情況。
在數據庫關閉的情況下,將副本復制成已刪除的控制文件的名字,能正常打開數據庫。
4.2 控制文件所有成員丟失,模擬數據庫崩潰
4.2.1 有備份控制文件的情況下,使用備份的控制文件恢復數據庫。
SQL>startup nomount;
RMAN>set dbid 1443678834#可以查看備份的控制文件獲得DBID
RMAN>restore controlfile from '/backup/c-1443678834-20160723-00';
SQL>alter system set "_allow_resetlogs_corruption"=true scope=spfile;
SQL>shutdown abort;
SQL>startup mount;
SQL> recover database using backup controlfile until cancel;
#輸入AUTO,應用歸檔日志后,再輸入一遍recover database .......,輸入online redo的路徑+名稱
SQL> alter database open resetlogs;#數據不會丟失
#有需要的話要重建臨時表空間
#ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf' SIZE 1G;
4.2.2 沒有備份的控制文件,則需要重建控制文件。
在刪除控制文件之前,獲取控制文件的創建語句:
1)alter database backup controlfile to trace as '/home/oracle/crontol_trace.trc';
2)從/home/oracle/crontol_trace.trc文件中獲得如下語句:
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log' SIZE 50M BLOCKSIZE 512,
GROUP 4 '/u01/app/oracle/oradata/orcl/redo_04.log' SIZE 50M BLOCKSIZE 512
DATAFILE
'/u01/app/oracle/oradata/orcl/system01.dbf',
'/u01/app/oracle/oradata/orcl/sysaux01.dbf',
'/u01/app/oracle/oradata/orcl/undotbs01.dbf',
'/u01/app/oracle/oradata/orcl/users01.dbf',
'/u01/app/oracle/oradata/orcl/test_01.dbf',
'/u01/app/oracle/oradata/orcl/test_02.dbf'
CHARACTER SET ZHS16GBK;
如果沒有使用1)中的語句獲取創建語句,也可以根據實際情況重建控制文件。
刪除所有的控制文件,并且模擬數據庫崩潰。
恢復的過程如下:
1)startup nomount;
2)執行創建控制文件的語句,直接復制語句或放在腳本里均可。
3)之后執行:
SQL>alter system set "_allow_resetlogs_corruption"=true scope=spfile;
SQL>shutdown abort;
SQL>startup mount;
SQL> recover database using backup controlfile until cancel;
#輸入AUTO,應用歸檔日志后,再輸入一遍recover database .......,輸入online redo的路徑+名稱
SQL> alter database open resetlogs;#數據不會丟失
重建臨時表空間
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf' SIZE 1G;
五、在只有一份備份的情況下,其余文件均丟失后,打開數據庫
在數據庫崩潰之后:
1)啟動數據庫至nomount,開啟RMAN并設置dbid
SQL>startup nomount;
RMAN>set dbid 1443678834
2)還原控制文件
RMAN>restore controlfile from '/backup/c-1443678834-20160723-00';
SQL>alter database mount;
3)還原數據文件
RMAN>restore database;
4)執行不完全恢復:
SQL>alter system set "_allow_resetlogs_corruption"=true scope=spfile;
SQL>shutdown abort;
SQL>startup mount;
SQL> recover database using backup controlfile until cancel;
因為日志文件、歸檔日志文件都已經被刪除,所以選擇cancel不執行恢復。
SQL> alter database open resetlogs;
之后檢查各文件是否正常。
六、總結
從模擬在線日志文件、控制文件丟失的過程中可以發現,當這些文件有副本時,可以很快地打開數據庫,從而降低恢復數據庫的難度。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。