<<感謝Anne的鼓舞,不然我可能還只是懂Oracle SQL面>>
 
當使用者執行UPDATE命令,Oracle會依序做如下的動作:                                                               
(1)Oracle會先找出欲被更改的資料列的Data Block,如果該 Data Block並不存在記億體中的快取,會從Disk找出,並復製至資料
   庫緩衝快取(database buffer cache)。                                                                           
                                                                                                                 
(2)接者再將Redo Data寫入日誌緩衝區(log buffer)。Redo Log內會記錄像Redo Byte Address(RBA)、Database Block Address 
   (DBA)、Undo Block Address(UBA)等等‧                                                                          
                                                                                                                 
(3)Oracle將Undo Data寫入復舊區段(Undo Tablespace裡的某個Undo Segment)。                                          
                                                                                                                 
(4)Oracle將欲更改的新值寫入Data Block(記憶體中的)。                                                              
                                                                                                                 
(5)如果在改變中,有其他使用者在執行查詢,而且剛好查到這剛被更改的資料列但又尚未被COMMIT,此時 Oracle會把這使用者導
   至復舊區段(Undo Segment)。                                                                                    
                                                                                                                 
(6)當使用者UPDATE完後,下達COMMIT命令後。 Oracle會以近乎即時的方式,將日誌緩衝區(log buffer)的資料寫入線上重作日誌
   檔(online redo log files),但此時DBWn不見得會同步將已被改變的Data Block(或稱為Dirty Block)寫入至Data File,因為
   DBWn 會依最佳效率的演算法去做判斷,何時才將Dirty Block寫入Data File。如果此時伺服器當掉(或Instance當掉),Oracle
   的SMON 會從線上重作日誌檔(online redo log files)最近一次的Checkpoint位置,依序逐一做Rolling Forward(Redo),以便
   在Instance開起來,將相關資料修成正確的。                                                                      
                                                                                                                 
   相同地,有時DBWn的演算法會造成尚未COMMIT的Data Block寫入至Data File,如果此時伺服器當掉(或Instance當掉)。Oracle
   的SMON會從復舊區段(Undo Tablespace裡的某個Undo Segment)發現該資料尚未被COMMIT,但Data File裡的Data Block 內的資
   料列卻已經被更改,此時Oracle會從復舊區段找出Undo Data去修正此一問題‧為什麼Oracle可以從復舊找出未COMMIT的交易,
   因為Oracle會確保該交易COMMIT或ROLLBACK前,該復舊資料空間都不能被回收覆寫‧ 簡單來說復舊資料會被區分成二種:「作
   用中復舊」是倒回進行中交易所需要的復舊資料,在交易完成前,此資料絕不會被覆寫‧ 「已過期復舊」是已提交(Commit)之
   交易的復舊資料‧                                                                                              
                                                                                                                 
arrow
arrow
    全站熱搜

    香 香蕉皮 發表在 痞客邦 留言(0) 人氣()