深入淺出-redo和undo記載01
Redo和undo可以說是oracle例項回滾和事務一致性的重要依據,好在自己對於oracle的這兩個理解比shared pool理解透徹,結合eygle的深入淺出這兩章再次回味一下redo和undo的特性!
Redo用於記錄資料庫的改變,redo特性有三個元件:redo log buffer重做日誌快取 lgwr後臺程式用於把redo log buffer寫入disk,redo log file(歸檔模式下arcn用於把寫滿的redo log file歸檔到歸檔日誌下),redo中記錄資料庫的改變的資訊以重做條目redo entries形式儲存(又稱redo records),redo entrie包含資料庫改變的資訊,其中有insert update的dml和alter grant的ddl等。
Redo entries內容被oracle資料庫程式從使用者記憶體空間複製到sga中的redo log buffer之中,redo entries在sga中佔用連續順序空間,後臺程式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 buffer到disk提高效能。
在blog中記錄了關於checkpoint,checkpoint檢查點事件用於減少恢復時間,oracle會通知dbwr程式把checkpoint scn之前的dirty buffer寫入disk,checkpoint完成後ckpt程式會相應地更新controlfile和dbf的檔案頭,記錄檢查點資訊,例項崩潰後的恢復的過程也就是 low cache rba到 on disk rba,rba在資料檔案也會記錄。
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*plus的autotrace或者利用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入淺出-redo和undo記載02
- 深入淺出redo和undo記載03
- 深入淺出undo記載01
- 深入淺出undo記載02
- 深入淺出undo記載03
- 深入淺出sga和pga章節記載-01
- 深入淺出buffer cache和shared pool記載01
- 深入理解MYSQL undo redoMySql
- 深入淺出等待事件和效能診斷記載03事件
- 深入淺出cache buffer和shared pool記載02
- 深入淺出buffer cache和shared pool記載03
- Redo 和 Undo 概念解析
- undo log和redo log
- oracle的redo和undoOracle
- 深入理解MySQL系列之redo log、undo log和binlogMySql
- redo和undo的區別
- oracle redo和undo系列一Oracle Redo
- 深入淺出負載均衡負載
- 淺析MySQL事務中的redo與undoMySql
- Oracle Redo and UndoOracle Redo
- 深入淺出等待事件和效能診斷01事件
- 【REDO】Oracle redo undo 學習Oracle Redo
- SQLServer的檢查點、redo和undoSQLServer
- MySQL中的redo log和undo logMySql
- MySQL Undo Log和Redo Log介紹MySql
- Oracle的redo 和undo的區別Oracle
- 深入淺出React和ReduxReactRedux
- UNDO REDO 區別
- 深入淺出FE(十四)深入淺出websocketWeb
- 關於Oracle的redo和undo的理解Oracle
- 深入淺出大端和小端
- 評侯捷的《深入淺出MFC》和李久進的《MFC深入淺出》
- 深入淺出記憶體馬(一)記憶體
- 深入淺出Java記憶體模型Java記憶體模型
- 深入淺出node讀書筆記筆記
- 《深入淺出MySQL》讀書筆記MySql筆記
- MySQL 日誌 undo | redoMySql
- 深入淺出:5G和HTTPHTTP