undo系列学习之undo段及区的状态和使用概述

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段上建立多个事务。

你可能感兴趣的:(undo)