普通表空间就是在表空间里面建立表,建立好表以后对应的就是段,建立段以后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
---------- ------------------------------
0 SYSTEM(这个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';
可以看到这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