oracle的undo表空间


一、undo是什么:
  1、原始修改之前的数据副本
    db buffer pool中的数据 修改后记录到 undo 表空间
    多次更改的数据副本多会记录
  2、针对更改事务处理而捕获
    事务级别的:只要commit就会写到undo(原子性)
  3、至少保留到事务处理结束
    还原数段段(extent)
      自动管理:
        先分配10个段(每个事务占用一个段)
        第11个事务进来时再分配1个(使用一个增加一个)
        事务结束undo段不会被马上回收(激活(正在使用),未过期(保留时间内,理论上不可以被覆盖,但是现实不一定),过期(可以被覆盖的)等状态)
    undo表空间不足:
      找之前用过的段,如果是事务已经结束了的,把之前undo段覆盖
      只要事务没结束,undo段不会被覆盖
  4、支持回退
    事务中修改了的数据放到undo其他事务可以去undo读原数据
  5、读取一致性查询
    数据块:
      块头:
        ITL(事务曹)
          修改数据未commit:itl中会记录旧值放在undo的哪个地方
          另一个会话来查询:
            发现数据块已经在内存中
            先看头部,如果前面修改事务未提交去undo找数据
  6、oracle闪回查询
    闪回用的是undo中的数据
  7、失败的事务处理中进行恢复
    update操作修改了数据后 未commit数据,如果此时进行出现故障需要进行恢复
      pmon进程由undo里面记录的数据进行回退
    回退的过程中会一直占有undo块,可能会导致undo段大量增长

二、undo怎么记录的:()

  1. undo 进行镜像:不是进行数据块级别的镜像.,是进行行级别的镜像
  2. 如果事务只是涉及到某个列,那么只进行列级别的镜像,如果是行,那么就是行级别的镜像
  4. update操作, undo会记录行的rowid,同时会记录操作列的前镜像;
    rowid记录: 哪个文件的哪一个块的哪一行
    rollback 时 只涉及到列
  5. delete操作, undo会记录行的rowid,同时会记录整行的前镜像;
    rollback时 需要insert整行
  6. insert操作, undo会记录行的rowid.
    rollback时 只需delete行

ddl语句:不记录undo语句(不存在事务概念)
dml语句:记录undo语句

三、还原段管理:

查看undo情况:

SQL> show parameter undo;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string    AUTO    #管理方式 自动管理
undo_retention integer    900      #至少保留时间 900s(并不确定) (当空间不足时依然会被覆盖,不保留这么长时间)
undo_tablespace string    UNDOTBS1 #当前使用的undo

查看当前激活事务使用回滚段的情况及当前回滚段的大小 :

SQL> select n.usn,n.name,s.rssize,s.xacts,s.status from v$rollname n, v$rollstat s WHERE n.usn = s.usn and s.xacts > 0;

查看undo表空间使用状态:

SQL> SELECT tablespace_name, status, SUM (bytes)/1024/1024 "Bytes(M)" FROM dba_undo_extents GROUP BY tablespace_name, status;

当undo表空间增长较快时,要从以下角度考虑进行控制:
  1. 如果undo表空间是自动扩展的,将自动扩展关闭。如果undo表空间自动扩展,即使有过期的undo段,它也不会重用,而是选择增大数据文件。
    alter database datafile '<datafile path>' autoextend off;
  2. 对数据文件进行裁剪;
    alter database datafile '<datafile path>' resize <new size>;
  3. 减少UNDO_RETENTION参数值。
    设定UNDO_RETENTION参数值时,参考V$UNDOSTAT里MAXQUERYLEN(执行时间最长的事务的执行时间)。
      select max(MAXQUERYLEN) from V$UNDOSTAT;

创建新的 undo表空间:

  SQL> create undo tablespace UNDO_TBS1 datafile 'undotbs1.dbf' size 100m;
  SQL> alter system set undo_tablespace=undo_tbs1;
  SQL> drop tablespace undo_rbs0 including contents.
  如果在删除以前undo表空间时出现ORA-30013错误,则需要等待所有事务提交之后,才能删除以前undo表空间

优质内容筛选与推荐>>
1、图书发行专业术语
2、应用 memcached 提升站点性能——减少读自数据库和数据源
3、计算机网络自学笔记2
4、设计模式——适配器模式
5、Weex 样式


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号