Oracle 11g重建控制檔案——控制檔案全部丟失,從零開始

kunlunzhiying發表於2017-01-26
      控制檔案(control file)是一個相當小的檔案(最多能增長到64M左右),其中包含Oracle需要的其他檔案的一個目錄。引數檔案告知例項控制檔案的位置,控制檔案則告知示例資料庫和線上重做日誌檔案的位置。控制檔案還告知了Oracle其他一些事情,如已發生檢查點的有關資訊、資料庫名(必須和db_name引數匹配)、建立資料庫的時間戳、歸檔重做日誌的歷史(有時這會讓控制檔案變大)、RMAN資訊等。
     控制檔案應該透過硬體(RAID)多路儲存,如果不支援映象,則要透過Oracle多路儲存。應該有不止一個副本,而且它們應該儲存在不同的磁碟上,以防止萬一出現磁碟故障而丟失控制檔案。丟失控制檔案並不是致命的,但是會使恢復變得困難很多。
     如果丟失了所有的控制檔案並且沒有任何的備份,我們可以透過重建控制檔案來開啟資料庫。其中,重建控制檔案至少需要以下資訊:
     1.資料庫名
     2.字符集
     3.資料檔名稱
    4.初始化引數,包括MAXLOGFILES、MAXLOGMEMBERS、MAXDATAFILES、MAXINSTANCES、MAXLOGHISTORY等;

1.環境準備

資料庫版本

我們在Oracle11g中進行測試。

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> select * from v$version;

  3. BANNER
  4. --------------------------------------------------------------------------------
  5. Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
  6. PL/SQL Release 11.2.0.3.0 - Production
  7. CORE 11.2.0.3.0 Production
  8. TNS for Linux: Version 11.2.0.3.0 - Production
  9. NLSRTL Version 11.2.0.3.0 - Production

  10. SQL>

刪除控制檔案

1.透過查詢control_files初始化引數,獲取控制檔案路徑;

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> show parameter control_files

  3. NAME TYPE VALUE
  4. ------------------------------------ ----------- ------------------------------
  5. control_files string                             /u01/app/oracle/oradata/HOEGH/
  6.                                                  control01.ctl, /u01/app/oracle
  7.                                                  /oradata/HOEGH/control02.ctl
  8. SQL>

2.然後,使用rm命令刪除控制檔案;

點選(此處)摺疊或開啟

  1. [oracle@HOEGH ~]$ rm /u01/app/oracle/oradata/HOEGH/control01.ctl
  2. [oracle@HOEGH ~]$ rm /u01/app/oracle/oradata/HOEGH/control02.ctl
  3. [oracle@HOEGH ~]$
3.此時,強制關閉資料庫,然後重啟資料庫,報ORA-00205錯誤。需要注意的是,此時執行shutdown immediate命令,資料庫無法正常關閉,只能關閉到mounted狀態;需要使用shutdown abort命令強制關閉資料庫。

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> shutdown immediate
  3. Database closed.
  4. ORA-00210: cannot open the specified control file
  5. ORA-00202: control file: \'/u01/app/oracle/oradata/HOEGH/control01.ctl\'
  6. ORA-27041: unable to open file
  7. Linux Error: 2: No such file or directory
  8. Additional information: 3


  9. SQL> select status from v$instance;

  10. STATUS
  11. ------------
  12. MOUNTED

  13. SQL>
  14. SQL> shutdown abort
  15. ORACLE instance shut down.
  16. SQL>



  17. SQL>
  18. SQL> startup
  19. ORACLE instance started.

  20. Total System Global Area 941600768 bytes
  21. Fixed Size 1348860 bytes
  22. Variable Size 515902212 bytes
  23. Database Buffers 419430400 bytes
  24. Redo Buffers 4919296 bytes
  25. ORA-00205: error in identifying control file, check alert log for more info


  26. SQL>

2.獲取資料庫名

首先生成文字格式的引數檔案;

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> create pfile from spfile;

  3. File created.

  4. SQL>
開啟引數檔案,檢視db_name引數值,即為資料庫名稱。

