undo表空間概述
2024-07-21 02:52:04
供稿:網友
undo表空間是Oracle特有的概念。undo表空間中會自動分配undo段,這些undo段用來保存事務中的DML語句的undo信息,也就是來保存數據在被修改之前的值。在rollback,實例恢復(前滾),一致性讀CR塊的構造時會使用到undo信息。由于undo的引入,從而Oracle的select語句實現一致性讀時,不需要任何鎖。undo表空間和其它表空間有很多類似的地方:undo數據塊也會被讀到buffer cache緩存起來,修改時也會產生redo log,數據也會寫回到undo表空間的磁盤上。所以崩潰后,undo塊的buffer cache也會恢復過來。我們看一下undo表空間:SQL> show parameter undo_tablespace;NAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_tablespace string UNDOTBS1SQL> select file_name,bytes/1024/1024 size_M from dba_data_files where tablespace_name='UNDOTBS1';FILE_NAME SIZE_M---------------------------------------------- ----------/u01/app/oracle/oradata/jiagulun/undotbs01.dbf 60系統中現有的undo段:SQL> select * from v$rollname; USN NAME---------- ------------------------------ 0 SYSTEM 1 _SYSSMU1$ 2 _SYSSMU2$ 3 _SYSSMU3$ 4 _SYSSMU4$ 5 _SYSSMU5$ 6 _SYSSMU6$ 7 _SYSSMU7$ 8 _SYSSMU8$ 9 _SYSSMU9$ 10 _SYSSMU10$ 11 _SYSSMU11$12 rows selected.注意:其中name=SYSTEM的undo段位于SYSTEM表空間,當涉及到對SYSTEM表空間修改時,使用的是上面name=SYSTEM的表空間。比如DDL語句使用的就是SYSTEM這個undo段。另外當我們的undo表空間UNDOTBS1損壞了時,也會使用SYSTEM這個undo段。隨著系統的負載,undo段會根據需要自動增加。SQL> select tablespace_name from dba_data_files;TABLESPACE_NAME------------------------------USERSSYSAUXUNDOTBS1SYSTEMEXAMPLE根據undo段的名字來查看段的信息:SQL> select segment_name,blocks,extents from dba_segments where segment_name='_SYSSMU1$';SEGMENT_NAME BLOCKS EXTENTS------------ ---------- ----------_SYSSMU1$ 144 3可見undo段_SYSSMU1$分配了3個區,144個block.下面我具體查看三個區的信息:SQL> select segment_name,tablespace_name,extent_id,file_id,block_id,blocks from dba_extents where segment_name='_SYSSMU1$';SEGMENT_NAME TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS------------ ------------------------------ ---------- ---------- ---------- ----------_SYSSMU1$ UNDOTBS1 0 2 9 8_SYSSMU1$ UNDOTBS1 1 2 129 8_SYSSMU1$ UNDOTBS1 2 2 1033 128可見_SYSSMU1$段的第一個區占用了從第9好block開始的8個block;已經從129號block開始的8個block;已經從1033號block開始的128個block.從而我們知道:段與段之間是不連續的,而段內部的block是連續的。從Oracle9i開始,undo表空間是自動管理,undo中的段、區等都是自動分配自動釋放的,我只需要保證undo表空間有足夠的大小。SQL> show parameter undo;NAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_management string AUTOundo_retention integer 900undo_tablespace string UNDOTBS1undo表空間的作用:Oracle開始一個事務,當要修改數據時,會先將修改前的數據保存到undo表空間的undo段中。保存這些修改前的數據的原因下面這些場合需要undo數據:1)事務的回滾;2)實例恢復(回滾);3)一致性讀時需要構造CR塊;undo段中區的狀態:SQL> select extent_id,bytes,status from dba_undo_extents where segment_name='_SYSSMU1$'; EXTENT_ID BYTES STATUS---------- ---------- --------- 0 65536 EXPIRED 1 65536 EXPIRED 2 1048576 EXPIREDfree: 區沒有被使用;active: 區中的undo信息對應的事務沒有提交;inactive: 對應的事務已經提交;expired: 事務提交后,還沒有超過undo_retention秒; Oracle盡量回使用free的undo區,不夠再去擴充,再不夠會使用expired的undo區,Oracle原則上是不覆蓋inactive的區,但是當undo空間不夠時,也可能會使用inactive狀態的區;我們可以使用下面的命令來強制Oracle不能覆蓋inactive的區:alter tablespace undotbs1 retention guarantee (強制保證不覆蓋)alter tablespace undotbs1 retention noguarantee (不保證不被覆蓋)SQL> select tablespace_name,retention from dba_tablespaces;TABLESPACE_NAME RETENTION------------------------------ -----------SYSTEM NOT APPLYUNDOTBS1 NOGUARANTEESYSAUX NOT APPLYTEMP NOT APPLYUSERS NOT APPLYEXAMPLE NOT APPLY6 rows selected.