Oracle 11gR2資料庫檔案丟失後的恢複測試

來源:互聯網
上載者:User

Oracle 11gR2資料庫檔案丟失後的恢複測試

一、測試環境
資料庫版本是Oracle 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;
  之後檢查各檔案是否正常。
 
 
六、總結
從類比線上記錄檔、控制檔案丟失的過程中可以發現,當這些檔案有副本時,可以很快地開啟資料庫,從而降低恢複資料庫的難度。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.