[Oracle]理解undo表空間

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是一個動態參數,直接修改便可,無需重啓實例,切換方式以下:

12:40:16 SQL> show parameter undo_tablespace --【窗口1】查看當前undo表空間 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_tablespace string UNDOTBS1 12:45:59 SQL> insert into dept values(50,'a','b'); --【窗口1】執行一條insert語句,且不提交 1 row inserted SQL> alter system set undo_tablespace = UNDOTNS2; --【窗口2】切換undo表空間 System altered SQL> show parameter undo_tablespace; --【窗口2】查看新的表空間 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_tablespace string UNDOTNS2 SQL> drop tablespace undotbs1 including contents and datafiles; --【窗口2】刪除舊的表空間,報錯,提示舊的表空間正在使用 ORA-30013: undo tablespace 'UNDOTBS1' is currently in use 12:53:02 SQL> commit; --【窗口1】提交事務 SQL> drop tablespace undotbs1 including contents and datafiles; --【窗口2】過一段時間以後,成功刪除 Tablespace dropped
複製代碼

 

(5)回退信息保留時間

前面咱們講了回退信息的4個做用,當咱們提交了事務以後,回退信息對於事務回滾以及數據庫恢復已經再也不起做用。可是,對於一個長事務而言,具備讀一致性的做用,保證查詢到的信息一直是舊的信息。此外,數據庫的各類閃回操做的實現也須要回退段中的信息。Oracle根據undo表空間的大小以及事物量的多少自動調整回退信息的保留時間,可經過調整初始化參數undo_retention設置回退信息在回退段中的保留時間:

SET UNDO_RETENTION = 1800 ;

須要注意的是,undo_retention是Oracle的一個」軟設置「,這個」軟設置「如何理解呢?例如,當用戶將UNDO_RETENTION參數設置爲1800s後,Oracle會儘可能的將回退信息保存1800s,可是,在這個過程當中,若是回退表空間不夠用了,新的回退信息依然會將未達到1800s的回退信息覆蓋。

爲了保證長時間的查詢的讀一致性以及各類閃回操做,咱們也能夠指定回退信息必須保留到undo_retention規定的時間,經過啓用undo表空間的retention guarantee特性,保證只有過時(已提交且達到undo_retention設定的值)的數據纔會被覆蓋,即便undo表空間容量已經不足,也不會覆蓋未過時的回退信息。

ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;

 

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表空間中回退信息的當前狀態

select tablespace_name,segment_name,extent_id,status from dba_undo_extents; TABLESPACE_NAME SEGMENT_NAME EXTENT_ID STATUS ------------------------------ ------------------------------ ---------- --------- UNDOTBS3 _SYSSMU10_968665341$ 0 UNEXPIRED UNDOTBS3 _SYSSMU10_968665341$ 1 EXPIRED UNDOTBS3 _SYSSMU9_3484649867$ 0 UNEXPIRED UNDOTBS3 _SYSSMU9_3484649867$ 1 EXPIRED ... ... ... ...
複製代碼

undo表空間中區的狀態一共有3種:EXPIRED、UNEXPIRED、ACTIVE。

--EXPIRED:表示該回退信息對應的事務已經提交,保存時間超過保留區;

--UNEXPIRED:表示該回退信息對應的事務已經提交,保存時間沒有超過保留區

--ACTIVE:表示回退信息對應的事務尚未提交,該區還在使用;

相關文章
相關標籤/搜索