一次控制檔案損壞的恢復

yangtingkun發表於2009-06-02

這次恢復完全是自找的,因為控制檔案就是我自己破壞的。

Oracle啟動後對控制檔案的依賴:http://yangtingkun.itpub.net/post/468/484896

 

 

在寫前面那篇文章的時候,做了一些測試,在啟動或關閉資料庫的情況下刪除了控制檔案,由於這個資料庫只是我自己使用的測試資料庫,當時也沒有在意去恢復。

今天想啟動這個資料庫的時候就碰到了問題:

[oracle@bjtest ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on 星期三 6 3 01:47:42 2009

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

已連線到空閒例程。

SQL> startup
ORACLE
例程已經啟動。

Total System Global Area 9432971568 bytes
Fixed Size                   756016 bytes
Variable Size             838860800 bytes
Database Buffers         8589934592 bytes
Redo Buffers                3420160 bytes
ORA-00214: ???? '/data/oradata/bjtest/control01.ctl' ?? 6178246 ???
'/data/oradata/bjtest/control02.ctl' ?? 6178204 ???

看到這個錯誤,馬上想到了前兩天做的那個測試。不過當時具體的測試細節已經記不清了,只是記得刪除過控制檔案。

這個錯誤顯然就是兩個控制檔案不一致,那麼只需要覆蓋錯誤的控制檔案就可以了。

SQL> host
[oracle@bjtest ~]$ cd /data/oradata/bjtest/
[oracle@bjtest bjtest]$ cp control01.ctl control02.ctl
[oracle@bjtest bjtest]$ exit
exit

SQL> alter database mount;
alter database mount
*
ERROR
位於第 1 :
ORA-00214: ???? '/data/oradata/bjtest/control01.ctl' ?? 6178246 ???
'/data/oradata/bjtest/control03.ctl' ?? 6178204 ???

覆蓋了控制檔案control02.ctl後,發現控制檔案1和控制檔案3也是不一致的,莫非出問題的控制檔案是control01.ctl。剛才是憑印象覺得control02.ctl有問題,這次不能再憑印象了,為了避免丟失真正的控制檔案,先對控制檔案進行備份:

SQL> exit
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
中斷開

[oracle@bjtest ~]$ cd /data/oradata/bjtest/
[oracle@bjtest bjtest]$ cp control03.ctl control03.bak
[oracle@bjtest bjtest]$ cp control01.ctl control01.bak
[oracle@bjtest bjtest]$ cp control03.ctl control01.ctl

再次嘗試載入控制檔案:

[oracle@bjtest ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on 星期三 6 3 01:49:45 2009

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


連線到:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production

SQL> alter database mount;
alter database mount
*
ERROR
位於第 1 :
ORA-00214: ???? '/data/oradata/bjtest/control02.ctl' ?? 6178246 ???
'/data/oradata/bjtest/control01.ctl' ?? 6178204 ???

仍然報錯,想想也是,由於控制檔案control02.ctl已經被控制檔案control01.ctl覆蓋過,因此剛才的複製並不徹底。

SQL> exit
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
中斷開

[oracle@bjtest ~]$ cd /data/oradata/bjtest/
[oracle@bjtest bjtest]$ cp control01.ctl control02.ctl
[oracle@bjtest bjtest]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on 星期三 6 3 01:50:32 2009

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


連線到:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production

SQL> alter database mount;

資料庫已更改。

SQL> alter database open;
alter database open
*
ERROR
位於第 1 :
ORA-01122: ????? 1 ????
ORA-01110: ???? 1: '/data/oradata/bjtest/system01.dbf'
ORA-01207: ????????? - ??????


SQL> shutdown immediate
ORA-01109: ??????


已經解除安裝資料庫。
ORACLE
例程已經關閉。

這次可以到MOUNT階段,說明3個控制檔案終於一致了,不過資料庫打不開。而且錯誤資訊是亂碼。

由於剛才的操作有點混亂,重複一次剛才的操作,利用控制檔案control03.bak作為控制檔案覆蓋當前的所有控制檔案,並嘗試開啟資料庫:

SQL> host
[oracle@bjtest bjtest]$ cd /data/oradata/bjtest
[oracle@bjtest bjtest]$ cp control03.bak control01.ctl
[oracle@bjtest bjtest]$ cp control03.bak control02.ctl
[oracle@bjtest bjtest]$ cp control03.bak control03.ctl
[oracle@bjtest bjtest]$ exit
exit

SQL> startup
ORACLE
例程已經啟動。

Total System Global Area 9432971568 bytes
Fixed Size                   756016 bytes
Variable Size             838860800 bytes
Database Buffers         8589934592 bytes
Redo Buffers                3420160 bytes
資料庫裝載完畢。
ORA-01122:
資料庫檔案 1 驗證失敗
ORA-01110:
資料檔案 1: '/data/oradata/bjtest/system01.dbf'
ORA-01207:
檔案比控制檔案更新 - 舊的控制檔案

錯誤依舊,不過這次顯示了中文的錯誤資訊。根據這個資訊不難判斷,control03.ctl這個控制檔案不是資料庫中最新的控制檔案,看來應該使用control01.ctl來作為資料庫的控制檔案,幸好在覆蓋之前做了備份。

SQL> shutdown immediate
ORA-01109:
資料庫未開啟


已經解除安裝資料庫。
ORACLE
例程已經關閉。
SQL> host
[oracle@bjtest ~]$ cd /data/oradata/bjtest/
[oracle@bjtest bjtest]$ cp control01.bak control01.ctl
[oracle@bjtest bjtest]$ cp control01.bak control02.ctl
[oracle@bjtest bjtest]$ cp control01.bak control03.ctl
[oracle@bjtest bjtest]$ exit
exit

SQL> startup
ORACLE
例程已經啟動。

Total System Global Area 9432971568 bytes
Fixed Size                   756016 bytes
Variable Size             838860800 bytes
Database Buffers         8589934592 bytes
Redo Buffers                3420160 bytes
資料庫裝載完畢。
資料庫已經開啟。

資料庫成功開啟。恢復過程本身沒有什麼技術含量,不過想說明幾個問題。

首先不要用正式環境進行測試,一旦出現問題後果會很嚴重,對於測試環境大不了重建,而對於正式環境,影響對外提供服務都是很嚴重的事情,更不要說資料庫損壞甚至是丟失資料了。

為了便於恢復,對資料庫進行結構修改應該記錄下來,對於這個例子,如果有詳細的修改記錄,就會知道到底那個控制檔案是最新的。

備份的重要性。這個例子中在覆蓋control01.ctl檔案前進行了備份,使得資料庫最終可以順利的開啟。當然,即使沒有控制檔案的備份,資料庫也可以透過重建控制檔案或RECOVER等方式開啟,但是畢竟要比恢復控制檔案的備份要麻煩。何況並不是所有的情況缺少備份都是可以恢復的,因此除了資料庫的常規備份外,在刪除、修改、覆蓋等操作進行之前,應該提前做好備份。

 

 

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

相關文章