1. 程式人生 > 實用技巧 >Oracle重做日誌和日誌挖掘

Oracle重做日誌和日誌挖掘

重做日誌-Redo log

首先給出參考資料:

1、Oracle官網-Managing the Redo Log

為什麼需要redo log

  • 記憶體中資料修改後,不必立即更新到磁碟---效率
  • 由日誌完成資料的保護目的---效率
  • 其他副產品
    • 資料恢復(備份集+歸檔日誌)
    • 資料同步(DG,streams,goldengate)
    • 日誌挖掘

什麼是Redo log

重做日誌包含所有資料產生的歷史改變記錄。

重做日誌檔案通常用於

  • 恢復
  • 日誌挖掘
  • 資料庫產生的每個改動
    • 寫入資料塊緩衝之前,先寫入redo log buffer --記憶體
    • 寫入資料檔案之前先寫入日誌檔案 --資料檔案
  • 當提交後,redo log buffer被刷入redo log files

關於v$log檢視

v$log從控制檔案中顯示日誌檔案的資訊。可參考官網資料v$log

Column Datatype Description
GROUP# NUMBER Log group number
THREAD# NUMBER Log thread number
SEQUENCE# NUMBER Log sequence number
BYTES NUMBER Size of the log (in bytes)
BLOCKSIZE NUMBER Block size of the logfile (512 or 4096)
MEMBERS NUMBER Number of members in the log group
ARCHIVED VARCHAR2(3) Archive status (YES) or (NO)
STATUS VARCHAR2(16) UNUSED,CURRENT,ACTIVE,CLEARING,CLEARING_CURRENT,INACTIVE
FIRST_CHANGE# NUMBER Lowest system change number (SCN) in the log
FIRST_TIME DATE Time of the first SCN in the log
NEXT_CHANGE# NUMBER Highest change number (SCN) in the log. When STATUS=CURRENT, NEXT_CHANGE#is set to the highest possible SCN, 281474976710655.
NEXT_TIME DATE Time of the highest SCN in the log. When STATUS=CURRENT, NEXT_TIME is set toNULL.
CON_ID NUMBER 0,1,n三種情況

日誌檔案的六種狀態UNUSED,CURRENT,ACTIVE,CLEARING,CLEARING_CURRENT,INACTIVE代表的意思分別如下所述:

  • UNUSED - Online redo log has never been written to. This is the state of a redo log that was just added, or just after a RESETLOGS, when it is not the current redo log.
  • CURRENT - Current redo log. This implies that the redo log is active. The redo log could be open or closed.
  • ACTIVE - Log is active but is not the current log. It is needed for crash recovery. It may be in use for block recovery. It may or may not be archived.
  • CLEARING - Log is being re-created as an empty log after an ALTER DATABASE CLEAR LOGFILE statement. After the log is cleared, the status changes to UNUSED.
  • CLEARING_CURRENT - Current log is being cleared of a closed thread. The log can stay in this status if there is some failure in the switch such as an I/O error writing the new log header.
  • INACTIVE - Log is no longer needed for instance recovery. It may be in use for media recovery. It may or may not be archived.

LGWR如何重複使用redo log files

上圖就是Oracle LGWR程序向redo log files中寫入redo記錄的過程,可見,Oracle資料庫每次只是用一個redo log file來儲存redo log buffer中的redo記錄。LGWR正在寫入的那個redo log file就是current redo log file。

可用於例項恢復的redo log files就是active redo log files。

不再用於例項恢復的redo log files就是inactive redo log files。

如果資料庫當前是Archivelog模式,那麼直到有一個後臺歸檔程序ARCn已經歸檔成功,資料庫才能重用或者覆蓋active online log file。

如果資料庫當前是NoArchivelog模式,當最後一個redo log file寫滿的時候,LGWR會繼續按順序覆蓋下一個inactive redo log file。

查詢使用的日誌檔案的組數及每組的狀態

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

    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 INACTIVE

