天天看點

undo和 redo

Redo:重做日志檔案,用于前滾資料恢複資料

Undo:恢複事務,取消一條或一組語句

通常對undo有一個誤解,認為undo用 于資料庫實體地恢複到執行語句或事務之前的樣子,但實際上并非如此。資料庫隻是邏輯地恢複到原來的樣子,所有修改都被邏輯地取消,但是資料結構以及資料庫 塊本身在復原後可能大不相同。(比如一個插入操作,新配置設定了一些資料塊。後來事務失敗,插入操作全部復原,新配置設定的一些資料塊還是存在的)

例如,假設我們的事務執行了一個INSERT語句,這條語句導緻配置設定一個新區段(也就是說,導緻表的空間增大)。通過執行這個INSET,我們将得到一個新的塊,格式化這個塊以便使用,并在其中放上一些資料。此時,可能出現另外某個事務,它也向這個塊中插入資料。如果要復原我們的事務,顯然不能取消對這個塊的格式化和空間配置設定。是以,Oracle復原時,它實際上會做與先前邏輯上相反的工作。對于每個INSERT,Oracle會完成一個DELETE。對于每個DELETE,Oracle會執行一個INSERT。對于每個UPDATE,Oracle則會執行一個“反UPDATE“,或者執行另一個UPDATE将修改前的行放回去。

  是以有一種異常情況就很容易解釋了,一個表明明隻有1000行左右的資料,一條select * from table 語句可能需要耗時1,2分鐘。這張表應該是經常進行新增删除操作的表,比如我新增了1000萬行資料,然後又将這些資料删除。對這個表進行全表掃描的時候,仍然會去掃描這1000萬行以前所占用的那些資料塊,看看裡面是否包含資料。也就是oracle裡面所說的高水準線(HWM),這些資料塊都增加到了高水準線下面,oracle會掃描所有高水準線下的資料塊。