Oracle 11g重建控制文件——控制文件全部丟失


   控制文件(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.打開數據庫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM