普通表空间就是在表空间里面建立表,建立好表以后对应的就是段,建立段以后oracle就会为其分配区,分配区以后段里面就有了空块,然后就可以在里面插入数据,当一个区分配完以后又借着分配另外一个区。

在oracle安装完成有一个默认的undo表空间,这个表空间在某种意义上来说和普通表空间相似,里面也是有redo段的,既然有段那么就有段,区,块。Undo表空间的undo段是自动生成的,自动有一堆undo段,里面的区是自动分配的。

Undo表空间和普通表空间不一样

(1)undo表空间里面的undo段是自动生成的,自动维护的。

(2)oracle自动使用undo段,我们在普通表空间的段是我们手工创建的,手工使用这个段,比如增删改查。但是对于undo表空间的回滚段是自动使用的。

Undo表空间里面有undo段,段是自动生成的,oracle自动使用undo表空间里面的undo段。从某种意义上来说只要保证undo表空间的空间大小就可以了。

SQL> show parameter undo_tablespace;

 

NAME      TYPE  VALUE

------------------------------------ ----------- ------------------------------

undo_tablespace      string  UNDOTBS1

 

SQL> select file_name,bytes/1024/1024 from dba_data_files where tablespace_name like 'UNDOTBS1';

 

FILE_NAME

--------------------------------------------------------------------------------

BYTES/1024/1024

---------------

/u01/oracle/oradata/undotbs01.dbf

     95

可以看到undo表空间不大,只有几十m。

SQL> select * from v$rollname;

 

       USN NAME

---------- ------------------------------

(这个undo段在系统表空间里面)

 1 _SYSSMU1_3724004606$

 2 _SYSSMU2_2996391332$

 3 _SYSSMU3_1723003836$

 4 _SYSSMU4_1254879796$

 5 _SYSSMU5_898567397$

 6 _SYSSMU6_1263032392$

 7 _SYSSMU7_2070203016$

 8 _SYSSMU8_517538920$

 9 _SYSSMU9_1650507775$

10 _SYSSMU10_1197734989$

 

11 rows selected.

可以看到undo表空间里面就有11个段,在undo表空间里面有很多回滚段。

 

Oracle数据库在正常运行期间使用的都是undo表空间里面的上面的11个段,随着oracle里面业务的增长,事务的增加,这11个段都可以自动的增加,即undo表空间里面的段是自动调整的。

在系统表空间里面的undo段叫system,什么时候oracle会使用这个回滚段呢?Oracle对数据字典进行操作的时候,比如建立一个表,这个表的信息比如有多少列,表名是什么。这些都得写到数据字典里面。写道到据字典就是写道系统表空间里面,对于数据库的对象进行增加或者删除的时候,这个时候需要操作oracle的数据字典,这个时候就会用到system表空间。只有对system操作的时候才会用到system的undo段。

还要一个地方可能会用到这个system段,就是undo表空间坏了,oracle可能会用到system段。Oracle为了防止undo表空间出现问题,数据库启动不起来或者没法使用,针对这种情况oracle在system里面还一直留着和少量使用的一个回滚段。

SQL>  select segment_name,blocks,extents from dba_segments where segment_name='SYSTEM';

 

SEGMENT_NAME

--------------------------------------------------------------------------------

    BLOCKS    EXTENTS

---------- ----------

SYSTEM

48     6

 

可以看到和普通表空间的段非常相似。

可以看看48个数据块占用了哪些区。

select segment_name,tablespace_name,extent_id,file_id,block_id,blocks from dba_extents where segment_name='SYSTEM';

Oracle undo表空间概述_sql

可以看到这6个段占三个区,一号区在一号文件的第128段,后面接着8个块。

从上面可以看到区和区之间不是连续的,在undo表空间里面一个段分配区的时候,是不连续的,因为里面有很多段。段中区中的块是连续的,但是段中的区和区之间是不连续的。

 

整个undo表空间都是自动管理的。只要给undo足够的空间,一切都是oracle自动管理的。在

 

在oracle 9i以前是手工管理的,oracle表空间是自动建立,undo段也是自动建立。但是undo段里面区的分配需要手动。一个undo段在使用过程当中如果用完了,需要手工给其分区,如果不及时的手工分区,那么使用undo段的那个事务就会挂起,这个会话就会死掉。如果运行比较大的事务的时候,在9i以前,经常会出现undo表空间里面的undo段不够用的情况。出现这种情况只能手动分配区,然后操作就失败了。(跑一个事务,批处理,跑了一上午,这个时候出现undo段不够了,那么这个操作就会失败,需要重新做)。

 

在oracle 9i以后,oracle表空间就是自动管理。自动管理和之前区别是undo表空间里面的undo段的区的分是自动的。空间不够给其自动分区,不够就加区。即自动管理undo表空间,undo表空间里面的undo段里面区的分配和释放都是自动的,只要给undo表空间足够空间就可以了。

SQL> show parameter undo;

 

NAME      TYPE  VALUE

------------------------------------ ----------- ------------------------------

undo_management      string  AUTO

undo_retention      integer  900

undo_tablespace      string  UNDOTBS1