undo表空间概述

小鱼儿 2022-07-16 15:19 324阅读 0赞

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 UNDOTBS1

SQL> 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 ;

  1. USN NAME

-————- ———————————————

  1. 0 SYSTEM
  2. 1 \_SYSSMU1$
  3. 2 \_SYSSMU2$
  4. 3 \_SYSSMU3$
  5. 4 \_SYSSMU4$
  6. 5 \_SYSSMU5$
  7. 6 \_SYSSMU6$
  8. 7 \_SYSSMU7$
  9. 8 \_SYSSMU8$
  10. 9 \_SYSSMU9$
  11. 10 \_SYSSMU10$
  12. 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

-——————————————-

USERS

SYSAUX

UNDOTBS1

SYSTEM

EXAMPLE

根据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 AUTO

undo_retention integer 900

undo_tablespace string UNDOTBS1

undo表空间的作用:

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

-————- ————— ————-

  1. 0 65536 EXPIRED
  2. 1 65536 EXPIRED
  3. 2 1048576 EXPIRED

free: 区没有被使用;

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 APPLY

UNDOTBS1 NOGUARANTEE

SYSAUX NOT APPLY

TEMP NOT APPLY

USERS NOT APPLY

EXAMPLE NOT APPLY

6 rows selected.

发表评论

表情:
评论列表 (有 0 条评论,324人围观)

还没有评论,来说两句吧...

相关阅读