【場景】
當在更新資料的時候,發現更新的值寫錯了,這時就需要將已經更新的地方恢復到原始資料。
【基本概念】
在更新的過程中,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使用情況時...