【技術分享】Oracle控制檔案的備份、恢復以及多路複用

dbqs8710發表於2015-01-07
                   Oracle控制檔案的備份、恢復以及多路複用



前言

     今天Frank給大家帶來有關Oracle控制檔案的技術分享。不積跬步無以至千里,不積小流無以成江海。Oracle技術博大精深,以Frank一個人的力量,那無異於蜉蝣於天地,滄海之一粟。在此,筆者拋磚引玉,希望讀者能夠與Frank形成良好的互動,之間共同進步。閒言少敘,書歸正傳,馬上開始今天的討論話題。

一、控制檔案概要描述
     既然今天的主題是控制檔案,那麼首先Frank先帶大家來簡要回顧一下控制檔案的相關知識點。控制檔案在預設情況下,一般和資料檔案以及日誌檔案等位於同一個目錄(當然,不放在這裡也是沒有問題的……看個人喜好),具體檢視的sql語句是:
      SYS@ENMOEDU > select name from v$controlfile;
      
     NAME
      ------------------------------
      /u01/app/oracle/oradata/ENMOEDU/control01.ctl
      /u01/app/oracle/fast_recovery_area/ENMOEDU/control02.ctl
     從這裡就已經清晰的看到我控制檔案的路徑以及名稱了,還有,細心的讀者應該發現了,Frank是一個很小心謹慎的人,所以呢,我的控制檔案是兩份。這樣做的好處是,萬一我其中的一個控制檔案被誤刪了或者損壞了,我還有另外一個控制檔案保證我資料庫的正常執行以及啟動(不小心把多路複用技術給提前引入了……稍後會有更詳細的配置以及解析)。
     控制檔案的作用我想就毋庸贅言了吧?上至九十老嫗,下到五歲孩童,對於控制檔案的重要性都能如數家珍般的娓娓道來。控制檔案中有資料庫以及線上重做日誌的位置以及眾多重要的資訊,丟失或者損壞控制檔案,資料庫將無法正常啟動和執行。既然控制檔案這麼重要,那麼我們該怎麼對它進行備份和恢復呢?

