資料庫恢復原理探討

imlihj2007發表於2009-04-26

資料庫恢復原理的簡單學習

資料庫恢復太有意思,理解了原理,很多東西都變得容易多了,火候快到了

搞清楚資料庫怎樣用日誌來做資料庫恢復(這樣才不會濫用命令,導致資料庫根本沒有辦法恢復)

--資料庫冷自動備份指令碼

select 'host copy ' || name || ' ' || name || '.bak;' backcmd

from (select name name

from v$datafile

union

select member name

from v$logfile

union

select name name from v$controlfile);

--資料庫冷備份恢復指令碼

select 'host copy ' || name || '.bak ' || name || ';' revrcmd

from (select name name

from v$datafile

union

select member name

from v$logfile

union

select name name from v$controlfile);

下面是恢復的時候遇到的問題,在恢復前我已經清空日誌資訊(alter database clear logfile group n;)

那為什麼我在啟動的時候還要用控制檔案恢復呢並且基於取消恢復!

SQL> startup

ORACLE 例程已經啟動。

Total System Global Area 281018368 bytes

Fixed Size 1248552 bytes

Variable Size 142607064 bytes

Database Buffers 134217728 bytes

Redo Buffers 2945024 bytes

資料庫裝載完畢。

ORA-00338: 日誌 1 (用於執行緒 1) 比控制檔案更新

ORA-00312: 聯機日誌 1 執行緒 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLREDO01.LOG'

SQL> alter database open resetlogs;

alter database open resetlogs

*

第 1 行出現錯誤:

ORA-01139: RESETLOGS 選項僅在不完全資料庫恢復後有效

不可以直接啟動要先做恢復

SQL> recover database using backup controlfile until cancel;

ORA-00279: 更改 583012 (在 04/25/2009 23:52:50 生成) 對於執行緒 1 是必需的

ORA-00289: 建議: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20

09_04_26O1_MF_1_1_%U_.ARC

ORA-00280: 更改 583012 (用於執行緒 1) 在序列 #1 中

指定日誌: {=suggested | filename | AUTO | CANCEL}

cancel

介質恢復已取消。

SQL> alter database open resetlogs;

資料庫已更改。

SQL>

用控制檔案的基於取消的恢復並沒有恢復資料

SQL> startup

ORACLE 例程已經啟動。

Total System Global Area 281018368 bytes

Fixed Size 1248552 bytes

Variable Size 150995672 bytes

Database Buffers 125829120 bytes

Redo Buffers 2945024 bytes

資料庫裝載完畢。

ORA-00338: 日誌 2 (用於執行緒 1) 比控制檔案更新

ORA-00312: 聯機日誌 2 執行緒 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLREDO02.LOG'

SQL> recover database using backup controlfile

ORA-00279: 更改 583578 (在 04/26/2009 00:09:38 生成) 對於執行緒 1 是必需的

ORA-00289: 建議: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20

09_04_26O1_MF_1_2_%U_.ARC

ORA-00280: 更改 583578 (用於執行緒 1) 在序列 #2 中

指定日誌: {=suggested | filename | AUTO | CANCEL}

D:ORACLEPRODUCT10.2.0ORADATAORCLREDO03.LOG

ORA-00310: 歸檔日誌包含序列 3; 要求序列 2

ORA-00334: 歸檔日誌: 'D:ORACLEPRODUCT10.2.0ORADATAORCLREDO03.LOG'

SQL> recover database using backup controlfile

ORA-00279: 更改 583578 (在 04/26/2009 00:09:38 生成) 對於執行緒 1 是必需的

ORA-00289: 建議: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20

09_04_26O1_MF_1_2_%U_.ARC

ORA-00280: 更改 583578 (用於執行緒 1) 在序列 #2 中

指定日誌: {=suggested | filename | AUTO | CANCEL}

D:ORACLEPRODUCT10.2.0ORADATAORCLREDO02.LOG

ORA-00279: 更改 583820 (在 04/26/2009 00:14:30 生成) 對於執行緒 1 是必需的

ORA-00289: 建議: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20

09_04_26O1_MF_1_3_%U_.ARC

ORA-00280: 更改 583820 (用於執行緒 1) 在序列 #3 中

ORA-00278: 此恢復不再需要日誌檔案 'D:ORACLEPRODUCT10.2.0ORADATAORCLREDO02.

LOG'

指定日誌: {=suggested | filename | AUTO | CANCEL}

D:ORACLEPRODUCT10.2.0ORADATAORCLREDO03.LOG

已應用的日誌。

完成介質恢復。

SQL> alter database open noresetlogs;

alter database open noresetlogs

*

第 1 行出現錯誤:

ORA-01588: 要開啟資料庫則必須使用 RESETLOGS 選項

SQL> alter database open resetlogs;

資料庫已更改。

SQL>

上邊總共講兩種恢復辦法:一藉助與日誌檔案恢復資料

要基於備份控制檔案來恢復資料(時間點或者其他資訊)

二不借助日誌檔案恢復資料

清空日誌或者基於 恢復資料

上邊的資料雖然恢復成功,但是在資料查詢的時候,有ora01578的錯誤(應該怎麼解決)

在恢復需要日誌檔案的時候要根據提示或者從最舊的開始恢復,直到恢復成功!

問題與總結:

==========================================

--問題?日誌裡有新的東西!恢復的時候可以恢復不!?

可以透過線上日誌恢復,但是 ora-01578資料庫塊有問題的錯誤,資料恢復的時候出現邏輯錯誤

這個問題的答案是:資料庫操作沒有記錄日誌,所以資料無法恢復,資料庫操作要注意沒有日誌的操作,

一定要發生在全備前!

--日誌? 當用resetlogs開啟資料庫的時候,日誌裡的資訊也會被更新,在沒有開啟資料庫前,資訊應該沒變化

所以用resetlogs開啟資料庫後要做資料庫的全備份,這個也是很多資料上怎樣強調的(嘿嘿)

以上的分析都是要使用全冷備份來恢復資料

下面是一步一步缺少檔案來做資料的恢復操作!

SQL> startup

ORACLE 例程已經啟動。

Total System Global Area 281018368 bytes

Fixed Size 1248552 bytes

Variable Size 180355800 bytes

Database Buffers 96468992 bytes

Redo Buffers 2945024 bytes

資料庫裝載完畢。

ORA-01122: 資料庫檔案 2 驗證失敗

ORA-01110: 資料檔案 2: 'D:ORACLEPRODUCT10.2.0ORADATAORCLUNDOTBS01.DBF'

ORA-01207: 檔案比控制檔案更新 - 舊的控制檔案

SQL> recover database using backup controlfile ;

ORA-00279: 更改 587150 (在 04/26/2009 01:30:41 生成) 對於執行緒 1 是必需的

ORA-00289: 建議: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20

09_04_26O1_MF_1_1_%U_.ARC

ORA-00280: 更改 587150 (用於執行緒 1) 在序列 #1 中

指定日誌: {=suggested | filename | AUTO | CANCEL}

cancel

介質恢復已取消。

SQL> alter database open resetlogs;

alter database open resetlogs

*

第 1 行出現錯誤:

ORA-01113: 檔案 1 需要介質恢復

ORA-01110: 資料檔案 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF'

SQL> recover database using backup controlfile ;

ORA-00279: 更改 587150 (在 04/26/2009 01:30:41 生成) 對於執行緒 1 是必需的

ORA-00289: 建議: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20

09_04_26O1_MF_1_1_%U_.ARC

ORA-00280: 更改 587150 (用於執行緒 1) 在序列 #1 中

指定日誌: {=suggested | filename | AUTO | CANCEL}

cancel

介質恢復已取消。

SQL> recover database using backup controlfile ;

ORA-00279: 更改 587150 (在 04/26/2009 01:30:41 生成) 對於執行緒 1 是必需的

ORA-00289: 建議: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20

09_04_26O1_MF_1_1_%U_.ARC

ORA-00280: 更改 587150 (用於執行緒 1) 在序列 #1 中

指定日誌: {=suggested | filename | AUTO | CANCEL}

cancel

介質恢復已取消。

SQL> alter database open resetlogs;

alter database open resetlogs

*

第 1 行出現錯誤:

ORA-01113: 檔案 1 需要介質恢復

ORA-01110: 資料檔案 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF'

SQL>

問題的原因:資料庫沒有足夠的日誌用來做資料恢復!

恢復的流程:1,檢查資料檔案和控制檔案的scn時候一樣,如果控制檔案的比較高,那麼資料檔案要恢復,反 之,要用基於備份的

控制檔案恢復!

2,如果有日誌的時候可以恢復,沒有日誌的時候需要前滾資料庫

特殊關於日誌的資料庫恢復!

1,損壞的是非當前聯機日誌

alter database clear logfile group n;

alter database clear unarchived log group n;

alter database open;

利用重新建立日誌的辦法可以恢復資料庫!

2,損壞當前有活動的聯機日誌

SQL> alter database open;

alter database open

*

第 1 行出現錯誤:

ORA-00313: 無法開啟日誌組 1 (用於執行緒 1) 的成員

ORA-00312: 聯機日誌 1 執行緒 1:

'D:ORACLEPRODUCT10.2.0ORADATAORCLREDO01.LOG'

ORA-27046: 檔案大小不是邏輯塊大小的倍數

OSD-04012: 檔案大小不匹配 (OS 50630038)

線上活動日誌損壞

SQL> alter database clear unarchived logfile group 1;

alter database clear unarchived logfile group 1

*

第 1 行出現錯誤:

ORA-01624: 日誌 1 是緊急恢復例項 orcl (執行緒 1) 所必需的

ORA-00312: 聯機日誌 1 執行緒 1:

'D:ORACLEPRODUCT10.2.0ORADATAORCLREDO01.LOG'

不允許重新建立日誌檔案

SQL> create pfile='d:lihj.ora' from spfile;

檔案已建立。

建立引數檔案

[@more@]

SQL> shutdown immediate

ORA-01109: 資料庫未開啟

已經解除安裝資料庫。

ORACLE 例程已經關閉。

SQL> startup mount pfile='d:lihj.ora'

ORACLE 例程已經啟動。

Total System Global Area 205520896 bytes

Fixed Size 1248116 bytes

Variable Size 71304332 bytes

Database Buffers 130023424 bytes

Redo Buffers 2945024 bytes

資料庫裝載完畢。

SQL> recover database until cancel;

ORA-00279: 更改 573358 (在 04/26/2009 09:02:32 生成) 對於執行緒 1 是必需的

ORA-00289: 建議:

D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2009_04_26O1_MF_1_

2_%U_.ARC

ORA-00280: 更改 573358 (用於執行緒 1) 在序列 #2 中

指定日誌: {=suggested | filename | AUTO | CANCEL}

cancel

ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 將出現如下錯誤

ORA-01194: 檔案 1 需要更多的恢復來保持一致性

ORA-01110: 資料檔案 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF'

ORA-01112: 未啟動介質恢復

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

相關文章