[小e筆記]之一步一步學習備份恢復——第三篇 數據庫恢復案例(Part 8)

 

小e隨筆:最近這一個禮拜,大四的課程快結束了,課程排的滿,期末考試複習,進入11月中旬就進入自由實習期了,可是小e我的實習工作還沒有找好,弄的我焦頭爛額的,希望哪個伯樂趕緊收下我吧!!!我喜歡數據庫。。。

案例4:丟失聯機重做日誌文件的恢復

1  丟失非當前的聯機重做日誌文件

(1)   重做日誌文件定位

SQL> select group#,sequence#,members,archived,status from v$log;

    GROUP#  SEQUENCE#    MEMBERS ARC STATUS

---------- ---------- ---------- --- ----------------

         1          7          1 YES INACTIVE

         2          8          1 YES INACTIVE

         3          9          1 NO  CURRENT      --這個是當前重做日誌文件

這個視圖中status列的知識充電:

a.     UNUSED:表示從未用過。一般剛剛創建或OPEN RESETLOGS打開後,聯機重做日誌組爲這一狀態。

b.     CURRENT:表示當前的。

c.     ACTIVE:表示活動的。雖然不是當前狀態,但也有可能正被使用或要被使用,比如CRASH RECOVERY時可能存在這種狀態的聯機重做組。

d.     CLEARING:日誌正在清空,當執行ALTER DATABASE CLEAR LOGFILE語句時該日誌組會變爲這種狀態,語句執行完後,操作的日誌組狀態變爲UNUSED。

e.     CLEARING_CURRENT:日誌正在清空。但是由於清空時出錯如I/O設備無法訪問,導致清空工作不能順序完成,則該日誌組就被置於這種狀態。

f.      INACTIVE:不活動狀態。表示該組日誌中的內容已經被歸檔或順利寫入數據文件,該組日誌可被繼續重用。

SQL> col member format a50;

SQL> select group#,member from v$logfile;

    GROUP# MEMBER

---------- --------------------------------------------------

         1 /u01/oracle/oradata/elvis/redo01.log

         3 /u01/oracle/oradata/elvis/redo03.log

         2 /u01/oracle/oradata/elvis/redo02.log

經過這兩個視圖的定位,我們打算模擬損壞的日誌就已經被我們選出來啦!那就是。。。2號文件,還有經過v$logfile視圖你可以看到,我沒一組重做日誌文件裏只有一個文件,這是相當不安全的。建議對聯機重做日誌文件進行冗餘的機制來確保聯機重做日誌文件的安全,即每組聯機重做日誌創建多個文件(至少兩個),每個文件的路徑都可以各自獨立(Oracle建議將每一組中的各個文件存放在不同的磁盤上)。

(2)   模擬文件丟失

[oracle@elvis elvis]$ ll

total 2080944

drwxr-xr-x 2 oracle oinstall      4096 Oct 13 19:49 bak

-rw-r----- 1 oracle oinstall  10076160 Oct 20 11:32 control01.ctl

-rw-r----- 1 oracle oinstall  52429312 Oct 20 10:12 redo01.log

-rw-r----- 1 oracle oinstall 52429312 Oct 20 10:12 redo02.log

-rw-r----- 1 oracle oinstall  52429312 Oct 20 11:30 redo03.log

-rw-r----- 1 oracle oinstall 629153792 Oct 20 11:27 sysaux01.dbf

-rw-r----- 1 oracle oinstall 734011392 Oct 20 11:28 system01.dbf

-rw-r----- 1 oracle oinstall  71311360 Oct 20 11:12 temp01.dbf

-rw-r----- 1 oracle oinstall  52436992 Oct 20 10:12 test01.dbf

-rw-r----- 1 oracle oinstall 524296192 Oct 20 11:27 undotbs02.dbf

-rw-r----- 1 oracle oinstall   5251072 Oct 20 10:12 users01.dbf

[oracle@elvis elvis]$ pwd

/u01/oracle/oradata/elvis

[oracle@elvis elvis]$ mv redo02.log redo02.log.bak

溫馨提示:操作系統Win下不可以在線刪除,而Linux下可以在線刪除

SQL> startup

ORACLE instance started.

Total System Global Area  598437888 bytes

Fixed Size                  1338140 bytes

Variable Size             398460132 bytes

Database Buffers          192937984 bytes

Redo Buffers                5701632 bytes

Database mounted.

ORA-03113: end-of-file on communication channel

Process ID: 9950

Session ID: 1 Serial number: 5

錯誤比較奇怪。。。先看下告警日誌的提示

查看了下告警日誌文件:

ALTER DATABASE OPEN

Beginning crash recovery of 1 threads

Started redo scan

