Oracle Undo的學習
Rollback是一個代價昂貴的操作,如果一個系統的事務回退率過高,應該檢查系統是否正常或者程式設計思路是否存在問題。查詢資料庫啟動依賴的事務回退率,如果發現太高,一定要引起重視。
--查詢回退率的sql
SELECT NAME, VALUE
FROM v$sysstat
WHERE NAME IN ('user commits', 'transaction rollbacks');
關於回滾段的資料,如果是delete操作,則回滾段將會記錄整個行的資料;如果是update,則只記錄被修改欄位變化前的資料(前映像);如果是insert,則只記錄插入記錄的rowid。所以,假如commit,那麼回滾段中簡單標記該事務已經提交;假如rollback,則操作是delete的話,把回滾段中的資料重新寫回資料塊,操作是update的話則把變化前的資料修改回去,操作是insert的話則根據rowid把該記錄刪除。這個過程是保障事務的完整性,保障資料不會丟失。
一致性讀(consisitent reads) Oralce的查詢集是根據時間點來判定的。Oracle內部透過系統改變號SC作為相對時間點的標準,任何對資料庫的改變都會產生SCN,對資料塊的資料改變的時候會把該改變所對應的SCN記錄在塊中。假設查詢開始的時候SCN為T,則在查詢所掃描的資料塊中,如果資料塊的COMMIT SCN小於T,則查詢接受該資料,如果COMMIT SCN大於T或者說還沒有產生COMMIT SCN,則查詢會嘗試去回滾段中查詢資料。這保證了資料的讀取時間點的一致性。
在透過回滾段中獲取資料的時候,本質上是把資料緩衝區中的資料塊做一個複製,然後將回滾段中記錄的內容恢復到該塊中,然後查詢使用這個塊來進行讀取。
系統回滾段和延遲迴滾段
SYSTEM回滾段是建立在系統表空間中,主要用於系統級的事務和分配普通事務於其他回滾段上。當手工建立資料後需要建立普通回滾段之前必須首先建立系統回滾段。按oracle文件說,當普通事務異常多的事情可能會使用系統回滾段的情況。正常情況下,系統回滾段主要用於兩個方面:一是系統事務,如針對資料字典的操作truncate table 和 drop table。如果truncate or drop table的過程中沒有成功,則系統會根據系統回滾段中的資料字典操作資訊對該DDL操作進行回退。另一個方面,就是延遲迴滾段(Deferred Rollback Segment)。延遲迴滾段表示,當我們使一個表空間OFFLINE之後,由於表空間不可用,這個時候若有事務資料位於該空間並執行回滾命令,在client看起來該事務已經回滾,但對於資料塊來說回滾並沒有真正完成,這個時候資料庫將該回滾資訊寫入系統回滾段(這就是延遲迴滾段),等表空間重新ONLINE的時候,資料塊從系統回滾段中將回滾資訊寫入表空間。
回退段的設定和管理
Oracle9i之前需要手動設定回退段,我們需要考慮如下問題:
1.系統併發事務數有多少
2.系統是否存在大查詢或者大事務,是否頻繁
3.能提供給系統回滾段的表空間的磁碟空間是多少
9i的UNDO TABLESPACE
從9i開始,推薦使用UNDO TABLESPACE,系統自動管理回滾段
Sql> show parameter undo
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
UNDO TABLESPACE變的很大,我們不能縮小,這個時候我們需要考慮建立新的UNDO TABLESPACE,然後換到新的表空間。這時即使UNDO表空間有事務也可以切換,只不過不能立即刪除該表空間,切換之後等到原來的表空間中所有的事務處理完畢,並且達到undo_retention的時間後,就可以drop原來的UNDO表空間。
SQL> alter system set undo_tablespace = undotbs02;
System altered.
切換了UNDO表空間後應該修改pfile或者spfile,使得下次啟動應用新的UNDO表空間。
回滾段著名的ORA-01555問題
從應用角度來看ORA-01555
1.查詢執行時間太長。首先是最佳化查詢,然後考慮在資料塊不繁忙的時候執行,最後考慮加大回滾段。
2.過渡頻繁的提交。把能夠成批提交的單條事務改成成批提交.
3.exp的時候使用consistent = y. 這個引數主要是為了保證在exp的時候使得所有的匯出的表在時間點上具有一致性,避免存在主外來鍵關係的表由於不同的時間點的不一致而破壞了資料的完整性。建議該操作在系統空閒的時候進行。
4.由於回滾段回縮導致回滾段還沒有迴圈使用的情況下就出現了回滾段中找不著資料的情況。只能加大回滾段增大optimal設定。
UNDO scripts
查詢資料塊當前某個session的事務所使用的回滾段大小
SELECT b.SID, a.xidusn, a.xidusn
FROM v$transaction a, v$session b
WHERE a.addr = b.taddr
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-686384/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [zt] Oracle Undo的學習Oracle
- 【REDO】Oracle redo undo 學習Oracle Redo
- undo 學習筆記一筆記
- 《Undo, Redo, DataFile看Oracle中的事務過程》學習筆記Oracle筆記
- 有關UNDO表空間的學習:
- Oracle Undo 的配置Oracle
- Oracle Undo的作用Oracle
- oracle的undo的作用Oracle
- 全面學習oracle flashback特性(2.2)--Flashback Table之從UNDO中恢復Oracle
- oracle的redo和undoOracle
- Oracle Redo and UndoOracle Redo
- Oracle undo 管理Oracle
- Oracle Undo SegmentOracle
- oracle undo管理Oracle
- oracle undo一Oracle
- 淺談Oracle的undo管理Oracle
- 關於oracle中的undoOracle
- oracle的undo的工作過程Oracle
- Oracle深入Undo探究Oracle
- Oracle UNDO引數Oracle
- oracle undo 使用分析Oracle
- Oracle In Memory Undo(IMU)Oracle
- Oracle In Memory Undo(轉)Oracle
- oracle undo系列(三)Oracle
- oracle undo系列(二)Oracle
- 關於oracle的undo_retentionOracle
- Oracle的redo 和undo的區別Oracle
- 學習oracle的度Oracle
- oracle FGA的學習Oracle
- Oracle OCP(48):UNDO TABLESPACEOracle
- oracle undo分配規則Oracle
- oracle undo 表空間Oracle
- Oracle undo管理詳解Oracle
- Oracle 10gr2的後的undoOracle 10g
- 關於Oracle的redo和undo的理解Oracle
- Oracle學習Oracle
- Oracle 12c 新特性 - 臨時表undo(TEMP UNDO)Oracle
- oracle的學習方法論Oracle