zoukankan      html  css  js  c++  java
  • oracle的undo表空间

    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.

  • 相关阅读:
    zeromq学习记录(五)vc下多线程
    zeromq学习记录(七)订阅发布消息封装
    Mozilla研究—从输入URL到显示内容的基本过程
    Mozilla研究—深入理解mozilla所需的背景知识
    Mozilla研究—组件加载机制
    Mozilla研究—传输协议
    Mozilla研究—mozilla中的设计亮点
    GTK+主循环(main loop)的工作原理
    Mozilla研究—mozilla能为我们做什么
    Mozilla研究—组件的创建过程
  • 原文地址:https://www.cnblogs.com/qinjf/p/8379472.html
Copyright © 2011-2022 走看看