作者:admin 日期:2023-10-17 瀏覽: 次
Oracle重做日志和日志挖掘
內(nèi)存中數(shù)據(jù)修改后,不必立即更新到磁盤---效率由日志完成數(shù)據(jù)的保護(hù)目的---效率其他副產(chǎn)品數(shù)據(jù)恢復(fù)(備份集+歸檔日志)數(shù)據(jù)同步(DG,streams,goldengate)日志挖掘
重做日志包含所有數(shù)據(jù)產(chǎn)生的歷史改變記錄。
重做日志文件通常用于恢復(fù)日志挖掘流數(shù)據(jù)庫產(chǎn)生的每個(gè)改動(dòng)寫入數(shù)據(jù)塊緩沖之前,先寫入redo log buffer --內(nèi)存寫入數(shù)據(jù)文件之前先寫入日志文件 --數(shù)據(jù)文件當(dāng)提交后,redo log buffer被刷入redo log files
v$log從控制文件中顯示日志文件的信息??蓞⒖脊倬W(wǎng)資料[v$log]( https://docs.oracle.com/datab...
東臺(tái)數(shù)據(jù)恢復(fù)日志文件的六種狀態(tài)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.
上圖就是Oracle LGWR進(jìn)程向redo log files中寫入redo記錄的過程,可見,Oracle數(shù)據(jù)庫每次只是用一個(gè)redo log file來存儲(chǔ)redo log buffer中的redo記錄。LGWR正在寫入的那個(gè)redo log file就是current redo log file。
可用于實(shí)例恢復(fù)的redo log files就是active redo log files。
不再用于實(shí)例恢復(fù)的redo log files就是inactive redo log files。
如果數(shù)據(jù)庫當(dāng)前是Archivelog模式,那么直到有一個(gè)后臺(tái)歸檔進(jìn)程ARCn已經(jīng)歸檔成功,數(shù)據(jù)庫才能重用或者覆蓋active online log file。
如果數(shù)據(jù)庫當(dāng)前是NoArchivelog模式,當(dāng)最后一個(gè)redo log file寫滿的時(shí)候,LGWR會(huì)繼續(xù)按順序覆蓋下一個(gè)inactive redo log file。
有代碼可知當(dāng)前所用的日志文件組數(shù)為3組,其中第一組是curren狀態(tài),第二三組是inactive狀態(tài)。
揚(yáng)州數(shù)據(jù)恢復(fù)我們也可以使用以下命令手動(dòng)切換當(dāng)前LGWR操作的redo log file。
可見當(dāng)前LGWR操作的redo log file已經(jīng)由之前的第一組修改為第二組了,并且第一組的redo log file變成了Active,也就是說可以用于實(shí)例恢復(fù)。
過了一會(huì)之后再次查詢r(jià)edo log file狀態(tài)出現(xiàn)的結(jié)果如下:

此時(shí)會(huì)發(fā)現(xiàn)后臺(tái)進(jìn)程會(huì)自動(dòng)將第一個(gè)處于active的redo log file變成inactive。這是為什么呢?原來是后臺(tái)歸檔進(jìn)程ARCn將active redo log file歸檔成歸檔日志文件,相應(yīng)的狀態(tài)就由active變成了inactive。宿遷數(shù)據(jù)恢復(fù)此時(shí)group1就不再用于實(shí)例恢復(fù)了。這個(gè)過程用下圖來解釋:
Oracle數(shù)據(jù)庫允許多路復(fù)用重做日志,也就是說,重做日志的兩個(gè)或多個(gè)相同的拷貝可以自動(dòng)保持在不同的地點(diǎn)。為了最大效益,存儲(chǔ)的位置應(yīng)在分開的磁盤。即使重做日志的所有副本都在同一磁盤上,這種冗余措施也是可以防止I / O錯(cuò)誤,文件損壞,等等。當(dāng)使用復(fù)用重做日志時(shí),LGWR會(huì)將相同的redo log信息同時(shí)寫入多個(gè)相同的重做日志文件,從而解決重做日志的單點(diǎn)故障問題。
圖中A_LOG1和B_LOG1是第1組的成員,A_LOG2和B_LOG2是第2組的兩個(gè)成員,等等。一組中的每個(gè)成員都必須是相同的大小,并且是狀態(tài)也是同步的(active or inactive)。
Oracle中的SCN(system change number)和我們的北京時(shí)間的意義是相同的, SCN是Oracle中的時(shí)間號(hào) 。
為什么Oracle不用時(shí)間來界定呢?
我在北京時(shí)間8:00的時(shí)候執(zhí)行一條DML語句,然后修改機(jī)器上的時(shí)間為7:00,再執(zhí)行一條DML語句。如果用機(jī)器上的時(shí)間區(qū)分的話,那Oracle根本區(qū)分不出來這兩條DML語句的執(zhí)行順序——而這一點(diǎn)對(duì)于Oracle是很重要的。所以它 采用自己產(chǎn)生的SCN來區(qū)分所有操作的先后順序。
關(guān)于SCN的具體講解可以參見: http://blog.chinaunix.net/uid-18974058-id-3068592.html
日志文件使用操作系統(tǒng)塊大小通常是512bytes格式依賴于操作系統(tǒng)Oracle版本
Redo日志組成數(shù)據(jù)頭redo record
一個(gè)redo record記錄包括Redo記錄臺(tái)一個(gè)或多個(gè)改變向量
每個(gè)redo record包含每個(gè)原子改變的undo和redo
某些改動(dòng)不需要undo(臨時(shí)表,直接加載...)redo log是Oracle中極其重要的組件,它的目的在于保證數(shù)據(jù)的安全性redo log的丟失可能導(dǎo)致數(shù)據(jù)庫中數(shù)據(jù)的丟失應(yīng)該講Oracle至于歸檔模式下
參考:
Oracle官網(wǎng)-Using LogMiner to Analyze Redo Log Files
cnblogs-LogMiner配置使用手冊(cè)
用途對(duì)Oracle在線redo和歸檔日志進(jìn)行分析