一、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表空间进行监控 undo表空间是什么_表空间

 

 

查看undo表空间使用状态:

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

 

如何对undo表空间进行监控 undo表空间是什么_数据库_02

 

 

 

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