Online Redo Log損壞處理實驗(上)
Oracle核心檔案包括:控制檔案、資料檔案和線上重做日誌(Online Redo Log)。Online Redo Log和Control File分別採用資料冗餘的策略進行多重路徑保護。無論是Control File還是Online Redo Log Group Member,都可以指定多個完全相同的檔案物件,並且將其分佈在不同的儲存介質上。一旦發生介質故障,如硬碟介質故障,我們可以簡單的使用其他儲存位置的檔案進行替換。
所以,即使是在正式的生產環境下,如果設定好適當的控制檔案成員組和Online Redo Log組,Control File和Online Redo Log損壞不可恢復的情況是不多見的。
但是,如果發生這樣的場景,我們應該怎麼進行處理呢?本篇討論Online Redo成員組損壞缺失的情況。
1、實驗環境和影響因素討論
我們選擇Oracle 10g環境進行實驗。
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
--資料庫處在歸檔模式下;
SQL> archive log list;
資料庫日誌模式 存檔模式
自動存檔 啟用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯機日誌序列 237
下一個存檔日誌序列 239
當前日誌序列 239
SQL> select group#, archived, status, first_change# from v$log;
GROUP# ARCHIVED STATUS FIRST_CHANGE#
---------- -------- ---------------- -------------
1 YES INACTIVE 3567149
2 YES INACTIVE 3572305
3 NO CURRENT 3572332
在試驗中,我們會在關閉資料庫的時候刪除Online Redo Log組成員檔案。注意,在Windows環境下,由於作業系統的限制,我們是沒有辦法刪除一個正在使用或者與例項相關的檔案。
三個潛在因素可能會影響到最後結果,分別為:日誌歸檔模式、關閉資料庫方式和刪除日誌組狀態。
日誌歸檔模式表示Oracle是否對已經寫完的online redo log member進行額外歸檔儲存。保持一個連續的歸檔資訊對Oracle的意義在於可以實現完全恢復complete recovery。在歸檔模式下,我們可以從一個過去的備份集開始,利用歸檔日誌前推重演事務,最後應用到當前日誌組,使之恢復到一個完全的恢復點上。如果日誌已經歸檔,表示日誌內容都已經寫入到了資料檔案中,狀態必然是非Active狀態。我們的實驗中,資料檔案並不是丟失的物件,所以已經寫入資料檔案的日誌丟失並不會造成致命的影響。
關閉資料庫方式在Oracle中有若干種,但是總的來說只有一致性關閉和非一致性關閉兩個大類。一致性關閉表示Oracle在關閉資料庫前,都要講未寫入的髒塊寫入到資料檔案,控制檔案和資料檔案保持一致。一致性關閉條件下,Oracle在open階段是不需要進行Instance Recovery過程的。非一致性關閉只有shutdown abort,同斷電處理。非一致性關閉下Oracle在open階段要進行instance recovery,這個過程需要redo log的配合。
刪除日誌狀態。被刪除的日誌組是否是當前日誌組也是一個重要因素。如果是當前日誌組,就意味Oracle在啟動狀態需要進行讀寫該檔案組。如果不是當前日誌組被刪除,也可能會有相同的問題,因為非當前日誌組可能處在Active狀態。
下面,我們分別進行實驗。
2、完全關閉情況下非當前日誌組刪除
當前日誌檔案狀態如下:
SQL> select group#, type, member from v$logfile;
GROUP# TYPE MEMBER
---------- ------- --------------------------------------------------------------------------------
3 ONLINE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03A.LOG
2 ONLINE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02A.LOG
1 ONLINE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01A.LOG
1 ONLINE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01B.LOG
3 ONLINE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03B.LOG
2 ONLINE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02B.LOG
6 rows selected
當前日誌組號為3,關閉資料庫刪除日誌2組檔案。
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
E:\oracle\product\10.2.0\oradata\orcl>rename REDO02A.LOG REDO02A.LOG_bak
E:\oracle\product\10.2.0\oradata\orcl>rename REDO02B.LOG REDO02B.LOG_bak
E:\oracle\product\10.2.0\oradata\orcl>dir
驅動器 E 中的卷沒有標籤。
卷的序列號是 7CD0-C497
E:\oracle\product\10.2.0\oradata\orcl 的目錄
2012-09-22 13:20 <DIR> .
2012-09-22 13:20 <DIR> ..
2012-09-22 12:04 <DIR> CHANGETRACKING
2012-09-22 13:19 7,356,416 CONTROL01.CTL
2012-09-22 13:19 7,356,416 CONTROL02.CTL
2012-09-22 13:19 7,356,416 CONTROL03.CTL
2012-09-22 13:19 104,865,792 EXAMPLE01.DBF
2012-09-22 13:19 52,429,312 REDO01A.LOG
2012-09-22 13:19 52,429,312 REDO01B.LOG
2012-09-22 13:19 52,429,312 REDO02A.LOG_bak
2012-09-22 13:19 52,429,312 REDO02B.LOG_bak
2012-09-22 13:19 52,429,312 REDO03A.LOG
2012-09-22 13:19 52,429,312 REDO03B.LOG
2012-09-22 13:19 304,095,232 SYSAUX01.DBF
(篇幅原因,省略部分內容……)
16 個檔案 3,178,867,712 位元組
3 個目錄 204,274,311,168 可用位元組
重新啟動資料庫,之後Oracle在mount到open階段報錯,因為不能找到控制檔案中定義的日誌檔案。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area 603979776 bytes
Fixed Size 1250380 bytes
Variable Size 155192244 bytes
Database Buffers 440401920 bytes
Redo Buffers 7135232 bytes
資料庫裝載完畢。
ORA-00313: 無法開啟日誌組 2 (用於執行緒 1) 的成員
ORA-00312: 聯機日誌 2 執行緒 1:
'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02A.LOG'
ORA-00312: 聯機日誌 2 執行緒 1:
'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02B.LOG'
SQL> select open_mode from v$database;
OPEN_MODE
----------
MOUNTED
一般情況下,如果是完全關閉場景,我們是可以保證Oracle將online redo log中所有的內容寫入到了資料檔案,並且保持一致。
對非當前日誌成員組,如果被誤刪除了,沒有過多的問題,只是需要重建就好了。
SQL> alter database clear logfile group 2;
資料庫已更改。
--完全開啟,沒有資料損失。
SQL> alter database open;
資料庫已更改。
E:\oracle\product\10.2.0\oradata\orcl 的目錄
2012-09-22 13:23 <DIR> .
2012-09-22 13:23 <DIR> ..
2012-09-22 12:04 <DIR> CHANGETRACKING
2012-09-22 13:20 7,356,416 CONTROL01.CTL
2012-09-22 13:20 7,356,416 CONTROL02.CTL
2012-09-22 13:20 7,356,416 CONTROL03.CTL
2012-09-22 13:19 104,865,792 EXAMPLE01.DBF
2012-09-22 13:23 <DIR> ONLINELOG
2012-09-22 13:19 52,429,312 REDO01A.LOG
2012-09-22 13:19 52,429,312 REDO01B.LOG
2012-09-22 13:23 52,429,312 REDO02A.LOG
2012-09-22 13:19 52,429,312 REDO02A.LOG_bak
2012-09-22 13:23 52,429,312 REDO02B.LOG
2012-09-22 13:19 52,429,312 REDO02B.LOG_bak
2012-09-22 13:19 52,429,312 REDO03A.LOG
2012-09-22 13:19 52,429,312 REDO03B.LOG
(篇幅原因,部分省略……)
18 個檔案 3,283,726,336 位元組
4 個目錄 204,164,952,064 可用位元組
Oracle在clear log後,重新建立了日誌檔案。
3、完全關閉情況下當前日誌組刪除
如果是完全關閉情況下當前日誌組刪除,我們應該怎麼處理?
SQL> select group#, archived, status, first_change# from v$log;
GROUP# ARCHIVED STATUS FIRST_CHANGE#
---------- -------- ---------------- -------------
1 YES INACTIVE 3567149
2 NO CURRENT 3576416
3 YES INACTIVE 3572332
SQL> select group#, type, member from v$logfile;
GROUP# TYPE MEMBER
---------- ------- --------------------------------------------------------------------------------
3 ONLINE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03A.LOG
2 ONLINE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02A.LOG
1 ONLINE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01A.LOG
1 ONLINE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01B.LOG
3 ONLINE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03B.LOG
2 ONLINE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02B.LOG
6 rows selected
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
刪除日誌組成員,重新啟動。
E:\oracle\product\10.2.0\oradata\orcl>rename REDO02A.LOG REDO02A.LOG_bak
E:\oracle\product\10.2.0\oradata\orcl>rename REDO02B.LOG REDO02B.LOG_bak
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area 603979776 bytes
Fixed Size 1250380 bytes
Variable Size 159386548 bytes
Database Buffers 436207616 bytes
Redo Buffers 7135232 bytes
資料庫裝載完畢。
ORA-00313: 無法開啟日誌組 2 (用於執行緒 1) 的成員
ORA-00312: 聯機日誌 2 執行緒 1:
'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02A.LOG'
ORA-00312: 聯機日誌 2 執行緒 1:
'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02B.LOG'
使用Clear方法進行恢復嘗試。
SQL> alter database clear logfile group 2;
alter database clear logfile group 2
*
第 1 行出現錯誤:
ORA-00350: 日誌 2 (例項 orcl 的日誌, 執行緒 1) 需要歸檔
ORA-00312: 聯機日誌 2 執行緒 1:
'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02A.LOG'
ORA-00312: 聯機日誌 2 執行緒 1:
'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02B.LOG'
當前日誌中內容需要歸檔,所以不能直接進行clear log操作。筆者猜想:如果這裡是非歸檔模式,是否就可以成功了?事實的確如此,下面為插入的實驗過程。
--當前日誌組為1;
SQL> alter database clear logfile group 1;
Database altered.
SQL> alter database open;
Database altered.
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ WRITE
當前資料檔案是一致性的。
SQL> select ts#, checkpoint_change#, last_change# from v$datafile;
TS# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
0 3577306 3577306
1 3577306 3577306
2 3577306 3577306
4 3577306 3577306
6 3577306 3577306
可以用recover讓Oracle進行虛擬的恢復動作,恢復到最後的狀態。
SQL> recover database until cancel;
完成介質恢復。
SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項
SQL> alter database open resetlogs;
資料庫已更改。
雖然是until cancel,但是卻沒有資料會損失。只是在open的時候,需要使用resetlog模式重新開啟一個新的朝代。
SQL> select open_mode, current_scn from v$database;
OPEN_MODE CURRENT_SCN
---------- -----------
READ WRITE 3577513
SQL> select group#, archived, status, first_change#,sequence# from v$log;
GROUP# ARCHIVED STATUS FIRST_CHANGE# SEQUENCE#
---------- -------- ---------------- ------------- ----------
1 NO CURRENT 3577308 2
2 YES INACTIVE 3577307 1
3 YES UNUSED 0 0
結論:對於一致性關閉條件下,如果online日誌組出現問題,即使發生檔案丟失,也不會有資料丟失的情況,因為資料檔案是一致的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29067253/viewspace-2148093/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Online Redo Log損壞處理實驗(中)
- Online Redo Log損壞處理實驗(下)
- Undo和Current Online Redo損壞的處理方法
- Current online Redo 和 Undo 損壞的處理方法
- 【Oracle】Current online Redo 和 Undo 損壞的處理方法Oracle
- Redo Log File(inactive、active)損壞,處理恢復對策
- oracle - redo 損壞或刪除處理方法Oracle
- Oracle REDO損壞Oracle Redo
- 處理塊損壞
- (轉)oracle redolog損壞的處理辦法Oracle Redo
- redo日誌損壞
- 控制檔案損壞重建實驗(上)
- oracle redo各種狀態(inactive、active、current)損壞的處理方式Oracle Redo
- 段頭損壞的處理
- Oracle online redo log日誌 (當前或非當前日誌) 損壞之後的DB恢復Oracle
- 第7章 處理塊損壞
- Online Redo Log 結構
- oracle10g rac 表決盤損壞、ocr損壞處理Oracle
- Oracle壞塊修復處理實驗Oracle
- 【操作】調整Online Redo Logs大小(Resizing Oracle Online Redo Logs)Oracle
- RAC磁碟頭損壞問題處理
- UNDO表空間損壞的處理
- 遇到了 客戶生產庫 current online logfile 損壞
- redo log檔案丟失處理措施
- [OCP學習筆記]043-07-處理資料庫損壞--模擬實驗(2)筆記資料庫
- [OCP學習筆記]043-07-處理資料庫損壞--模擬實驗(1)筆記資料庫
- Oracle Standby Redo Log實驗兩則Oracle
- 控制檔案損壞重建實驗(下)
- undo表空間損壞的處理過程
- 聯機日誌損壞恢復實驗
- REDO檔案丟失或者損壞的恢復
- sysaux表空間檔案損壞的處理(zt)UX
- Dataguard環境修改主庫和standby庫online redo log&standby redo log大小
- online redo log 一直處於active 狀態可能原因分析 [zt]
- oracle 線上修改online redo logfiles size 大小Oracle
- DBA實踐---壞塊處理
- Oracle Dataguard Standby Redo Log的兩個實驗Oracle
- 回滾段表空間損壞處理(ORA-01552)處理方法