1、回退段介紹數據庫
在Oracle數據庫中,當某個事物對數據進行修改時,Oracle首先將數據的原始值保存到一個回退段中。一個事物只能將它的回退信息保存到一個回退段中,而多個並行事物可使用同一個回退段。oracle
(1)回退段的做用app
回退段主要有4個做用,分別是:事物回滾、數據庫恢復、讀一致性、閃回查詢。性能
--事物回滾:當事物執行失敗或用戶執行回滾操做(rollback)時,Oracle會利用保存在回退段中的信息將數據恢復到原來的值;this
--數據庫恢復:當數據庫實例運行失敗,在數據庫重啓恢復時,Oracle先利用重作日誌文件的信息對數據庫進行恢復(包括已提交和未提交的事務),再利用回滾段中的信息回滾未提交的事務;spa
--讀一致性:當一個用戶對數據進行修改時,會預先將其原始值保存到回退段中,這時,若是有其它用戶訪問該數據,則訪問回退段中的信息,使當前用戶未提交的修改其餘用戶沒法看到,保證了數據的一致性;日誌
--閃回查詢:經過保留在回退段中的信息,用戶能夠查詢某個數據在過去某個時刻的狀態code
(2)回退段的工做方式對象
當事務開始時,系統分配給該事物一個回退段,在事務的整個生命週期中,當數據發生改變時,數據的原始值被複制到回退段中。回退段採用循環寫的方式進行工做,當事務寫滿回退段的一個區以後,會接着寫入回退段的下一個區,當全部的區都寫滿後,事務開始循環寫入到第一個區或者分配新的區(datafile爲autoextend)。回退段歸用戶sys全部,每一個回退段至少包含2個區。blog
2、回退表空間的管理
(1)建立undo表空間
在Oracle 11g中,建立undo tablespace有2種方法,一種是在建立數據庫時建立undo tablespace,另外一種是使用create undo tablespace來建立undo tablespace。undo tablespace用來保存事務的回退信息,用戶不能在其中建立數據庫對象。
咱們這裏介紹如何使用craete undo tablespace 來建立undo表空間。
--爲undo tablespace添加新的數據文件 alter tablespace undotbs1 add datafile '/home/app/oracle/oradata/orcl/untbs02.dbf' size 50M; --將undo tablespace裏面的untbs02.dbf文件擴充爲100M alter database datafile '/home/app/oracle/oradata/orcl/untbs02.dbf' resize 100M;
(3)刪除undo表空間
與普通表空間同樣,可使用drop tablespace來刪除undo表空間,可是不能刪除當前正在使用的undo表空間。若是在undo表空間中含有任何未提交的事務的回退信息,則不能使用drop tablespace來刪除表空間。此外,即便已經使用drop tablespace刪除了undo表空間,在該表空間中也可能存在未過時的回退信息,這樣致使某些查詢所需的回退信息丟失。所以,在刪除時應該注意,不要刪除這樣的undo表空間。
(4)切換undo表空間
在數據庫運行過程當中,能夠從一個undo表空間切換到另外一個undo表空間,因爲初始化參數undo_tablespace是一個動態參數,直接修改便可,無需重啓實例,切換方式以下:
(5)回退信息保留時間
前面咱們講了回退信息的4個做用,當咱們提交了事務以後,回退信息對於事務回滾以及數據庫恢復已經再也不起做用。可是,對於一個長事務而言,具備讀一致性的做用,保證查詢到的信息一直是舊的信息。此外,數據庫的各類閃回操做的實現也須要回退段中的信息。Oracle根據undo表空間的大小以及事物量的多少自動調整回退信息的保留時間,可經過調整初始化參數undo_retention設置回退信息在回退段中的保留時間:
須要注意的是,undo_retention是Oracle的一個」軟設置「,這個」軟設置「如何理解呢?例如,當用戶將UNDO_RETENTION參數設置爲1800s後,Oracle會儘可能的將回退信息保存1800s,可是,在這個過程當中,若是回退表空間不夠用了,新的回退信息依然會將未達到1800s的回退信息覆蓋。
爲了保證長時間的查詢的讀一致性以及各類閃回操做,咱們也能夠指定回退信息必須保留到undo_retention規定的時間,經過啓用undo表空間的retention guarantee特性,保證只有過時(已提交且達到undo_retention設定的值)的數據纔會被覆蓋,即便undo表空間容量已經不足,也不會覆蓋未過時的回退信息。
3、查詢undo表空間
與undo表空間相關的數據字典以下:
數據字典 | 解釋 |
v$undostat | 包含全部undo表空間的統計信息,用於對undo表空間進行監控和調整。 經過該視圖,能夠估計當前undo表空間的大小,Oracle利用該視圖完成對回退信息的自動管理,該視圖數據是有最近4天內,每10分鐘產生一條統計記錄構成的。 |
v$rollstat | 包含undo表空間中回退段的性能統計信息 |
v$transaction | 包含事務所使用的回退段信息 |
dba_undo_extents | 包含undo表空間中區的大小與狀態信息 |
dba_hist_undostat | 包含v$undostat的快照,主要是4天前的統計信息 |
例子三、查詢undo表空間中回退信息的當前狀態
undo表空間中區的狀態一共有3種:EXPIRED、UNEXPIRED、ACTIVE。
--EXPIRED:表示該回退信息對應的事務已經提交,保存時間超過保留區;
--UNEXPIRED:表示該回退信息對應的事務已經提交,保存時間沒有超過保留區;
--ACTIVE:表示回退信息對應的事務尚未提交,該區還在使用;