小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文件的錯誤提示,與我們想要的結果一致,但是小e在10g實驗的時候應該在開啓時直接報了這個丟失文件的錯誤,但現在在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
知識共享~共同進步
轉載請註明: