• 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表空间

  • 相关阅读:
    visual studio 2008 在调试的时候出现无法启动程序错误时什么原因
    android illegallstateexception:get field slot from row 0 col 1 failed
    android activity has leaked window phonewindow
    the content of the adapter has changed but listview did not
    android create table android_metadata failed
    豌豆荚 软件 android 550 that path is inaccessible sdcard
    android nullpointerexception println needs a message
    android sqlite3 乱码
    android unable to instantiate activity componentinfo
    android.database.sqlite.SQLiteExcepption: near ">":syntax error:,while compiling:
  • 原文地址:https://www.cnblogs.com/fanxuanhui-linux/p/7087552.html
Copyright © 2020-2023  润新知