深入淺出-redo和undo記載01

dotaddjj發表於2011-12-19

Redoundo可以說是oracle例項回滾和事務一致性的重要依據,好在自己對於oracle的這兩個理解比shared pool理解透徹,結合eygle的深入淺出這兩章再次回味一下redoundo的特性!

Redo用於記錄資料庫的改變,redo特性有三個元件:redo log buffer重做日誌快取 lgwr後臺程式用於把redo log buffer寫入diskredo log file(歸檔模式下arcn用於把寫滿的redo log file歸檔到歸檔日誌下),redo中記錄資料庫的改變的資訊以重做條目redo entries形式儲存(又稱redo records),redo entrie包含資料庫改變的資訊,其中有insert updatedmlalter grantddl等。

Redo entries內容被oracle資料庫程式從使用者記憶體空間複製到sga中的redo log buffer之中,redo entriessga中佔用連續順序空間,後臺程式lgwr不斷把redo log buffer寫入到disk上。

其實經常說資料庫效能,sql的效能,更多的是I/O消耗,cpu解析和network,一個事務的結束後,oracle並不會把相應的dirty buffer直接寫到disk上去,而是採取的redo的形式記錄了這個事務的所有過程,而後在資料庫例項異常關閉再次啟動時,oracle會利用redo log file的重做條目前滾來恢復沒有寫入disk上的資料。Oracle引入redo機制,透過連續的 順序的日誌條目的寫到redo log file中用於“推遲”dirty buffer的分散寫入(dirty buffer寫入會分散到各資料檔案),當修改過資料達到一致數量後再次搞笑批次寫入dirty bufferdisk提高效能。

blog中記錄了關於checkpointcheckpoint檢查點事件用於減少恢復時間,oracle會通知dbwr程式把checkpoint scn之前的dirty buffer寫入diskcheckpoint完成後ckpt程式會相應地更新controlfiledbf的檔案頭,記錄檢查點資訊,例項崩潰後的恢復的過程也就是 low cache rba on disk rbarba在資料檔案也會記錄。

Oracle利用redo順序 快速將redo log buffer寫出到redo log,除了順序 快速寫出還因為redo所記錄的精簡內容有關。

改變向量change vector

改變向量標識對資料庫內某一個資料塊所做的一次變更。包含了變更的資料塊版本號,事務操作程式碼,變更從屬資料塊地址dba以及更新後的資料

重做記錄redo record

重做記錄通常由一組改變向量組成,是一個改變向量集合,構成資料庫變更的最小恢復單位。

update test01 set id=45 where id=78

(1) 查詢buffer cache中是否有相應資料塊,有則直接讀取,沒有則從disk上讀取到buffer cache中再讀取(可能還需要從回滾段中獲取回滾段而構造一致性讀取cr塊)

(2) 從回滾表空間的相應回滾段事務表上分配事務槽,需要記錄redo

(3) 從回滾段讀入或者在buffer cache中建立前映象,產生redo

(4) 修改相應資料塊,update資料變更,記錄redo

(5) 使用者commit,修改相應回滾段事務表為非啟用inactive,在redo log buffer記錄提交資訊

同樣可以dump log日誌來檢視事務的過程中redo所記錄的具體資訊

alter system dump logfile 'E:ORACLEPRODUCT10.2.0oradatatestredo03.log'

那麼如何查詢sql語句執行過程中產生了的redo,利用sql*plusautotrace或者利用v$mystat等統計檢視

SQL> set autotrace trace statistic;

SQL> insert into test01 select * from test01 where rownum<4;

已建立3行。

統計資訊

----------------------------------------------------------

0 recursive calls

5 db block gets

4 consistent gets

0 physical reads

600 redo size

667 bytes sent via SQL*Net to client

590 bytes received via SQL*Net from client

4 SQL*Net roundtrips to/from client

1 sorts (memory)

0 sorts (disk)

3 rows processed

利用下列sql語句在sql語句執行前後取差值即為此session產生的redo

select name, value

from v$mystat a, v$statname b

where a.statistic# = b.statistic#

and b.name = 'redo size'

同樣可以利用v$archived_log計算平均每天產生的歸檔redo log大小

Select trunc(completion_time),sum(blocks*block_size)/1024/1024 mb from v$archived_log group by trunc(completion_time)

TRUNC(COMPLETION_TIME) MB

---------------------- ----------

2011/10/4 20.4467773

2011/10/15 43.2182617

2011/11/16 18.5463867

2011/9/28 15.8808593

2011/10/3 4.26464843

2011/10/13 839.439941

2011/10/24 32.9848632

2011/10/30 24.1342773

2011/11/4 20.5214843

2011/11/8 11.9272460

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1056879/,如需轉載,請註明出處,否則將追究法律責任。

相關文章