Completed redo scan

 read 3 KB redo, 9 data blocks need recovery

Started redo application at

 Thread 1: logseq 9, block 54675

Recovery of Online Redo Log: Thread 1 Group 3 Seq 9 Reading mem 0

  Mem# 0: /u01/oracle/oradata/elvis/redo03.log

Completed redo application of 0.00MB

Completed crash recovery at

 Thread 1: logseq 9, block 54682, scn 967166

 9 data blocks read, 9 data blocks written, 3 redo k-bytes read

LGWR: STARTING ARCH PROCESSES

Sat Oct 20 11:35:38 2012

ARC0 started with pid=20, OS id=9383

ARC0: Archival started

LGWR: STARTING ARCH PROCESSES COMPLETE

ARC0: STARTING ARCH PROCESSES

Sat Oct 20 11:35:39 2012

ARC1 started with pid=21, OS id=9387

Sat Oct 20 11:35:40 2012

ARC2 started with pid=22, OS id=9391

Errors in file /u01/oracle/diag/rdbms/elvis/elvis/trace/elvis_lgwr_9292.trc:

ORA-00313: open failed for members of log group 2 of thread 1

ORA-00312: online log 2 thread 1: '/u01/oracle/oradata/elvis/redo02.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

Errors in file /u01/oracle/diag/rdbms/elvis/elvis/trace/elvis_lgwr_9292.trc:

ORA-00313: open failed for members of log group 2 of thread 1

ORA-00312: online log 2 thread 1: '/u01/oracle/oradata/elvis/redo02.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

Errors in file /u01/oracle/diag/rdbms/elvis/elvis/trace/elvis_ora_9379.trc:

ORA-00313: open failed for members of log group 1 of thread

ORA-00312: online log 2 thread 1: '/u01/oracle/oradata/elvis/redo02.log'

USER (ospid: 9379): terminating the instance due to error 313

Sat Oct 20 11:35:40 2012

ARC3 started with pid=23, OS id=9395

Instance terminated by USER, pid = 9379

可以看出丟失日誌組2文件的錯誤提示,與我們想要的結果一致,但是小e10g實驗的時候應該在開啓時直接報了這個丟失文件的錯誤,但現在在11g卻不是這樣,這個地方也疑惑了下,看恢復。。。

(3)恢復重做日誌文件

SQL> exit

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

