您好,登錄后才能下訂單哦!
一、測試環(huán)境
數(shù)據(jù)庫版本是11GR2,在做完一份完全備份之后,關(guān)機,做一份快照,每一次開機之后都執(zhí)行數(shù)次alter system switch logfile以產(chǎn)生歸檔日志。
之后的測試都是基于這么一個完全備份來恢復。
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/%F';
backup incremental level 0 format '/backup/%T_%f' database;
二、數(shù)據(jù)文件丟失的測試
2.1丟失所有數(shù)據(jù)文件的測試
1.啟動數(shù)據(jù)庫至mount狀態(tài)
startup mount;
2.啟動RMAN
[oracle@mycentos orcl]$ rman target /
3.還原數(shù)據(jù)庫
RMAN>restore database;
4.恢復數(shù)據(jù)庫
RMAN>recover database;
恢復完成之后,查看各個文件的狀態(tài)是否正常。
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丟失單個數(shù)據(jù)文件的測試
2.2.1非關(guān)鍵數(shù)據(jù)文件丟失
以丟失數(shù)據(jù)文件’/u01/app/oracle/oradata/orcl/users01.dbf’為例,當數(shù)據(jù)庫處于未崩潰狀態(tài)時:
1)alter database datafile'/u01/app/oracle/oradata/orcl/users01.dbf' offline;
2)RMAN 模式下restore/recover數(shù)據(jù)文件
restore datafile '/u01/app/oracle/oradata/orcl/users01.dbf';
recover datafile '/u01/app/oracle/oradata/orcl/users01.dbf'
3)數(shù)據(jù)文件上線
alter database datafile'/u01/app/oracle/oradata/orcl/users01.dbf' online;
當數(shù)據(jù)庫因意外而崩潰時:
[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狀態(tài)
啟動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;
非關(guān)鍵數(shù)據(jù)文件丟失后,先使數(shù)據(jù)文件處于offline狀態(tài),在恢復數(shù)據(jù)文件之后,再將其轉(zhuǎn)成online狀態(tài)。
2.2.2關(guān)鍵數(shù)據(jù)文件丟失
[oracle@mycentos orcl]$ rm system01.dbf;
關(guān)閉數(shù)據(jù)庫后,過程與崩潰后恢復數(shù)據(jù)非關(guān)鍵數(shù)據(jù)文件的過程一樣。
三、日志文件丟失的測試
當前的配置是所有的group都只有一個成員,在group1中新增一個成員,使其變成2個成員,其他group仍然只有一個成員。
3.1丟失inactive日志文件的恢復測試
刪除第二個日志組,并且模擬數(shù)據(jù)庫崩潰
在未關(guān)機狀態(tài)下,數(shù)據(jù)庫能繼續(xù)運行,但是日志文件中會有告警信息。
shutdown abort;
startup mount;
alter database clear unarchived logfile group 2; #此命令會重建第二組日志文件
alter database open;
刪除第一組日志的一個成員:
rm redo01.log
shutdown abort;
startup;
數(shù)據(jù)庫可以正常打開。redo01.log的狀態(tài)變成了INVALID.
使用alter database clear unarchived logfile group 1;重建日志文件
3.2丟失CURRENT日志文件的恢復測試
當?shù)谝唤M為CURRENT或actives時,刪除第一組日志的一個成員,數(shù)據(jù)庫可以正常打開。
第三組為CURRENT,并且只有一個成員時,刪除第三組的日志。
startup 命令報錯,并且在執(zhí)行clear unarchived logfile時會報
ORA-01624: log 3 needed for crash recovery of instance orcl (thread 1)的錯誤。
alter database open;#會報ORA-00313的錯誤
因此需要用其他方式來打開數(shù)據(jù)庫:
方法一:使用不完全恢復:
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丟失歸檔日志文件,并且需要恢復數(shù)據(jù)庫。
使用RMAN不完全恢復至某一個時間點。
3.4丟失所有聯(lián)機重做日志文件的測試
參照丟3.2失CURRENT日志文件的恢復測試
四、丟失控制文件的測試
4.1當控制文件有多個副本時,刪除其中一個控制文件,模擬數(shù)據(jù)庫崩潰的情況。
在數(shù)據(jù)庫關(guān)閉的情況下,將副本復制成已刪除的控制文件的名字,能正常打開數(shù)據(jù)庫。
4.2 控制文件所有成員丟失,模擬數(shù)據(jù)庫崩潰
4.2.1 有備份控制文件的情況下,使用備份的控制文件恢復數(shù)據(jù)庫。
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;#數(shù)據(jù)不會丟失
#有需要的話要重建臨時表空間
#ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf' SIZE 1G;
4.2.2 沒有備份的控制文件,則需要重建控制文件。
在刪除控制文件之前,獲取控制文件的創(chuàng)建語句:
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)中的語句獲取創(chuàng)建語句,也可以根據(jù)實際情況重建控制文件。
刪除所有的控制文件,并且模擬數(shù)據(jù)庫崩潰。
恢復的過程如下:
1)startup nomount;
2)執(zhí)行創(chuàng)建控制文件的語句,直接復制語句或放在腳本里均可。
3)之后執(zhí)行:
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;#數(shù)據(jù)不會丟失
重建臨時表空間
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf' SIZE 1G;
五、在只有一份備份的情況下,其余文件均丟失后,打開數(shù)據(jù)庫
在數(shù)據(jù)庫崩潰之后:
1)啟動數(shù)據(jù)庫至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)還原數(shù)據(jù)文件
RMAN>restore database;
4)執(zhí)行不完全恢復:
SQL>alter system set "_allow_resetlogs_corruption"=true scope=spfile;
SQL>shutdown abort;
SQL>startup mount;
SQL> recover database using backup controlfile until cancel;
因為日志文件、歸檔日志文件都已經(jīng)被刪除,所以選擇cancel不執(zhí)行恢復。
SQL> alter database open resetlogs;
之后檢查各文件是否正常。
六、總結(jié)
從模擬在線日志文件、控制文件丟失的過程中可以發(fā)現(xiàn),當這些文件有副本時,可以很快地打開數(shù)據(jù)庫,從而降低恢復數(shù)據(jù)庫的難度。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。