oracle控制檔案重建、複用 ORA-00205

YallonKing發表於2012-04-08

今天群裡有個哥們問我一個關於oracle控制檔案的錯誤,具體見下:
ORA-00205: error in identifying control file, check alert log for more info  遇見過沒?
細問得知,其在複用控制檔案時出現此錯誤。
故整理下控制檔案的複用方法。

以下是按照該網友描述恢復錯誤場景:
--檢視資料庫版本(一時半會沒找到什麼新的環境,就先湊合用10g了)
SQL> select * from v$version where rownum<5;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Linux: Version 10.2.0.1.0 - Production

--檢視引數檔案
SQL> show parameter spfile;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/product/10.2.0
                                                 /db_1/dbs/spfilenode1.ora

--擦看控制檔案引數
SQL> show parameter control

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time        integer     7
control_files                        string      /u01/app/oracle/oradata/node1/
                                                 control01.ctl, /u01/app/oracle
                                                 /oradata/node1/control02.ctl,
                                                 /u01/app/oracle/oradata/node1/
                                                 control03.ctl

--建立靜態引數檔案(以備後用)
SQL> create pfile from spfile;

File created.

SQL> shutdown immediate;--注意,此處可是一致性關閉庫的喲。若不是,那就麻煩大了,搞不好就需要用隱含引數將資料庫不一致開啟,將資料匯出來,再重建新庫,再導資料進去。
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !
[oracle@xlong01 ~]$ cp /u01/app/oracle/oradata/node1/control01.ctl /u01/app/oracle/controlfile04.ctl
[oracle@xlong01 ~]$ exit
exit

--啟動資料庫就發生該網友反映的錯誤
SQL> startup
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size             100664912 bytes
Database Buffers          180355072 bytes
Redo Buffers                2973696 bytes
ORA-00205: error in identifying control file, check alert log for more info

進一步檢視日誌檔案:
[oracle@xlong01 bdump]$ tail alert_node1.log
starting up 1 shared server(s) ...
Sun Apr  8 22:14:39 2012
ALTER DATABASE   MOUNT
Sun Apr  8 22:14:42 2012
ORA-00202: control file: '/u01/app/oracle/oradata/node1/control01.ctl, /u01/app/oracle/oradata/node1/control02.ctl,/u01/app/oracle/oradata/node1/control03.ctl,/u01/app/oracle/controlfile04.ctl'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Sun Apr  8 22:14:42 2012
ORA-205 signalled during: ALTER DATABASE   MOUNT...

問題就在於當把控制檔案複用後,在關閉資料庫時,需要把相關資訊寫回至控制檔案。而此時控制檔案發生了變化,獲取不到控制檔案(此處指的是新建的那個controlfile04.ctl)的狀態,而控制檔案不同於聯機日誌檔案,其是且的關係,而非或的關係。此刻便已經損壞了控制檔案。

下面就開始復原資料庫並進行正確的控制檔案複用。

當然,首先嚐試把控制檔案修改回以前的個數:

SQL> shutdown abort
ORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size             100664912 bytes
Database Buffers          180355072 bytes
Redo Buffers                2973696 bytes
SQL> alter system set control_files='/u01/app/oracle/oradata/node1/control01.ctl, /u01/app/oracle/oradata/node1/control02.ctl,/u01/app/oracle/oradata/node1/control03.ctl' scope=spfile;

System altered.

SQL> shutdown immediate;
ORA-01507: database not mounted


ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size             100664912 bytes
Database Buffers          180355072 bytes
Redo Buffers                2973696 bytes
ORA-00205: error in identifying control file, check alert log for more info

[oracle@xlong01 bdump]$ tail alert_node1.log
starting up 1 shared server(s) ...
Sun Apr  8 22:21:55 2012
ALTER DATABASE   MOUNT
Sun Apr  8 22:21:57 2012
ORA-00202: control file: '/u01/app/oracle/oradata/node1/control01.ctl, /u01/app/oracle/oradata/node1/control02.ctl,/u01/app/oracle/oradata/node1/control03.ctl'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Sun Apr  8 22:21:57 2012
ORA-205 signalled during: ALTER DATABASE   MOUNT...

此時顯然是行不通的,因為控制檔案已經出現了問題了。

那怎麼恢復呢,其實辦法有以下:
1、可以從備份恢復控制檔案。
2、可以從控制檔案的trace檔案重建控制檔案。
3、就是讀所有的alert.log檔案進行人工建立,當然這個alert.log需要從建庫開始以來的所有日誌檔案。

由於我的這個是測試環境,也沒有什麼備份檔案,所以只能悲劇的進行第三種方案了。狂汗~以後不管怎麼樣,也要備控制檔案和引數檔案!


SQL> startup nomount;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size             100664912 bytes
Database Buffers          180355072 bytes
Redo Buffers                2973696 bytes

--把以前舊的控制檔案挪個地
[oracle@xlong01 node1]$ mv control0* ..