有程式碼可知當前所用的日誌檔案組數為3組,其中第一組是curren狀態,第二三組是inactive狀態。

我們也可以使用以下命令手動切換當前LGWR操作的redo log file。

SQL> alter system switch logfile;

系統已更改。

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

    GROUP# STATUS
---------- ----------------
         1 ACTIVE
         2 CURRENT
         3 INACTIVE

可見當前LGWR操作的redo log file已經由之前的第一組修改為第二組了,並且第一組的redo log file變成了Active,也就是說可以用於例項恢復。

過了一會之後再次查詢redo log file狀態出現的結果如下:

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

    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 CURRENT
         3 INACTIVE

此時會發現後臺程序會自動將第一個處於active的redo log file變成inactive。這是為什麼呢?原來是後臺歸檔程序ARCn將active redo log file歸檔成歸檔日誌檔案,相應的狀態就由active變成了inactive。此時group1就不再用於例項恢復了。這個過程用下圖來解釋:

Multiplexed Redo Log Files

Oracle資料庫允許多路複用重做日誌,也就是說,重做日誌的兩個或多個相同的拷貝可以自動保持在不同的地點。為了最大效益,儲存的位置應在分開的磁碟。即使重做日誌的所有副本都在同一磁碟上,這種冗餘措施也是可以防止I / O錯誤,檔案損壞,等等。當使用複用重做日誌時,LGWR會將相同的redo log資訊同時寫入多個相同的重做日誌檔案,從而解決重做日誌的單點故障問題。

圖中A_LOG1和B_LOG1是第1組的成員,A_LOG2和B_LOG2是第2組的兩個成員,等等。一組中的每個成員都必須是相同的大小,並且是狀態也是同步的(active or inactive)。

SCN--system change number

Oracle中的SCN(system change number)和我們的北京時間的意義是相同的,SCN是Oracle中的時間號

為什麼Oracle不用時間來界定呢?

我在北京時間8:00的時候執行一條DML語句,然後修改機器上的時間為7:00,再執行一條DML語句。如果用機器上的時間區分的話,那Oracle根本區分不出來這兩條DML語句的執行順序——而這一點對於Oracle是很重要的。所以它採用自己產生的SCN來區分所有操作的先後順序。

關於SCN的具體講解可以參見:http://blog.chinaunix.net/uid-18974058-id-3068592.html

日誌檔案

日誌檔案使用作業系統塊大小

  • 通常是512bytes
  • 格式依賴於
    • 作業系統
    • Oracle版本

Redo日誌組成

  • 資料頭
  • redo record

Redo record

一個redo record記錄包括

  • Redo記錄臺
  • 一個或多個改變向量

每個redo record包含每個原子改變的undo和redo

某些改動不需要undo(臨時表,直接載入...)

redo log總結

  • redo log是Oracle中極其重要的元件,它的目的在於保證資料的安全性

  • redo log的丟失可能導致資料庫中資料的丟失

  • 應該講Oracle至於歸檔模式下

日誌挖掘-logminer

參考:

Oracle官網-Using LogMiner to Analyze Redo Log Files

cnblogs-LogMiner配置使用手冊

用途

  • 對Oracle線上redo和歸檔日誌進行分析

目的

  • 修正誤操作
  • 審計

dbms_logmnr

  • 可以基於日誌檔案分析(一個或者多個)
  • 可以基於時間段分析
  • 可以基於SCN分析

記得幫我點贊哦!

精心整理了計算機各個方向的從入門、進階、實戰的視訊課程和電子書,按照目錄合理分類,總能找到你需要的學習資料,還在等什麼?快去關注下載吧!!!

念念不忘,必有迴響,小夥伴們幫我點個贊吧,非常感謝。

我是職場亮哥,YY高階軟體工程師、四年工作經驗,拒絕鹹魚爭當龍頭的斜槓程式設計師。

聽我說,進步多,程式人生一把梭

如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激。

職場亮哥文章列表:更多文章

本人所有文章、回答都與版權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!