[oracle@elvis ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Sat Oct 20 13:37:54 2012

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup mount

ORACLE instance started.

Total System Global Area  598437888 bytes

Fixed Size                  1338140 bytes

Variable Size             398460132 bytes

Database Buffers          192937984 bytes

Redo Buffers                5701632 bytes

Database mounted.

SQL> alter database clear logfile group 2;

 

Database altered.

SQL> select group#,sequence#,members,archived,status from v$log;

 

    GROUP#  SEQUENCE#    MEMBERS ARC STATUS

---------- ---------- ---------- --- ----------------

         1          7          1 YES INACTIVE

         3          9          1 NO  CURRENT

         2          0          1 YES UNUSED

SQL> alter database open;

Database altered.

數據庫正常開啓了。

總結:恢復方法和傳統恢復方法一樣,但錯誤的提示方式,卻與我在10g上的不同,我記得10g應該是提示
ORA-00313: open failed for members of log group 1 of thread 

ORA-00312: online log 2 thread 1: '/u01/oracle/oradata/elvis/redo02.log'
而這次實驗的環境11g,卻提示的這個錯誤,總之恢復了能開啓就行啦,哈哈,如果哪位高手對剛剛那個地方有什麼更好的見解,給小e留言哈,咱們互相討論學習。

 

溫馨提示:在數據庫運行過程中,非當前的聯機重做日誌文件損壞不一定會導致數據庫崩潰,因爲非當前日誌暫時並未用到,數據庫還能正常運行,不過一旦數據庫切換到損壞的聯機重做日誌文件時,就會發現該文件無法訪問而導致報錯。

 

2 丟失當前的聯機重做日誌文件

如果丟失當前聯機重做日誌文件,數據肯定會有丟失 ,除非除非你運氣好到了極點。。。

怎麼判斷哪個是當前日誌文件了,前面模擬過了。

(1)模擬文件損壞

[oracle@elvis elvis]$ ll

total 2081104

drwxr-xr-x 2 oracle oinstall      4096 Oct 13 19:49 bak

-rw-r----- 1 oracle oinstall  10076160 Oct 20 14:53 control01.ctl

-rw-r----- 1 oracle oinstall  52429312 Oct 20 13:57 redo01.log

-rw-r----- 1 oracle oinstall  52429312 Oct 20 14:50 redo02.log

-rw-r----- 1 oracle oinstall  52429312 Oct 20 13:57 redo03.log

-rw-r----- 1 oracle oinstall 629153792 Oct 20 14:43 sysaux01.dbf

-rw-r----- 1 oracle oinstall 734011392 Oct 20 14:44 system01.dbf

-rw-r----- 1 oracle oinstall  71311360 Oct 20 14:20 temp01.dbf

-rw-r----- 1 oracle oinstall  52436992 Oct 20 13:57 test01.dbf

-rw-r----- 1 oracle oinstall 524296192 Oct 20 14:44 undotbs02.dbf

-rw-r----- 1 oracle oinstall   5251072 Oct 20 13:57 users01.dbf

[oracle@elvis elvis]$ mv redo02.log redo02.log.bak

(2)模擬宕機&嘗試開啓數據庫

SQL> shutdown abort;

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area  598437888 bytes

Fixed Size                  1338140 bytes

Variable Size             398460132 bytes

Database Buffers          192937984 bytes

Redo Buffers                5701632 bytes

Database mounted.

ORA-00313: open failed for members of log group 2 of thread 1

ORA-00312: online log 2 thread 1: '/u01/oracle/oradata/elvis/redo02.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

(3)嘗試直接修復重做日誌文件

SQL> select status from v$instance;

STATUS

------------

MOUNTED

SQL> alter database clear logfile group 2;

alter database clear logfile group 2

*

ERROR at line 1:

ORA-01624: log 2 needed for crash recovery of instance elvis (thread 1)

ORA-00312: online log 2 thread 1: '/u01/oracle/oradata/elvis/redo02.log'

(4)執行不完全恢復

SQL> show parameter _allow

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

_allow_resetlogs_corruption          boolean     TRUE

這個隱藏參數,小e以前不完全恢復時有說過,在這裏就不詳述了,可以參見小e以前的恢復筆記

SQL> recover database until cancel;

ORA-00279: change 967170 generated at 10/20/2012 13:57:50 needed for thread 1

ORA-00289: suggestion :

/u01/oracle/flash_recovery_area/ELVIS/archivelog/2012_10_20/o1_mf_1_10_%u_.arc

ORA-00280: change 967170 for thread 1 is in sequence #10

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

auto

ORA-00308: cannot open archived log

'/u01/oracle/flash_recovery_area/ELVIS/archivelog/2012_10_20/o1_mf_1_10_%u_.arc'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

ORA-00308: cannot open archived log

'/u01/oracle/flash_recovery_area/ELVIS/archivelog/2012_10_20/o1_mf_1_10_%u_.arc'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-01194: file 1 needs more recovery to be consistent

ORA-01110: data file 1: '/u01/oracle/oradata/elvis/system01.dbf'

SQL> alter database open resetlogs;

數據庫開啓

(4)查看物理文件

[oracle@elvis elvis]$ ll

total 2132364

drwxr-xr-x 2 oracle oinstall      4096 Oct 13 19:49 bak

-rw-r----- 1 oracle oinstall  10076160 Oct 20 15:08 control01.ctl

-rw-r----- 1 oracle oinstall  52429312 Oct 20 15:08 redo01.log

-rw-r----- 1 oracle oinstall 52429312 Oct 20 15:08 redo02.log  --恢復的文件

-rw-r----- 1 oracle oinstall  52429312 Oct 20 14:53 redo02.log.bak

-rw-r----- 1 oracle oinstall  52429312 Oct 20 15:08 redo03.log

-rw-r----- 1 oracle oinstall 629153792 Oct 20 15:08 sysaux01.dbf

-rw-r----- 1 oracle oinstall 734011392 Oct 20 15:08 system01.dbf

-rw-r----- 1 oracle oinstall  71311360 Oct 20 14:20 temp01.dbf

-rw-r----- 1 oracle oinstall  52436992 Oct 20 15:08 test01.dbf

-rw-r----- 1 oracle oinstall 524296192 Oct 20 15:08 undotbs02.dbf

-rw-r----- 1 oracle oinstall   5251072 Oct 20 15:08 users01.dbf

總結:聯機重做日誌文件的保護對於數據完整至關重要。而因爲重做日誌文件是動態的無法備份,那該怎麼辦呢?那就是:冗餘。而且一定要跨磁盤冗餘。

 

到這裏《[小e筆記]之一步一步學習用戶管理的備份恢復筆記》就告一段落了,謝謝同學們對小e的支持,在這些案例中難免有錯誤之處,敬請諒解,歡迎同學們給予留言和指導,小e感激不盡!!!

 

elvis
2012.10.20
知識共享~共同進步
轉載請註明:

 http://blog.csdn.net/elvis_dataguru/article/details/8093108

發佈了54 篇原創文章 · 獲贊 42 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章