二、控制檔案的備份與恢復
     (1)基於使用者管理的備份和恢復
     
     首先進入Oracle的trace目錄
     [oracle@ENMOEDU trace]$ cd /u01/app/oracle/diag/rdbms/enmoedu/ENMOEDU/trace
     
     tail命令來開啟alert_ENMOEDU.log文
     [oracle@ENMOEDU trace]$ tail -100f alert_ENMOEDU.log 
     
     此時開啟另一視窗,執行如下命令
     SYS@ENMOEDU > alter database backup controlfile to trace;
     Database altered.
     
     我們可以在alert.ENMOEDU.log看到如下資訊
     Mon Mar 10 15:22:20 2014
      alter database backup controlfile to trace
      Backup controlfile written to trace file /u01/app/oracle/diag/rdbms/enmoedu/ENMOEDU/trace/ENMOEDU_ora_18205.trc
      Completed: alter database backup controlfile to trace
     
     根據上述資訊,我們去檢視提示的檔案
     [oracle@ENMOEDU ~]$ cat /u01/app/oracle/diag/rdbms/enmoedu/ENMOEDU/trace/ENMOEDU_ora_18205.trc
     
     在浩如煙海的資訊中,我們可以找到建立控制檔案的命令
     CREATE CONTROLFILE REUSE DATABASE "ENMOEDU" RESETLOGS  ARCHIVELOG
              MAXLOGFILES 16
              MAXLOGMEMBERS 3
              MAXDATAFILES 100
              MAXINSTANCES 8
              MAXLOGHISTORY 292
       LOGFILE
           GROUP 1 '/u01/app/oracle/oradata/ENMOEDU/redo01.log'  SIZE 50M BLOCKSIZE 512,
           GROUP 2 '/u01/app/oracle/oradata/ENMOEDU/redo02.log'  SIZE 50M BLOCKSIZE 512,
           GROUP 3 '/u01/app/oracle/oradata/ENMOEDU/redo03.log'  SIZE 50M BLOCKSIZE 512
       -- STANDBY LOGFILE
       DATAFILE
            '/u01/app/oracle/oradata/ENMOEDU/system01.dbf',
            '/u01/app/oracle/oradata/ENMOEDU/sysaux01.dbf',
            '/u01/app/oracle/oradata/ENMOEDU/undotbs01.dbf',
            '/u01/app/oracle/oradata/ENMOEDU/users01.dbf',
            '/u01/app/oracle/oradata/ENMOEDU/example01.dbf',
            '/u01/app/oracle/oradata/ENMOEDU/test01.dbf',
            '/u01/app/oracle/oradata/ENMOEDU/test02.dbf'
       CHARACTER SET AL32UTF8;
      
      稍後我們就可以用這些命令來建立控制檔案了。下面來模擬控制檔案丟失和損壞的實驗環境:
      [root@ENMOEDU ~]# rm -rf /u01/app/oracle/oradata/ENMOEDU/control01.ctl
      [root@ENMOEDU ~]# rm -rf /u01/app/oracle/fast_recovery_area/ENMOEDU/control02.ctl
      
      筆者將兩個控制檔案都刪除了,很徹底~然後嘗試啟動資料庫。
      [oracle@ENMOEDU ~]$ sqlplus / as sysdba
       SQL*Plus: Release 11.2.0.3.0 Production on Mon Mar 10 15:47:54 2014
       Copyright (c) 1982, 2011, Oracle.  All rights reserved.
       Connected to an idle instance.
       SYS@ENMOEDU > startup
       ORACLE instance started.
 
      Total System Global Area  422670336 bytes
       Fixed Size                  1345380 bytes
       Variable Size             352323740 bytes
       Database Buffers           62914560 bytes
       Redo Buffers                6086656 bytes
       ORA-00205: error in identifying control file, check alert log for more info
       
       可以看出,資料庫已經無法正常啟動了。那麼我們就將資料庫啟動到nomount狀態下進行恢復。
       SYS@ENMOEDU > shutdown abort
       ORACLE instance shut down.
       SYS@ENMOEDU > startup nomount
       ORACLE instance started.

      Total System Global Area  422670336 bytes
       Fixed Size                  1345380 bytes
       Variable Size             352323740 bytes
       Database Buffers           62914560 bytes
       Redo Buffers                6086656 bytes
      SYS@ENMOEDU > CREATE CONTROLFILE REUSE DATABASE "ENMOEDU" RESETLOGS  ARCHIVELOG
          2                MAXLOGFILES 16
          3                MAXLOGMEMBERS 3
          4                MAXDATAFILES 100
          5                MAXINSTANCES 8
          6                MAXLOGHISTORY 292
          7         LOGFILE
          8             GROUP 1 '/u01/app/oracle/oradata/ENMOEDU/redo01.log'  SIZE 50M BLOCKSIZE 512,
          9             GROUP 2 '/u01/app/oracle/oradata/ENMOEDU/redo02.log'  SIZE 50M BLOCKSIZE 512,
         10             GROUP 3 '/u01/app/oracle/oradata/ENMOEDU/redo03.log'  SIZE 50M BLOCKSIZE 512
         11         -- STANDBY LOGFILE
         12         DATAFILE
         13              '/u01/app/oracle/oradata/ENMOEDU/system01.dbf',
         14              '/u01/app/oracle/oradata/ENMOEDU/sysaux01.dbf',
         15              '/u01/app/oracle/oradata/ENMOEDU/undotbs01.dbf',
         16              '/u01/app/oracle/oradata/ENMOEDU/users01.dbf',
         17              '/u01/app/oracle/oradata/ENMOEDU/example01.dbf',
         18              '/u01/app/oracle/oradata/ENMOEDU/test01.dbf',
         19              '/u01/app/oracle/oradata/ENMOEDU/test02.dbf'
         20         CHARACTER SET AL32UTF8;

       Control file created.
       
      嘗試開啟資料庫
       SYS@ENMOEDU > alter database open
          2  ;
       alter database open
       *
       ERROR at line 1:
       ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
       
      提示錯誤。按照提示來開啟資料庫:
       SYS@ENMOEDU > alter database open resetlogs;

       Database altered.
       資料庫已經正常啟動了。
     
      上述情況屬於非常樂觀且極易恢復的模擬實驗現場,但是在實際情況中,環境卻險要惡劣的多。往往控制檔案丟失後,使用者還會進行大量的操作,比如建立表空間等等,這些使得控制檔案的恢復要困難許多。路漫漫其修遠兮,吾將上下而求索,Frank對待技術的渴望永無止境。下面我就給大家介紹一下如何在備份的控制檔案過久的情況下恢復控制檔案。
      首先,我們先備份一下我們的控制檔案。由於Frank採用了多路複用,所以看起來是不是應該把兩個控制檔案都備份一下呢?按照國際慣例,一般作者向讀者發出類似這種疑問句的時候,答案往往是否定的。但是,Frank作為一個走位忽上忽下意識飄忽不定的技術人員,所以,答案,仍然是不需要備份兩份。由於兩份控制檔案是一模一樣的,所以備份一份即可,只需記得在恢復的時候注意檔名字。
    
     備份控制檔案。在本文中,將控制檔案備份到Oracle的家目錄下,給控制檔案一種家的溫暖。
     [oracle@ENMOEDU ENMOEDU]$ cp control01.ctl ~

     建立表空間和檔案,從而使現在的控制檔案和備份檔案產生差異。
     SYS@ENMOEDU > create tablespace frank datafile '/u01/app/oracle/oradata/ENMOEDU/frank01.dbf' size 100m;

     Tablespace created.

      檢視一下當前線上日誌的status,並切換日誌,產生歸檔。
      SYS@ENMOEDU > select group#,status from v$log;


      GROUP# STATUS
      ---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 INACTIVE


      SYS@ENMOEDU > alter system archive log current;


      System altered.


      SYS@ENMOEDU > select group#,status from v$log;


      GROUP# STATUS
      ---------- ----------------
         1 ACTIVE
         2 CURRENT
         3 INACTIVE


      SYS@ENMOEDU > alter system archive log current;


      System altered.


      SYS@ENMOEDU > select group#,status from v$log;


      GROUP# STATUS
      ---------- ----------------
         1 ACTIVE
         2 ACTIVE
         3 CURRENT


      SYS@ENMOEDU > alter system archive log current;
 

      System altered.


      SYS@ENMOEDU > select group#,status from v$log;


      GROUP# STATUS
      ---------- ----------------
         1 CURRENT
         2 ACTIVE
         3 ACTIVE


      SYS@ENMOEDU > alter system archive log current;


      System altered.


      SYS@ENMOEDU > select group#,status from v$log;


      GROUP# STATUS
      ---------- ----------------
         1 ACTIVE
         2 CURRENT
         3 INACTIVE


       SYS@ENMOEDU > alter system archive log current;


       System altered.


       SYS@ENMOEDU > select group#,status from v$log;


       GROUP# STATUS
       ---------- ----------------
         1 INACTIVE
         2 ACTIVE
         3 CURRENT


        SYS@ENMOEDU > alter system archive log current;


        System altered.


        SYS@ENMOEDU > select group#,status from v$log;


        GROUP# STATUS
         ---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 ACTIVE


        SYS@ENMOEDU > alter system archive log current;


        System altered.


        SYS@ENMOEDU > select group#,status from v$log;


       GROUP# STATUS
       ---------- ----------------
         1 ACTIVE
         2 CURRENT
         3 INACTIVE


       SYS@ENMOEDU > alter system archive log current;


       System altered.


       SYS@ENMOEDU > select group#,status from v$log;


       GROUP# STATUS
       ---------- ----------------
         1 ACTIVE
         2 ACTIVE
         3 CURRENT
       切日誌的次數由於一不留神沒有控制住,所以產生的歸檔日誌的數量也很可觀,導致一會恢復控制檔案的時候造成了不小的困難。

      檢視現在日誌和資料檔案的狀態:
       SYS@ENMOEDU > select GROUP#,SEQUENCE#,ARCHIVED,FIRST_CHANGE#,NEXT_CHANGE# from v$log;


       GROUP#  SEQUENCE# ARC FIRST_CHANGE# NEXT_CHANGE#
       ---------- ---------- --- ------------- ------------
         1        112 YES       1382686      1382699
         2        113 YES       1382699      1382705
         3        114 NO        1382705   2.8147E+14


       SYS@ENMOEDU > select file#,checkpoint_change# from v$datafile;


       FILE# CHECKPOINT_CHANGE#
        ---------- ------------------
         1            1382686
         2            1382686
         3            1382686
         4            1382686
         5            1382686
         6            1382686
         7            1382686
         8            1382686

        8 rows selected.

       刪除控制檔案:
      rm -rf /u01/app/oracle/oradata/ENMOEDU/control01.dbf;
      rm -rf /u01/app/oracle/fast_recovery_area/ENMOEDU/ontrol02.dbf;

      關機,重啟,報錯,就以nomount的形式開啟資料庫:
      SYS@ENMOEDU > shutdown abort;
       ORACLE instance shut down.
       SYS@ENMOEDU > startup 
       ORACLE instance started.
    
      Total System Global Area  422670336 bytes
       Fixed Size                  1345380 bytes
       Variable Size             352323740 bytes
       Database Buffers           62914560 bytes
       Redo Buffers                6086656 bytes
       ORA-00205: error in identifying control file, check alert log for more info

      SYS@ENMOEDU > shutdown abort
       ORACLE instance shut down.
       SYS@ENMOEDU > startup nomount
       ORACLE instance started.

       Total System Global Area  422670336 bytes
       Fixed Size                  1345380 bytes
       Variable Size             352323740 bytes
       Database Buffers           62914560 bytes
       Redo Buffers                6086656 bytes

       恢復控制檔案:
      [oracle@ENMOEDU ~]$ cp control01.ctl /u01/app/oracle/oradata/ENMOEDU/control01.ctl
      [oracle@ENMOEDU ~]$ cp control01.ctl /u01/app/oracle/fast_recovery_area/ENMOEDU/control02.ctl
 
      將資料庫啟動到mount狀態:
      SYS@ENMOEDU > alter database mount;

      Database altered.

      檢視一下當前檔案的狀態:
      SYS@ENMOEDU > select file#,checkpoint_change# from v$datafile;

       FILE# CHECKPOINT_CHANGE#
       ---------- ------------------
         1            1371719
         2            1371719
         3            1371719
         4            1371719
         5            1371719
         6            1371719
         7            1371719
         8            1382338
      8 rows selected.
      SYS@ENMOEDU > select status from v$datafile;

       STATUS
       -------
       SYSTEM
       ONLINE
       ONLINE
       ONLINE
       ONLINE
       ONLINE
       ONLINE
       RECOVER

       8 rows selected.

      顯看出來datafile 8的scn號跟其他的不一樣,因為它是在備份控制檔案之後建立的。

       利用archivelog來恢復控制檔案:
      SYS@ENMOEDU > recover database using backup controlfile;
       ORA-00279: change 1382338 generated at 03/11/2014 20:23:02 needed for thread 1
       ORA-00289: suggestion :
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_106_9ky02vgf_.arc
       ORA-00280: change 1382338 for thread 1 is in sequence #106

      Specify log: {=suggested | filename | AUTO | CANCEL}
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_106_9ky02vgf_.arc
       ORA-00279: change 1382640 generated at 03/11/2014 20:23:55 needed for thread 1
       ORA-00289: suggestion :
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_107_9ky03860_.arc
       ORA-00280: change 1382640 for thread 1 is in sequence #107
       ORA-00278: log file
       '/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_106_9ky02vgf_.arc' no longer needed for this                  recovery

       Specify log: {=suggested | filename | AUTO | CANCEL}
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_107_9ky03860_.arc
       ORA-00279: change 1382655 generated at 03/11/2014 20:24:08 needed for thread 1
       ORA-00289: suggestion :
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_108_9ky03wyl_.arc
       ORA-00280: change 1382655 for thread 1 is in sequence #108
       ORA-00278: log file
       '/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_107_9ky03860_.arc' no longer needed for this  
      recovery

       Specify log: {=suggested | filename | AUTO | CANCEL}
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_108_9ky03wyl_.arc
       ORA-00279: change 1382666 generated at 03/11/2014 20:24:28 needed for thread 1
       ORA-00289: suggestion :
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_109_9ky045yl_.arc
       ORA-00280: change 1382666 for thread 1 is in sequence #109
       ORA-00278: log file
       '/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_108_9ky03wyl_.arc' no longer needed for this 
      recovery

       Specify log: {=suggested | filename | AUTO | CANCEL}
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_109_9ky045yl_.arc
       ORA-00279: change 1382673 generated at 03/11/2014 20:24:37 needed for thread 1
       ORA-00289: suggestion :
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_110_9ky04mo6_.arc
       ORA-00280: change 1382673 for thread 1 is in sequence #110
       ORA-00278: log file
       '/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_109_9ky045yl_.arc' no longer needed for this 
      recovery

      Specify log: {=suggested | filename | AUTO | CANCEL}
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_110_9ky04mo6_.arc
       ORA-00279: change 1382680 generated at 03/11/2014 20:24:51 needed for thread 1
       ORA-00289: suggestion :
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_111_9ky04xrr_.arc
       ORA-00280: change 1382680 for thread 1 is in sequence #111
       ORA-00278: log file
       '/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_110_9ky04mo6_.arc' no longer needed for this 
      recovery

      Specify log: {=suggested | filename | AUTO | CANCEL}
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_111_9ky04xrr_.arc
       ORA-00279: change 1382686 generated at 03/11/2014 20:25:01 needed for thread 1
       ORA-00289: suggestion :
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_112_9ky056n5_.arc
       ORA-00280: change 1382686 for thread 1 is in sequence #112
       ORA-00278: log file
       '/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_111_9ky04xrr_.arc' no longer needed for this 
      recovery

       Specify log: {=suggested | filename | AUTO | CANCEL}
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_112_9ky056n5_.arc
       ORA-00279: change 1382699 generated at 03/11/2014 20:25:10 needed for thread 1
       ORA-00289: suggestion :
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_113_9ky05g7p_.arc
       ORA-00280: change 1382699 for thread 1 is in sequence #113
       ORA-00278: log file
       '/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_112_9ky056n5_.arc' no longer needed for this 
      recovery

       Specify log: {=suggested | filename | AUTO | CANCEL}
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_113_9ky05g7p_.arc 
       ORA-00279: change 1382705 generated at 03/11/2014 20:25:18 needed for thread 1 
       ORA-00289: suggestion :
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_114_%u_.arc
       ORA-00280: change 1382705 for thread 1 is in sequence #114
       ORA-00278: log file
       '/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_113_9ky05g7p_.arc' no longer needed for this 
      recovery
       
       Specify log: {=suggested | filename | AUTO | CANCEL}
       /u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_114_%u_.arc
       ORA-00308: cannot open archived log
       '/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_114_%u_.arc'
       ORA-27037: unable to obtain file status
       Linux Error: 2: No such file or directory
       Additional information: 3
      至此,歸檔檔案已利用完畢。在開始階段頻繁切日誌所釀下的一個不大不小的問題浮出水面,從而使我的恢復工作增加了一定量的複雜度。現在應該要使用到redo log日誌了。因為提示說要用到的序列號為114,而在關機前所檢視的日誌狀態中,redo03.log的序列號為114,所以指定redo03.log來繼續恢復。
 
      指定日誌恢復:
      Specify log: {=suggested | filename | AUTO | CANCEL}
       /u01/app/oracle/oradata/ENMOEDU/redo03.log 
       Log applied.
       Media recovery complete.
   
       恢復成功,開啟資料庫:
      SYS@ENMOEDU > alter database open resetlogs;

       Database altered.

      檢視當前資料庫資料檔案狀態:
      SYS@ENMOEDU > select file#,checkpoint_change# from v$datafile;

       FILE# CHECKPOINT_CHANGE#
       ---------- ------------------
         1            1382865
         2            1382865
         3            1382865
         4            1382865
         5            1382865
         6            1382865
         7            1382865
         8            1382865

       8 rows selected.
      至此,資料庫控制檔案恢復成功。
     
       從上面可以看書,採用使用者管理備份與恢復的方式來恢復我們的控制檔案還是有一定的時間複雜度和空間複雜度的。那麼到底有沒有一個簡單點得方法來解決這個問題嗎?按照國際慣例,一般作者向讀者發出類似這種疑問句的時候,答案往往是肯定的。但是,Frank作為一個走位忽上忽下意識飄忽不定的技術人員,所以,答案,仍然是肯定的。那就是RMAN。

     (2)基於RMAN的備份和恢復
     終於到了RMAN這一部分了。其實用RMAN恢復控制檔案相對而言要簡單的多。有如此利器而放置不用,實乃暴殄天物。下面就為大家帶來用RMAN恢復控制檔案的過程。

     首先,用RMAN做一次全備份。
     SYS@ENMOEDU > alter database begin backup; 
      RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;      
     RMAN> backup database plus archivelog;
     備份的過程就不逐一顯示在這裡了。
      SYS@ENMOEDU > alter database end backup;
      至此,備份過程完成。      

     建立表空間和表檔案,刪除控制檔案
      SYS@ENMOEDU > create tablespace frank datafile '/u01/app/oracle/oradata/ENMOEDU/frank01' size 100m;

      Tablespace created.
     SYS@ENMOEDU > create table frank (x int,y int);

      Table created.
     SYS@ENMOEDU > insert into frank values(1,2);

      1 row created.
      
     SYS@ENMOEDU > insert into frank values(2,3);

      1 row created.

      SYS@ENMOEDU > select * from frank;


         X          Y
      ---------- ----------
         1          2
         2          3
     SYS@ENMOEDU > commit;

     [oracle@ENMOEDU ENMOEDU]$ rm -rf /u01/app/oracle/oradata/ENMOEDU/control01.dbf;
      [oracle@ENMOEDU ENMOEDU]$ rm -rf /u01/app/oracle/fast_recovery_area/ENMOEDU/ontrol02.dbf;     
     
     檢視一下DBID,一會RMAN恢復將要使用這個引數。
     SYS@ENMOEDU > select dbid from v$database;

      DBID
      ----------
      87396644

     關閉資料庫,以nomount的方式啟動資料庫。
     SYS@ENMOEDU > shutdown abort
      ORACLE instance shut down.
      SYS@ENMOEDU > startup nomount
      ORACLE instance started.
     
     恢復控制檔案
      RMAN> set dbid=87396644;
      executing command: SET DBID
      RMAN> restore controlfile from autobackup;
      restore自動提示的過程略去,為了節省空間和版面。
     RMAN> sql 'alter database mount';
      sql statement: alter database mount
      released channel: ORA_DISK_1
      RMAN> restore database;
      RMAN> recover database;
     RMAN> sql 'alter database open resetlogs';
      sql statement: alter database open resetlogs
      至此,恢復過程結束。

     檢驗一下恢復的效果如何。
      SYS@ENMOEDU > select * from frank;

         X          Y
      ----------------
         1          2
         2          3
      
     SYS@ENMOEDU > select name from v$datafile;

     NAME
      --------------------------------------------------------------
      /u01/app/oracle/oradata/ENMOEDU/system01.dbf
      /u01/app/oracle/oradata/ENMOEDU/sysaux01.dbf
      /u01/app/oracle/oradata/ENMOEDU/undotbs01.dbf
      /u01/app/oracle/oradata/ENMOEDU/users01.dbf
      /u01/app/oracle/oradata/ENMOEDU/example01.dbf
      /u01/app/oracle/oradata/ENMOEDU/test01.dbf
      /u01/app/oracle/oradata/ENMOEDU/test02.dbf
      /u01/app/oracle/oradata/ENMOEDU/frank01
     由上我們可以看出恢復成功。

      縱然用RMAN恢復控制檔案比較簡單粗暴,但是最好的防守就是進攻,與其坐以待斃等待控制檔案出錯被動恢復,倒不如採取主動出擊多路複用控制檔案。狡兔尚且知掘三窟,那麼引入多路複用技術也就自然而然了。下面介紹多路複用技術。
   
三、控制檔案的多路複用技術
    (1)多路複用技術的配置
     關於多路複用有兩種配置方式,一種是在資料庫nomount的方式下修改引數,另一種是直接修改引數檔案。
     將資料庫啟動到nomount,修改引數。
     SYS@ENMOEDU > startup nomount
      ORACLE instance started.

     Total System Global Area  292933632 bytes
      Fixed Size                  1344512 bytes
      Variable Size             222301184 bytes
      Database Buffers           62914560 bytes
      Redo Buffers                6373376 bytes
      SYS@ENMOEDU > alter system set  control_files=         
     '/u01/app/oracle/oradata/ENMOEDU/control01.ctl','/u01/app/oracle/oradata/control01.ctl' scope=spfile;

      System altered.
     
     將控制檔案複製到另一個需要放置控制檔案的路徑。
      [oracle@ENMOEDU dbs]$ cp /u01/app/oracle/oradata/ENMOEDU/control01.ctl /u01/app/oracle/oradata/control01.ctl
      
      重啟資料庫,檢視控制檔案狀態。
      SYS@ENMOEDU > shutdown immediate
      ORACLE instance shut down.
      SYS@ENMOEDU > startup
      ORACLE instance started.

      Total System Global Area  292933632 bytes
      Fixed Size                  1344512 bytes
      Variable Size             222301184 bytes
      Database Buffers           62914560 bytes
      Redo Buffers                6373376 bytes
      Database mounted.
      Database opened.
      SYS@ENMOEDU > select name from v$controlfile;

      NAME
      --------------------------------------------------
      /u01/app/oracle/oradata/ENMOEDU/control01.ctl
      /u01/app/oracle/oradata/control01.ctl
      控制檔案的多路複用成功。

     第二種方法是直接修改init.ora檔案。
     首先建立pfile。
     SYS@ENMOEDU > create pfile from spfile;

      File created.
   
     修改pfile。
     [oracle@ENMOEDU dbs]$ vi initENMOEDU.ora 
      將控制檔案那一項修改。
     *.control_files='/u01/app/oracle/oradata/ENMOEDU/control01.ctl','/u01/app/oracle/oradata/control01.ctl'
 
     建立spfile。
     SYS@ENMOEDU > create pfile from spfile;

      File created.

     啟動資料庫,檢視控制檔案狀態
     SYS@ENMOEDU > shutdown immediate
      ORACLE instance shut down.
      SYS@ENMOEDU > startup
      ORACLE instance started.

      Total System Global Area  292933632 bytes
      Fixed Size                  1344512 bytes
      Variable Size             222301184 bytes
      Database Buffers           62914560 bytes
      Redo Buffers                6373376 bytes
      Database mounted.
      Database opened.
      SYS@ENMOEDU > select name from v$controlfile;

      NAME
      --------------------------------------------------
      /u01/app/oracle/oradata/ENMOEDU/control01.ctl
      /u01/app/oracle/oradata/control01.ctl
     控制檔案的多路複用成功

     至此,控制檔案的多路複用已經實現了。下面我們將做一個實驗,來看看多路複用技術是怎麼保障控制檔案的正常使用的。

     正常啟動資料庫。刪除其中一份控制檔案。
     SYS@ENMOEDU > startup
      ORACLE instance started.

      Total System Global Area  292933632 bytes
      Fixed Size                  1344512 bytes
      Variable Size             222301184 bytes
      Database Buffers           62914560 bytes
      Redo Buffers                6373376 bytes
      Database mounted.
      Database opened.
 
     [oracle@ENMOEDU oradata]$ rm -rf /u01/app/oracle/oradata/control01.ctl

     正常關閉資料庫,發現不能關閉,用shutdown abort 的方式關閉。
     SYS@ENMOEDU > shutdown abort
      ORACLE instance shut down.

     以nomount的方式開啟資料庫。
     SYS@ENMOEDU > startup nomount
      ORACLE instance started.

      Total System Global Area  292933632 bytes
      Fixed Size                  1344512 bytes
      Variable Size             222301184 bytes
      Database Buffers           62914560 bytes
      Redo Buffers                6373376 bytes
     
      修改引數,將已刪除的控制檔案從引數中刪除。
     SYS@ENMOEDU > alter system set control_files= '/u01/app/oracle/oradata/ENMOEDU/control01.ctl' scope=spfile;

      System altered.

      關閉資料庫,重啟
     SYS@ENMOEDU > shutdown immediate
      ORACLE instance shut down.
      SYS@ENMOEDU > startup
      ORACLE instance started.

      Total System Global Area  292933632 bytes
      Fixed Size                  1344512 bytes
      Variable Size             222301184 bytes
      Database Buffers           62914560 bytes
      Redo Buffers                6373376 bytes
      Database mounted.
      Database opened.
      SYS@ENMOEDU > select name from v$controlfile;

      NAME
      --------------------------------------------------
      /u01/app/oracle/oradata/ENMOEDU/control01.ctl
      至此,資料庫已經成功啟動。

      綜上所述,本文總結了控制檔案的使用者管理備份和恢復、RMAN備份和恢復、多路複用的相關知識點。Frank才疏學淺,知識匱乏,只能盡綿薄之力總結自身所學,狂生之言,僅為笑談。

                                                                                                                                                                                              Frank
                                                                                                                                                                                          2014.3.12




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29762980/viewspace-1392912/,如需轉載,請註明出處,否則將追究法律責任。

相關文章