UNDO自我理解總結

2022-05-08 08:15:06 字數 2613 閱讀 3359

【場景】

當在更新資料的時候,發現更新的值寫錯了,這時就需要將已經更新的地方恢復到原始資料。

【基本概念】

在更新的過程中,oracle會將原始的資料都放入到undo裡,這樣當以上情況發生後,就可以從undo中拿到原本的資料了。

undo是在oracle 11g被提出的,由undo tablespace進行管理,常用「撤銷段」說明,用於進行撤銷操作

rollback是在oracle 9i出現的,存在於system表空間,常用「回滾段」說明,用於進行回滾操作

【區分】

-- 相同點:

撤銷段與回滾段都是用於恢復舊資料的,

-- 不同點:

-| 撤銷段是位於undo表空間下的,並且效能較優,資料塊較大

當使用的是undo表空間時,那麼undo_segment是auto的狀態

-| 回滾段是位於system表空間下的,效能較弱,資料塊也比較小

當使用的是system表空間下的rollback時,那麼rollback_segment是auto狀態,undo_segment是manual

【機制】

undo表空間是以乙個資料檔案(類似於undotbs.dbf)的格式存放在磁碟中的,但是它有一段undo segment是存放在了記憶體中

檢視undo資料檔案存放的位置:

select * from dba_data_files where tablespace_name like 'undo%

當執行update語句的時候:

1)首先,會在buffer cache裡找到undo segment相應的資料塊(如不存在,則建立資料塊),進行修改

2)然後,這個修改的操作,會記錄到redo log裡

3)當在寫磁碟的時候,會先把redo log /undo segment的檔案寫進去

4)當使用者commit後,dbwr會將修改的資料塊寫入undo的資料檔案裡

【update語句的詳細過程】

例如,執行以下的update語句:

當在執行一條更新語句的時候,例如:

--假設sal=3000,需要更新資料

update emp set sal = 4000 where empno = 02

1) 會先檢查empno=02是否在存在buffer cache裡,不存在則建立

==> 這一步是檢視之前empno是否被修改過,已經存在了快取中

2)在回滾段的事務表分配事務槽  ==> 這個操作會被記錄到redo log裡

3)從回滾段裡讀sal的資料或在buffer cache裡建立資料 sal = 3000 ==> 這個操作會被記錄到redo log裡

4)修改sal = 4000,資料變更,將此資料以及操作記入redo log裡

5)如果使用者操作提交(commit),會在redo log buffer裡記錄提交資訊,並在回滾段標記該事務為inactive

由以上的流程可以看出,在update操作時,就會用到undo的資源,並且也用到了redo的資源。

【dml操作的undo使用資源比較】

dml操作會使資料產生變化,這就需要用到undo來保證資料的一致性,但是每乙個dml操作,undo的使用都會不同。

-- insert 操作 

undo 要記錄到插入資料的rowid即可

-- update操作

undo要記錄被更新欄位的舊值即可

-- delete操作(資源使用最高,如果刪除的量很大,會造成堵塞。)

undo要記錄一整行完整的資料

-----to be continue ------

【擴充套件知識】

--  buffer cache的概念:

當有請求資料,cpu就要去讀取資料,如果直接從磁碟讀取(並且資料量很大),那麼會導致io過高,速度過慢。

為了解決這個問題,就產生了「中間站」 -- buffer cache(資料快取記憶體區)

所有請求的資料都會先寫入到「中間站」,再定時將資料更新到磁碟中,這樣就避免了點對點的壓力過大

-- 拆分開了的buffer 、 cache的概念:

buffer: 是還沒有被寫入disk

裡的資料

cache:已經被disk

讀,並且儲存至之後使用

-- undo塊的狀態: (undo_retention)

active(活動的):

未提交事務的undo資料,這些undo資料永遠不能覆蓋,用於回滾rollback事務。

inactive:表示該undo上沒有活動的事務,該狀態的undo可以被其他事務覆蓋。

expired(過期的):表示該undo持續inactive的時間超過undo_retention所指定的時間。

已提交事務的undo資料,這些undo資料可以覆蓋。

inexpired(未過期的): 事務已提交,但事務提交前,有些查詢正在進行,它要讀取的是提交前的資料,這部分資料就是未過期資料。

如果這部分undo資料被覆蓋了,就會發生ora-01555錯誤。

freed:表示該undo塊內容是空的,從來沒有被使用過

自我總結 20170804自我總結

昨天在工作了一年多的公司離職了。2016年6月27日入職九章雲極科技 到2017年8月3日。短短一年之內,自己從乙個新人混到了老員工,自己入職的時候才26個人,目前有80 預計下個月達到100人。自己也在公司內部經歷了轉崗。非常感謝能在畢業的時候,被越哥選中,慢慢的一年內學習了如何做資料整合,自己也...

理解UNDO 3 事務提交

從前面文章得知,當事務提交後會在資料塊中的itl該xid 標幟欄位flag 打上c,並在scn fcn欄位上打上自己提交的scn.如果說當乙個事務更新了1萬個塊,更新時間比如說30分鐘.這個時候會因為dbwr把被更新的資料塊寫回磁碟中.假如提交的時候已經有8千個塊寫入了磁碟.那麼做提交命令的時候,需...

UNDO相關問題總結(二)

這一次主題為單個session占用大量undo,導致資料庫效能急劇下降的問題總結。關於 問題現象 問題原因 引申現象 資料庫中出現大量latch undo global data 或者 wait for a undo record 相關的等待,但在當前例項中查詢每個session的undo使用情況時...