點選(此處)摺疊或開啟

  1. [oracle@hoegh dbs]$ cat initHOEGH.ora
  2. HOEGH.__db_cache_size=419430400
  3. HOEGH.__java_pool_size=4194304
  4. HOEGH.__large_pool_size=4194304
  5. HOEGH.__oracle_base=\'/u01/app/oracle\'#ORACLE_BASE set from environment
  6. HOEGH.__pga_aggregate_target=377487360
  7. HOEGH.__sga_target=566231040
  8. HOEGH.__shared_io_pool_size=0
  9. HOEGH.__shared_pool_size=130023424
  10. HOEGH.__streams_pool_size=0
  11. *.audit_file_dest=\'/u01/app/oracle/admin/HOEGH/adump\'
  12. *.audit_trail=\'db\'
  13. *.compatible=\'11.2.0.0.0\'
  14. *.control_files=\'/u01/app/oracle/oradata/HOEGH/control01.ctl\',\'/u01/app/oracle/oradata/HOEGH/control02.ctl\'
  15. *.db_block_size=8192
  16. *.db_domain=\'\'
  17. *.db_name=\'HOEGH\'
  18. *.diagnostic_dest=\'/u01/app/oracle\'
  19. *.dispatchers=\'(PROTOCOL=TCP) (SERVICE=HOEGHXDB)\'
  20. *.memory_max_target=943718400
  21. *.memory_target=943718400
  22. *.open_cursors=300
  23. *.processes=150
  24. *.remote_login_passwordfile=\'EXCLUSIVE\'
  25. *.undo_tablespace=\'UNDOTBS1\'
  26. [oracle@hoegh dbs]$

3.啟動到nomount狀態,獲取字符集