--檢視alert.log檔案手工重建控制檔案,如果此時你的庫執行了很久的話,那就慘了。還好,我的庫基本變化不大,咔咔~~算是幸運的吧..


--此處重建控制檔案,是因為前邊是一致性關閉庫的,資料檔案都一致,只是控制檔案出了問題而已。
SQL> CREATE CONTROLFILE set DATABASE "node1" RESETLOGS  NOARCHIVELOG
  2  LOGFILE
  3  GROUP 1 ('/u01/app/oracle/oradata/node1/redo01.log')  SIZE 50M,
  4  GROUP 2 ('/u01/app/oracle/oradata/node1/redo02.log')  SIZE 50M,
  5  GROUP 3 ('/u01/app/oracle/oradata/node1/redo03.log')  SIZE 50M,
  6  DATAFILE
  7  '/u01/app/oracle/oradata/node1/users01.dbf',
  8  '/u01/app/oracle/oradata/node1/sysaux01.dbf',
  9  '/u01/app/oracle/oradata/node1/undotbs01.dbf',
10  '/u01/app/oracle/oradata/node1/system01.dbf',
11  '/u01/app/oracle/oradata/node1/example01.dbf'
12  ;

Control file created.

--此時就不寫那麼多日誌檔案鳥,也說明了日誌檔案是或的關係,而控制檔案是且的關係了。
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


SQL> alter database open resetlogs;

Database altered.

對於以resetlogs開啟的資料庫建議立即進行備份,雖然10g以後的可以不用及時備份,不過還是建議立即進行備份。貌似10g以後可以繞過resetlogs後進行重新恢復,我記得我好像這樣恢復過,具體忘了..嘻嘻~改天再測下..
此刻也需要建立臨時資料檔案。

由於是測試環境,以上暫且放一邊了。
此刻趕緊備份下控制檔案再說,以免重蹈覆轍。

--備trace檔案
SQL> alter database backup controlfile to trace as '/u01/app/oracle/controlfile_bak.trc';

Database altered.

--備二進位制檔案
SQL> alter database backup controlfile to  '/u01/app/oracle/controlfile_bak.ctl';

Database altered.

ok了,下面來進行正確的控制檔案複用

SQL> show parameter control

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time        integer     7
control_files                        string      /u01/app/oracle/oradata/node1/
                                                 control01.ctl, /u01/app/oracle
                                                 /oradata/node1/control02.ctl,
                                                 /u01/app/oracle/oradata/node1/
                                                 control03.ctl
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/product/10.2.0
                                                 /db_1/dbs/spfilenode1.ora

--建立pfile檔案
SQL> create pfile='/u01/app/oracle/pfile_20120408' from memory;
create pfile='/u01/app/oracle/pfile_20120408' from memory
                                                   *
ERROR at line 1:
ORA-00922: missing or invalid option
--由於不是11g所以以上命令會出錯

SQL> create pfile='/u01/app/oracle/pfile_20120408' from spfile;

File created.

--拷貝控制檔案的副本到新地
[oracle@xlong01 node1]$ cp control01.ctl ../control04.ctl

--修改pfile檔案準備複用控制檔案
[oracle@xlong01 node1]$ vi /u01/app/oracle/pfile_20120408

--修改後如下:
*.control_files='/u01/app/oracle/oradata/node1/control01.ctl','/u01/app/oracle/oradata/node1/control02.ctl','/u01/app/oracle/oradata/node1/control03.ctl','/u01/app/oracle/oradata/control04.ctl'

--以pfile啟動資料庫
SQL> startup pfile=/u01/app/oracle/pfile_20120408;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size             104859216 bytes
Database Buffers          176160768 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string

--建立spfile
SQL> create spfile from pfile;

File created.

--重啟資料庫即可
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218992 bytes
Variable Size             100664912 bytes
Database Buffers          180355072 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.

後來想了想還是補上臨時檔案吧,咔咔~

--的確沒有臨時檔案
SQL> select CREATION_TIME,STATUS,NAME from v$tempfile;

no rows selected

--檢視臨時表空間名
SQL> select NAME from v$tablespace;

NAME
------------------------------
USERS
SYSAUX
UNDOTBS1
SYSTEM
EXAMPLE
TEMP

6 rows selected.

--增加臨時檔案
SQL> alter tablespace temp add tempfile '/u01/app/oracle/oradata/node1/temp01.dbf' size 5m reuse;

Tablespace altered.

SQL> select CREATION_TIME,STATUS,NAME,CREATION_TIME from v$tempfile;

CREATION_ STATUS
--------- -------
NAME
--------------------------------------------------------------------------------
CREATION_
---------
08-APR-12 ONLINE
/u01/app/oracle/oradata/node1/temp01.dbf
08-APR-12

至此,已經ok了..咔咔~~碎覺去鳥,希望能幫到那位網友解決他的問題。

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

相關文章