溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Online Redo Log損壞處理的實驗分析

發(fā)布時間:2021-11-03 17:48:31 來源:億速云 閱讀:118 作者:柒染 欄目:建站服務(wù)器

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)Online Redo Log損壞處理的實驗分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Oracle核心文件包括:控制文件、數(shù)據(jù)文件和在線重做日志(Online Redo Log)。Online Redo LogControl File分別采用數(shù)據(jù)冗余的策略進行多重路徑保護。無論是Control File還是Online Redo Log Group Member,都可以指定多個完全相同的文件對象,并且將其分布在不同的存儲介質(zhì)上。一旦發(fā)生介質(zhì)故障,如硬盤介質(zhì)故障,我們可以簡單的使用其他存儲位置的文件進行替換。

所以,即使是在正式的生產(chǎn)環(huán)境下,如果設(shè)置好適當?shù)目刂莆募蓡T組和Online Redo Log組,Control FileOnline Redo Log損壞不可恢復的情況是不多見的。

但是,如果發(fā)生這樣的場景,我們應(yīng)該怎么進行處理呢?

 

1、實驗環(huán)境和影響因素討論

 

我們選擇Oracle 10g環(huán)境進行實驗。

 

 

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

 

 

--數(shù)據(jù)庫處在歸檔模式下;

SQL> archive log list;

數(shù)據(jù)庫日志模式            存檔模式

自動存檔             啟用

存檔終點            USE_DB_RECOVERY_FILE_DEST

最早的聯(lián)機日志序列     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

 

 

在試驗中,我們會在關(guān)閉數(shù)據(jù)庫的時候刪除Online Redo Log組成員文件。注意,在Windows環(huán)境下,由于操作系統(tǒng)的限制,我們是沒有辦法刪除一個正在使用或者與實例相關(guān)的文件。

 

三個潛在因素可能會影響到最后結(jié)果,分別為:日志歸檔模式、關(guān)閉數(shù)據(jù)庫方式和刪除日志組狀態(tài)。

 

日志歸檔模式表示Oracle是否對已經(jīng)寫完的online redo log member進行額外歸檔保存。保持一個連續(xù)的歸檔信息對Oracle的意義在于可以實現(xiàn)完全恢復complete recovery。在歸檔模式下,我們可以從一個過去的備份集開始,利用歸檔日志前推重演事務(wù),最后應(yīng)用到當前日志組,使之恢復到一個完全的恢復點上。如果日志已經(jīng)歸檔,表示日志內(nèi)容都已經(jīng)寫入到了數(shù)據(jù)文件中,狀態(tài)必然是非Active狀態(tài)。我們的實驗中,數(shù)據(jù)文件并不是丟失的對象,所以已經(jīng)寫入數(shù)據(jù)文件的日志丟失并不會造成致命的影響。

 

關(guān)閉數(shù)據(jù)庫方式在Oracle中有若干種,但是總的來說只有一致性關(guān)閉和非一致性關(guān)閉兩個大類。一致性關(guān)閉表示Oracle在關(guān)閉數(shù)據(jù)庫前,都要講未寫入的臟塊寫入到數(shù)據(jù)文件,控制文件和數(shù)據(jù)文件保持一致。一致性關(guān)閉條件下,Oracleopen階段是不需要進行Instance Recovery過程的。非一致性關(guān)閉只有shutdown abort,同斷電處理。非一致性關(guān)閉下Oracleopen階段要進行instance recovery,這個過程需要redo log的配合。

 

刪除日志狀態(tài)。被刪除的日志組是否是當前日志組也是一個重要因素。如果是當前日志組,就意味Oracle在啟動狀態(tài)需要進行讀寫該文件組。如果不是當前日志組被刪除,也可能會有相同的問題,因為非當前日志組可能處在Active狀態(tài)。

 

下面,我們分別進行實驗。

 

2、完全關(guān)閉情況下非當前日志組刪除

 

當前日志文件狀態(tài)如下:

 

 

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,關(guān)閉數(shù)據(jù)庫刪除日志2組文件。

 

 

SQL> shutdown immediate;

數(shù)據(jù)庫已經(jīng)關(guān)閉。

已經(jīng)卸載數(shù)據(jù)庫。

ORACLE 例程已經(jīng)關(guān)閉。

 

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

 驅(qū)動器 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

(篇幅原因,省略部分內(nèi)容……

              16 個文件  3,178,867,712 字節(jié)

               3 個目錄 204,274,311,168 可用字節(jié)

 

 

重新啟動數(shù)據(jù)庫,之后Oraclemountopen階段報錯,因為不能找到控制文件中定義的日志文件。

 

 

SQL> startup

ORACLE 例程已經(jīng)啟動。

 

Total System Global Area  603979776 bytes

Fixed Size                  1250380 bytes

Variable Size             155192244 bytes

Database Buffers          440401920 bytes

Redo Buffers                7135232 bytes

數(shù)據(jù)庫裝載完畢。

ORA-00313: 無法打開日志組 2 (用于線程 1) 的成員

ORA-00312: 聯(lián)機日志 2 線程 1:

'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02A.LOG'

ORA-00312: 聯(lián)機日志 2 線程 1:

'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02B.LOG'

 

SQL> select open_mode from v$database;

 

OPEN_MODE

----------

MOUNTED

 

 

一般情況下,如果是完全關(guān)閉場景,我們是可以保證Oracleonline redo log中所有的內(nèi)容寫入到了數(shù)據(jù)文件,并且保持一致。

 

對非當前日志成員組,如果被誤刪除了,沒有過多的問題,只是需要重建就好了。

 

 

SQL> alter database clear logfile group 2;

數(shù)據(jù)庫已更改。

 

--完全開啟,沒有數(shù)據(jù)損失。

SQL> alter database open;

數(shù)據(jù)庫已更改。

 

 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 字節(jié)

               4 個目錄 204,164,952,064 可用字節(jié)

 

 

 

Oracleclear log后,重新創(chuàng)建了日志文件。

 

 

3、完全關(guān)閉情況下當前日志組刪除

 

如果是完全關(guān)閉情況下當前日志組刪除,我們應(yīng)該怎么處理?

 

 

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;

數(shù)據(jù)庫已經(jīng)關(guān)閉。

已經(jīng)卸載數(shù)據(jù)庫。

ORACLE 例程已經(jīng)關(guān)閉。

 

 

刪除日志組成員,重新啟動。

 

 

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 例程已經(jīng)啟動。

 

Total System Global Area  603979776 bytes

Fixed Size                  1250380 bytes

Variable Size             159386548 bytes

Database Buffers          436207616 bytes

Redo Buffers                7135232 bytes

數(shù)據(jù)庫裝載完畢。

ORA-00313: 無法打開日志組 2 (用于線程 1) 的成員

ORA-00312: 聯(lián)機日志 2 線程 1:

'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02A.LOG'

ORA-00312: 聯(lián)機日志 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 行出現(xiàn)錯誤:

ORA-00350: 日志 2 (實例 orcl 的日志, 線程 1) 需要歸檔

ORA-00312: 聯(lián)機日志 2 線程 1:

'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02A.LOG'

ORA-00312: 聯(lián)機日志 2 線程 1:

'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02B.LOG'

 

 

當前日志中內(nèi)容需要歸檔,所以不能直接進行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

 

 

 

當前數(shù)據(jù)文件是一致性的。

 

 

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

 

 

可以用recoverOracle進行虛擬的恢復動作,恢復到最后的狀態(tài)。

 

 

SQL> recover database until cancel;

完成介質(zhì)恢復。

SQL> alter database open;

alter database open

*

1 行出現(xiàn)錯誤:

ORA-01589: 要打開數(shù)據(jù)庫則必須使用 RESETLOGS NORESETLOGS 選項

 

SQL> alter database open resetlogs;

 

數(shù)據(jù)庫已更改。

 

 

雖然是until cancel,但是卻沒有數(shù)據(jù)會損失。只是在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

 

結(jié)論:對于一致性關(guān)閉條件下,如果online日志組出現(xiàn)問題,即使發(fā)生文件丟失,也不會有數(shù)據(jù)丟失的情況,因為數(shù)據(jù)文件是一致的。

上述就是小編為大家分享的Online Redo Log損壞處理的實驗分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI