一次控制檔案損壞的恢復
這次恢復完全是自找的,因為控制檔案就是我自己破壞的。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 損壞控制檔案的恢復方法
- 一次控制檔案損壞後的恢復經歷
- 單個控制檔案損壞的恢復
- 某個控制檔案損壞的恢復案例
- 恢復之單個控制檔案損壞
- 所有控制檔案損壞的恢復--resetlogs方式
- 所有控制檔案損壞的恢復--noresetlogs方式
- 一次日誌檔案損壞的恢復
- 備份與恢復--重建控制檔案後資料檔案損壞的恢復
- 備份&恢復之十三:損壞全部控制檔案
- 【RMAN】如果控制檔案損壞那麼如何恢復?恢復控制檔案的方式有哪幾種?
- 控制檔案損壞恢復(20100402)
- 備份&恢復之十二:損壞單個控制檔案
- SQL Server ldf 檔案損壞恢復SQLServer
- oracle控制檔案的損壞或完全丟失的恢復辦法Oracle
- 【BBED】 SYSTEM檔案頭損壞的恢復(4)
- 資料檔案丟失損壞的恢復--
- REDO檔案丟失或者損壞的恢復
- UNDO 表空間檔案損壞的恢復
- 線上日誌檔案損壞恢復方法
- u盤檔案損壞怎麼恢復資料 u盤恢復損壞資料的有效方法
- Oracle不同檔案丟失/損壞的恢復方法Oracle
- system表空間檔案損壞----完全恢復
- 【恢復】使用控制檔案的trace備份恢復因異常斷電導致所有控制檔案損壞的資料庫故障資料庫
- 【備份與恢復】恢復受損的複用控制檔案
- rman 恢復---歸檔丟失and資料檔案損壞
- 磁碟損壞造成RMAN備份檔案有壞塊的恢復案例
- 記一次Oracle RAC for aix 儲存雙控鎖盤導致ASM控制檔案損壞恢復OracleAIASM
- 某個資料檔案損壞完全恢復(三)
- 一個控制檔案損壞
- index損壞恢復Index
- 陣列櫃故障造成控制檔案損壞,資料檔案損壞陣列
- inactive狀態日誌組檔案損壞的恢復
- 磁碟損壞導致資料檔案丟失的恢復
- INDEX表空間檔案丟失或者損壞的恢復Index
- coreldraw檔案丟失(損壞)的恢復處理辦法
- Oracle資料檔案損壞恢復例項二則Oracle
- u盤檔案損壞怎麼恢復資料 u盤損壞無法讀取怎麼恢復資料