由於需要執行查詢語句select userenv('language') from dual;來獲取字符集,因此需要將資料庫啟動到nomount狀態。

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> startup nomount
  3. ORACLE instance started.

  4. Total System Global Area 941600768 bytes
  5. Fixed Size 1348860 bytes
  6. Variable Size 515902212 bytes
  7. Database Buffers 419430400 bytes
  8. Redo Buffers 4919296 bytes
  9. SQL>
  10. SQL> select userenv(\'language\') from dual;

  11. USERENV(\'LANGUAGE\')
  12. ----------------------------------------------------
  13. AMERICAN_AMERICA.US7ASCII

  14. SQL>
  15. SQL>

4.獲取資料檔名稱

透過ls命令獲取資料檔案列表。

點選(此處)摺疊或開啟

  1. [oracle@hoegh HOEGH]$ ls -lh
  2. total 1.8G
  3. -rw-r----- 1 oracle oinstall 314M May 30 11:07 example01.dbf
  4. -rw-r----- 1 oracle oinstall 51M May 30 11:07 redo01.log
  5. -rw-r----- 1 oracle oinstall 51M May 30 11:07 redo02.log
  6. -rw-r----- 1 oracle oinstall 51M May 30 11:07 redo03.log
  7. -rw-r----- 1 oracle oinstall 541M May 30 11:07 sysaux01.dbf
  8. -rw-r----- 1 oracle oinstall 721M May 30 11:07 system01.dbf
  9. -rw-r----- 1 oracle oinstall 30M Oct 13 2014 temp01.dbf
  10. -rw-r----- 1 oracle oinstall 96M May 30 11:07 undotbs01.dbf
  11. -rw-r----- 1 oracle oinstall 5.1M May 30 11:07 users01.dbf
  12. [oracle@hoegh HOEGH]$

5.生成建立控制檔案指令碼

這樣,建立控制檔案所需的基本資訊都已經有了,我們來生成建立控制檔案指令碼。

點選(此處)摺疊或開啟

  1. STARTUP NOMOUNT
  2. CREATE CONTROLFILE REUSE DATABASE \"HOEGH\" NORESETLOGS ARCHIVELOG
  3.     MAXLOGFILES 5
  4.     MAXLOGMEMBERS 3
  5.     MAXDATAFILES 100
  6.     MAXINSTANCES 1
  7.     MAXLOGHISTORY 226
  8. LOGFILE
  9.   GROUP 1 \'/u01/app/oracle/oradata/HOEGH/redo01.log\' SIZE 50M,
  10.   GROUP 2 \'/u01/app/oracle/oradata/HOEGH/redo02.log\' SIZE 50M,
  11.   GROUP 3 \'/u01/app/oracle/oradata/HOEGH/redo03.log\' SIZE 50M
  12. DATAFILE
  13.   \'/u01/app/oracle/oradata/HOEGH/system01.dbf\',
  14.   \'/u01/app/oracle/oradata/HOEGH/sysaux01.dbf\',
  15.   \'/u01/app/oracle/oradata/HOEGH/undotbs01.dbf\',
  16.   \'/u01/app/oracle/oradata/HOEGH/users01.dbf\',
  17.   \'/u01/app/oracle/oradata/HOEGH/example01.dbf\',
  18.   \'/u01/app/oracle/oradata/HOEGH/temp01.dbf\'
  19. CHARACTER SET US7ASCII
  20. ;

6.重建控制檔案

需要注意的是,在執行上述建立指令碼時會報錯,系統提示臨時檔案不屬於資料檔案,如下所示:

點選(此處)摺疊或開啟

  1. SQL> @/u01/app/oracle/oradata/HOEGH/CreateControlFile.sql
  2. ORA-01081: cannot start already-running ORACLE - shut it down first
  3. CREATE CONTROLFILE REUSE DATABASE \"HOEGH\" NORESETLOGS ARCHIVELOG
  4. *
  5. ERROR at line 1:
  6. ORA-01503: CREATE CONTROLFILE failed
  7. ORA-01160: file is not a data file
  8. ORA-01110: data file : \'/u01/app/oracle/oradata/HOEGH/temp01.dbf\'


  9. SQL>

修改指令碼並重新執行,重建控制檔案後,資料庫會開啟到mount狀態。

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> @/u01/app/oracle/oradata/HOEGH/CreateControlFile.sql
  3. ORACLE instance started.

  4. Total System Global Area 941600768 bytes
  5. Fixed Size 1348860 bytes
  6. Variable Size 515902212 bytes
  7. Database Buffers 419430400 bytes
  8. Redo Buffers 4919296 bytes

  9. Control file created.

  10. SQL>
  11. SQL> select status from v$instance;

  12. STATUS
  13. ------------
  14. MOUNTED

  15. SQL>

7.開啟資料庫

在開啟資料庫時,會報錯,提示system01資料檔案需要執行介質恢復,我們執行recover database即可。

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> alater database open;
  3. SP2-0734: unknown command beginning \"alater dat...\" - rest of line ignored.
  4. SQL>
  5. SQL> alter database open;
  6. alter database open
  7. *
  8. ERROR at line 1:
  9. ORA-01113: file 1 needs media recovery
  10. ORA-01110: data file 1: \'/u01/app/oracle/oradata/HOEGH/system01.dbf\'


  11. SQL>
  12. SQL> recover database;
  13. Media recovery complete.
  14. SQL>
  15. SQL> alter database open;

  16. Database altered.

  17. SQL>
  18. SQL> select * from v$version;

  19. BANNER
  20. --------------------------------------------------------------------------------
  21. Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
  22. PL/SQL Release 11.2.0.3.0 - Production
  23. CORE 11.2.0.3.0 Production
  24. TNS for Linux: Version 11.2.0.3.0 - Production
  25. NLSRTL Version 11.2.0.3.0 - Production

  26. SQL>
  27. SQL> select tablespace_name from dba_tablespaces;


    TABLESPACE_NAME
    ------------------------------
    SYSTEM
    SYSAUX
    UNDOTBS1
    TEMP
    USERS
    EXAMPLE


    6 rows selected.


    SQL> 


8.總結

下面總結一下重建控制檔案的步驟:
1.獲取資料庫名;
2.獲取字符集名;
3.獲取資料檔名;
4.重建控制檔案;
5.執行介質恢復;
6.開啟資料庫。

hoegh
15.05.30
-- The End --




      

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

相關文章