2008年1月4日 星期五

Oracle Redo、Undo及Rollback Segment觀念

記得剛接觸Oracle時,只是把他當作應用程式儲存資料的地方,所以那時候和DBA溝通時,聽他們在講什麼Redo、Undo、Rollback Segment也是常常搞混,最近有朋友剛開始玩Oracle,環境中有7.x~10g都有,所以被搞的頭昏腦脹,只好打電話問我..我是這樣回答的:

Redo就是重作,當我們使用DML指令(Update、Delete、Insert)對資料進行修改後,Oracle會將我們對資料修改的操作及資料本身寫入Redo Log Buffer,Oracle會找適當的時機(*註1)將Redo Log Buffer內的東西寫入Redo Log Files,由於Redo Log Files是循環寫入的,所以在異動頻繁的狀態下會很快被蓋掉,如果想要將這些異動的記錄保留下來,就請開啟Oracle Archiving Mode,這樣Oracle作Log Switch時,就會將Redo Log Files內容另存一份成為Archive Log Files

Undo就是取消之前作的,8i以前(含8i)的Rollback Segment,在9i改叫Undo Segment;當我們進行交易時,Oracle會利用Undo Segment來存放異動前後的資料,在交易未Commit前,其他使用者可以在這裡查詢舊資料,如果交易失敗或取消,Oracle就可以很快的將由回復原先的資料,在9i提供了Flashback Query可以讓我們查詢交易Commit以前的資料(能查多久以前的資料?看Undo Tablespace有多大、UNDO_RETENTION設多少),到了10g,我們甚至可以回復已經Commit的交易(利用Flashback Query中的Undo SQL指令)。

註1.所謂適當時機就是:

  • 交易確認時
  • Redo Log Buffer的資料異動量放超過整個Buffer的1/3
  • Redo Log Buffer的資料異動量超過1MB
  • 當DBWR將異動的Data Block從Data Buffer Cache寫入Data Files之前

沒有留言: