談談Oracle日誌檔案的INVALID狀態(上)
在Oracle資料庫中,三大檔案(Data File、Control File和Online Redo Log)扮演著極其重要的地位和作用。其中,Redo Log和Oracle Redo Log機制更是Oracle正常、安全執行的保證。
Oracle Online Redo Log採用日誌組(Logfile Group)和組成員(Group Member)的方式。每個Log File Group中的成員內容保持映象相同,生成的每一條Redo Log Entry都需要寫入到每個成員中。原則上,各個日誌成員儲存在不同的儲存位置,這樣一旦發生介質損壞,可以使用其他成員進行恢復。
Oracle資料庫提供了對日誌組和日誌成員管理的語句操作支援。我們可以方便的新增、刪除日誌組,向日志組中新增、刪除成員檔案。但是,在一般的情況下,我們還是希望能夠一次性將日誌組所有成員確定新增。這樣可以避免很多問題,其中之一就是日誌檔案的INVALID狀態。
1、實驗環境介紹
本文選擇Oracle 11g進行實驗測試。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
當前系統中有三個日誌組,每個組成員兩個。當前第三組是Current狀態Redo Log Group。
SQL> select group#, sequence#, members, status, first_change#, next_change# from v$log;
GROUP# SEQUENCE# MEMBERS STATUS FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ---------- ---------------- ------------- ------------
1 73 2 INACTIVE 1560017 1580625
2 74 2 INACTIVE 1580625 1600939
3 75 2 CURRENT 1600939 281474976710
SQL> select group#, status, type, member from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- --------------------------------------------------------------------------------
3 ONLINE /u01/oradata/WILSON/onlinelog/o1_mf_3_7xt456o0_.log
3 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_3_7xt45bvp_.log
2 ONLINE /u01/oradata/WILSON/onlinelog/o1_mf_2_7xt44w3k_.log
2 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_2_7xt450rv_.log
1 ONLINE /u01/oradata/WILSON/onlinelog/o1_mf_1_7xt44nq1_.log
1 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_7xt44qt6_.log
6 rows selected
在v$logfile中,有一個狀態列status,預設情況下是為空。
2、非Current日誌組成員新增
如果當前我們希望給日誌組新增一個member的時候,Oracle是提供了相應的語句的。當前日誌組是group 3,我們先給非current組新增。
SQL> alter database add logfile member '/u01/flash_recovery_area/WILSON/onlinelog/redolog01a.log' to group 1;
Database altered
SQL> select group#, status, type, member from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- --------------------------------------------------------------------------------
3 ONLINE /u01/oradata/WILSON/onlinelog/o1_mf_3_7xt456o0_.log
3 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_3_7xt45bvp_.log
2 ONLINE /u01/oradata/WILSON/onlinelog/o1_mf_2_7xt44w3k_.log
2 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_2_7xt450rv_.log
1 ONLINE /u01/oradata/WILSON/onlinelog/o1_mf_1_7xt44nq1_.log
1 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_7xt44qt6_.log
1 INVALID ONLINE /u01/flash_recovery_area/WILSON/onlinelog/redolog01a.log
7 rows selected
SQL> select group#, sequence#, members, status, first_change#, next_change# from v$log;
GROUP# SEQUENCE# MEMBERS STATUS FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ---------- ---------------- ------------- ------------
1 73 3 INACTIVE 1560017 1580625
2 74 2 INACTIVE 1580625 1600939
3 75 2 CURRENT 1600939 281474976710
注意,我們的確給group 1新增了檔案。但是該檔案的狀態是INVALID。在OS層面,我們觀察一下:
[oracle@bspdev onlinelog]$ pwd
/u01/flash_recovery_area/WILSON/onlinelog
[oracle@bspdev onlinelog]$ ls -l
total 205040
-rw-r----- 1 oracle oinstall 52429312 Sep 10 03:56 o1_mf_1_7xt44qt6_.log
-rw-r----- 1 oracle oinstall 52429312 Sep 10 03:56 o1_mf_2_7xt450rv_.log
-rw-r----- 1 oracle oinstall 52429312 Sep 10 04:04 o1_mf_3_7xt45bvp_.log
-rw-r----- 1 oracle oinstall 52429312 Sep 10 04:03 redolog01a.log
[oracle@bspdev onlinelog]$
在OS層面上,Oracle的確建立了檔案redolog01a.log,而且大小和其他組成員大小相同。那麼這個INVALID狀態是什麼意思呢?如果我們切換日誌組,轉換到檔案上,有什麼問題嗎?
SQL> alter system switch logfile;
System altered
SQL> select group#, sequence#, members, status, first_change#, next_change# from v$log;
GROUP# SEQUENCE# MEMBERS STATUS FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ---------- ---------------- ------------- ------------
1 76 3 CURRENT 1601735 281474976710
2 74 2 INACTIVE 1580625 1600939
3 75 2 ACTIVE 1600939 1601735
SQL> select group#, status, type, member from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- --------------------------------------------------------------------------------
(篇幅原因,有省略……)
2 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_2_7xt450rv_.log
1 ONLINE /u01/oradata/WILSON/onlinelog/o1_mf_1_7xt44nq1_.log
1 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_7xt44qt6_.log
1 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/redolog01a.log
7 rows selected
當進行switch logfile之後,redolog01a.log檔案的狀態變為空,表示一切正常。可以猜想:當日志切換到一個新的日誌組的時候,會將日誌原有的內容覆蓋重新整理。這個過程中,伴隨著各個成員Member保持一致。此時,Invalid狀態的日誌檔案就會得到同步的機會。
進一步想,標記為Invalid狀態的日誌檔案,雖然大小已經確定,但是內容上沒有與其他同Group Member同步。所以Oracle將其標記為Invalid。
根據Oracle的工作規則,如果處在Invalid狀態的日誌檔案組不是Current日誌組,那麼在日誌切換到該組的時候,內容都會被覆蓋。由此,Invalid狀態消失。
那麼,如果當前Invalid所在是一個Current日誌組,Lgwr不斷的寫入內容。這個過程是如何呢?
3、Current日誌組成員新增
接著上面的實驗結果,如果往當前Current日誌組中新增成員,效果如何呢?
SQL> alter database add logfile member '/u01/flash_recovery_area/WILSON/onlinelog/redolog01b.log' to group 1;
Database altered
SQL> select group#, status, type, member from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- --------------------------------------------------------------------------------
(篇幅原因,省略….)
1 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/redolog01a.log
1 INVALID ONLINE /u01/flash_recovery_area/WILSON/onlinelog/redolog01b.log
8 rows selected
SQL> select group#, sequence#, members, status, first_change#, next_change# from v$log;
GROUP# SEQUENCE# MEMBERS STATUS FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ---------- ---------------- ------------- ------------
1 76 4 CURRENT 1601735 281474976710
2 74 2 INACTIVE 1580625 1600939
3 75 2 ACTIVE 1600939 1601735
之後,我們實驗生成Redo Entry之後,Lgwr會不會書寫到Invalid狀態的日誌中。
SQL> col name for a10;
SQL> select * from v$statname where name='redo size';
STATISTIC# NAME CLASS STAT_ID
---------- ---------- ---------- ----------
169 redo size 2 1236385760
SQL> select * from v$mystat where STATISTIC#=169;
SID STATISTIC# VALUE
---------- ---------- ----------
43 169 8585072
SQL> delete t;
72591 rows deleted
SQL> commit;
Commit complete
SQL> select * from v$mystat where STATISTIC#=169;
SID STATISTIC# VALUE
---------- ---------- ----------
43 169 36099756
刪除資料表T,生成了(36099756-858072)的redo log。那麼,此時Invalid狀態的日誌檔案如何呢?
SQL> select group#, status, type, member from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- --------------------------------------------------------------------------------
(篇幅原因,省略部分……)
1 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/o1_mf_1_7xt44qt6_.log
1 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/redolog01a.log
1 INVALID ONLINE /u01/flash_recovery_area/WILSON/onlinelog/redolog01b.log
8 rows selected
SQL> select group#, sequence#, members, status, first_change#, next_change# from v$log;
GROUP# SEQUENCE# MEMBERS STATUS FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ---------- ---------------- ------------- ------------
1 76 4 CURRENT 1601735 281474976710
2 74 2 INACTIVE 1580625 1600939
3 75 2 INACTIVE 1600939 1601735
雖然生成了redo log,並且寫入到了檔案中,但是Invalid狀態沒有變化。說明,即使是當前的日誌組,如果有處在Invalid狀態日誌,內容不會同步,新日誌也不會寫入到其中。
只有在日誌組切換到下一個迴圈之後,才能最後實現同步。
SQL> alter system switch logfile;
System altered
SQL> alter system switch logfile;
System altered
SQL> alter system switch logfile;(執行時間很長)
System altered
SQL> select group#, status, type, member from v$logfile;
GROUP# STATUS TYPE MEMBER
---------- ------- ------- --------------------------------------------------------------------------------
(篇幅原因,省略部分……)
1 ONLINE /u01/flash_recovery_area/WILSON/onlinelog/redolog01b.log
8 rows selected
SQL> select group#, sequence#, members, status, first_change#, next_change# from v$log;
GROUP# SEQUENCE# MEMBERS STATUS FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ---------- ---------------- ------------- ------------
1 79 4 CURRENT 1603673 281474976710
2 77 2 ACTIVE 1603650 1603669
3 78 2 ACTIVE 1603669 1603673
可見,只有在迴圈之後才有消除Invalid狀態。接下來,我們討論Invalid對Oracle啟動過程的影響。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-743078/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 談談Oracle日誌檔案的INVALID狀態Oracle
- 談談Oracle日誌檔案的INVALID狀態(下)Oracle
- 16、重做日誌檔案的狀態及重做日誌組的狀態說明
- 談談Selenium中的日誌
- 日誌的狀態
- 【Oracle日誌】- 日誌檔案重建Oracle
- inactive狀態日誌組檔案損壞的恢復
- 談談RxSwift和狀態管理Swift
- oracle日誌狀態為STALE案例分析Oracle
- 【備份恢復】恢復inactive狀態的日誌檔案
- 淺談MySQL日誌檔案|手撕MySQL|對線面試官MySql面試
- oracle 日誌檔案管理Oracle
- 簡述oracle日誌組的四種狀態Oracle
- 淺談前端狀態管理前端
- Oracle日誌檔案常用操作Oracle
- oracle 關於-日誌檔案Oracle
- 修改Oracle重做日誌檔案的大小Oracle
- 【DataGuard】Oracle DataGuard 日誌傳輸狀態監控Oracle
- 淺談前端的狀態管理,以及anguar的狀態管理庫前端
- oracle12告警日誌檔案?Oracle
- Oracle重做日誌檔案基礎Oracle
- oracle 聯機重做日誌檔案Oracle
- 轉移Oracle日誌檔案位置Oracle
- oracle 日誌檔案佔空間Oracle
- ORACLE停止監聽日誌檔案Oracle
- 深入分析Oracle日誌檔案Oracle
- 日誌檔案和歸檔日誌檔案的關係以及如何切換日誌
- Oracle日誌組新增冗餘檔案和日誌組Oracle
- Oracle 11g Dataguard環境下資料檔案、日誌檔案管理(上)Oracle
- 圖解Redis,談談Redis的持久化,RDB快照與AOF日誌圖解Redis持久化
- oracle日誌分析從列表中移去一個日誌檔案Oracle
- fedora 8上的系統日誌的配置檔案
- 日誌檔案
- 也談一下檔案上傳 (轉)
- oracle中移動控制檔案、資料檔案、日誌檔案Oracle
- 狀態為inactive的日誌一定歸檔了嗎?
- 日誌檔案的管理
- 日誌檔案的大小