undo表空间概述-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 1774467
  • 博文数量: 413
  • 博客积分: 8399
  • 博客等级: 中将
  • 技术积分: 4325
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-09 10:44
文章分类

全部博文(413)

文章存档

2015年(1)

2014年(18)

2013年(39)

2012年(163)

2011年(192)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: oracle

2012-10-25 16:49:39

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;
       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 _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
---------- ---------- ---------
         0      65536 expired
         1      65536 expired
         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.
阅读(18757) | 评论(0) | 转发(3) |
0

上一篇:

下一篇:undo与事务剖析

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图