undo表空间只做一件事:保存旧值。在AUM下,段是自动生成,区是自动分配与回收,且是不连续的。每个段至少有2个区。oracle自动使用undo段,在某种意义上,我们只要关注undo表空间的大小就可以了。
查询当前哪个undo表空间被激活:
sys@ORCL> show parameter undo_tablespace NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_tablespace string UNDOTBS1
查询undo表空间里面有多少个数据文件:
sys@ORCL> col file_name for a72 sys@ORCL> select file_name,bytes/1024/1024 m from dba_data_files where tablespace_name like '%UNDOTBS%'; FILE_NAME M ------------------------------------------------------------------------ ---------- /u01/app/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_8050fkc6_.dbf 100 /u01/app/oracle/oradata/ORCL/datafile/thinkundo.dbf 30
查询undo表空间里面在线有多少个段:
sys@ORCL> 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 rows selected.
查询段有多少个区和块:
sys@ORCL> select segment_name,extents,blocks from dba_segments where segment_name='_SYSSMU3$'; SEGMENT_NAME EXTENTS BLOCKS --------------- ---------- ---------- _SYSSMU3$ 17 256
查询区有多少个块:
sys@ORCL> select file_id,tablespace_name,segment_name,extent_id,block_id,blocks from dba_extents where 2 segment_name='_SYSSMU3$'; FILE_ID TABLESPACE_NAME SEGMENT_NAME EXTENT_ID BLOCK_ID BLOCKS ---------- ------------------------------ --------------- ---------- ---------- ---------- 2 UNDOTBS1 _SYSSMU3$ 0 41 8 2 UNDOTBS1 _SYSSMU3$ 1 49 8 2 UNDOTBS1 _SYSSMU3$ 2 17 8 2 UNDOTBS1 _SYSSMU3$ 3 33 8 2 UNDOTBS1 _SYSSMU3$ 4 161 8 2 UNDOTBS1 _SYSSMU3$ 5 169 8 2 UNDOTBS1 _SYSSMU3$ 6 177 8 2 UNDOTBS1 _SYSSMU3$ 7 185 8 2 UNDOTBS1 _SYSSMU3$ 8 201 8 2 UNDOTBS1 _SYSSMU3$ 9 209 8 2 UNDOTBS1 _SYSSMU3$ 10 217 8 2 UNDOTBS1 _SYSSMU3$ 11 225 8 2 UNDOTBS1 _SYSSMU3$ 12 233 8 2 UNDOTBS1 _SYSSMU3$ 13 241 8 2 UNDOTBS1 _SYSSMU3$ 14 249 8 2 UNDOTBS1 _SYSSMU3$ 15 257 8 7 UNDOTBS1 _SYSSMU3$ 16 521 128 17 rows selected.
从这里我们也可以看出,undo段中的区的分配是不连续的。
undo段中区的状态:
1)free:没有分配给任何一个段
2)active:区中有事务没有提交
3)inactive:区中的事务提交了
4)expired:事务提交而且达到了undo_retention
注:我们可以通过设定undo_retention来保住inactive的区,若没有free,则自动扩展;若扩展不了,则优先使用expired;若还不够,则就会使用inactive,但如果此时retention是guarantee保证的,则无法使用inactive,会报ORA-30036.
sys@ORCL> select extent_id,bytes,status from dba_undo_extents where segment_name='_SYSSMU3$'; EXTENT_ID BYTES STATUS ---------- ---------- --------- 0 65536 EXPIRED 1 65536 EXPIRED 2 65536 EXPIRED 3 65536 EXPIRED 4 65536 EXPIRED 5 65536 EXPIRED 6 65536 EXPIRED 7 65536 EXPIRED 8 65536 EXPIRED 9 65536 EXPIRED 10 65536 EXPIRED 11 65536 EXPIRED 12 65536 EXPIRED 13 65536 EXPIRED 14 65536 EXPIRED 15 65536 EXPIRED 16 1048576 EXPIRED 17 rows selected.
undo段上默认只有一个事务,当有多个事务时,会优先选择空闲的undo段,只有在没有了空闲undo段时,oracle才会选择在一个undo段上建立多个事务。