checkpoint為了保證數據一致性,在下面情況下觸發寫事件:
a 手工checkpoint,alter system checkpoint
b alter tablespace offline/begin backup;
c 正常shutdown數據庫
寫事件就是它會將數據文件頭和控制文件中寫入同一個id,以便於在數據庫打開時,通過id知道數據庫是否需要恢復
而commit只是當數據提交后,觸發將redo buffer寫入redo file的事件,從而能在恢復時用到日志文件內容
各種后台進程的作用:
Ckpt、lgwr、dbwn之間的協作。
Ckpt:每隔3秒或更頻繁寫一次,寫入控制文件,記錄DBWN從SGA寫入磁盤的塊的位置。
LGWR:每3秒,1/3滿buffer,commit,DBWN寫之前。將buffer中數據寫入物理文件。
DBWN:將SGA中臟塊寫入datafile。
Oracle 寫入數據過程:
Oracle 寫數據過程:dml操作一執行,首先在redo buffer中記錄語句,在buffer cache中執行更改,修改數據塊。然后LGWR進程根據上述規則,將redo buffer中的信息寫入到物理文件。此過程比較快(redo log為連續寫)。完成后,DBWN會將buffer cache中臟數據塊對應的原始數據,復制到undo表空間,然后更新數據。(隨機寫,比較慢)。期間ckpt進程根據3秒的原則,作檢查點,記錄哪些臟 數據庫寫到了data file中(這里的檢查點為增量檢查點,並不是完全將臟數據寫完,只是在控制文件中記錄寫到哪里了。)。將需要的信息記錄在控制文件中。若實例崩潰或需要 錯誤恢復,從檢查點位置以后的redo需要重新應用到datafile(常說的redo過程,前滾)。此時根據事務是否提交了,未提交的事務,根據 undo表空間的數據進行恢復(常說的undo,后滾操作)
另一位網友的介紹:
1、事務開始;
2、在buffer cache中找到需要的數據塊,如果沒有找到,則從數據文件中載入buffer cache中;
3、事務修改buffer cache的數據塊,該數據被標識為“臟數據”,並被寫入log buffer中;
4、事務提交,LGWR進程將log buffer中的“臟數據”寫入redo log file中;
5、當發生checkpoint,CKPT進程更新所有數據文件的文件頭中的信息,DBWn進程則負責將Buffer Cache中的臟數據寫入到數據文件中。
附:checkpoint 由ckpt進程觸發oracle進行checkpoint動作,將data buffer中的臟塊(已經寫在redo里記錄但是沒有寫到datafile里的)的內容寫入到data file里並釋放站用的空間,由dbw后台進程完成,並修改controlfile和datafile的scn.
一般手工執行(alter system checkpoint)是由於要刪除某個日志但是該日志里還有沒有同步到data file里的內容,就需要手工check point來同步數據,然后就可以drop logfile group n.
DBWn負責將臟塊寫入磁盤的后台進程。
DBWn會把塊寫出到所有磁盤,即分散在各個磁盤上,也就是說,DBWn會做大量的分散寫(scattered write);
LGWR則是向重做日志完成大量的順序寫(sequential write)。
從理論上講,如果提交期間Oracle已經將已修改的塊物理地寫出到磁盤,就可以跳過寫在線重做日志文件。但實際上,提交期間,只是由LGWR會把每個事務的重做信息寫至在線重做日志,DBWn則在后台將數據庫塊刷新輸出到磁盤。
這么做的原因就是分散寫比順序寫慢多了。DBWn 在后台完成它的任務(很慢),而LGWR在用戶提交后等待時完成自己的任務(這個任務比較快),就能得到更好的整體性能。盡管從技術上講這樣會使Oracle執行更多不必要的I/O(寫日志以及寫數據文件)。
The DBWn process writes dirty buffers to disk under the following conditions:
1、 When a server process cannot find a clean reusable buffer after scanning a threshold number of buffers, it signals DBWn to write.
DBWn writes dirty buffers to disk asynchronously if possible while performing other processing.
2、 DBWn periodically writes buffers to advance the checkpoint,
which is the position in the redo thread from which instance recovery begins (see "Overview of Checkpoints").
The log position of the checkpoint is determined by the oldest dirty buffer in the buffer cache.
關於Oracle SGA中內存塊,后台進程,相關文件的截圖介紹: