UNDO段的原理以及自动UNDO段管理

undo和redo

   undo 用于撤销修改的操作(事务回滚)  rollforeword  

   redo用于将数据的修改重演一遍(恢复) rollback    

UNDO的目的

 事务的回滚

 实例的恢复

 提供查询的一致性读

 

显式开启一个事务:

SQL> create table t (id int )

SQL> begin

  2  insert into t values (2);

  3  end;

  4  /

查看事务:

SQL> selectxid,xidusn,xidslot,xidsqn,ubafil,ubablk,ubasqn from v$transaction;

 

XID                    XIDUSN    XIDSLOT          XIDSQN     UBAFIL        UBABLK     UBASQN

----------------   ----------   ----------   ----------   ----------   ---------- ----------

07000100C3020000          7            1             707             3           11915          139

说明:

XIDUSN:就是事务的回滚段号

XIDSLOT:就是ITL列表中,slot的号

XIDSQN:就是表示这个slot被重复使用的次数

UBAFIL:回滚段所在的文件号

UBABLK回滚段文件中的数据块号

UBASQN:回滚段文件中的数据块上的序号

UBA:回滚段数据块的地址

 

 

通过XID可以反向查到XIDUSN,XIDSLOT,XIDSLOT

SQL> selectto_number('07','xxxx'),to_number('0001','xxxx'),to_number('00002c3','xxxxxxxx')from dual;

TO_NUMBER('07','XXXX')TO_NUMBER('0001','XXXX')TO_NUMBER('00002C3','XXXXXXXX')

---------------------- -------------------------------------------------------

                    7                             1                            707

通过XID可以唯一标识一个事务

 

事务回滚:


当数据被更新为sal=10时,原来的数据sal=5被放到回滚段中存放

当通过ROLLBACK命令回滚时,现在的sal=10被回滚段中的sal=5覆盖

 

ROLLBACK会产生REDO,是对REDO的修改,也会修改UNDO,UNDO也会产生REDO


 

 

回滚段的逻辑结构:

回滚段的数据允许重用,是一个循环的结构,通过LRU算法来申请空闲块


 

 

回滚段的空间使用机制--增长

回滚段4想要申请空间,但这时1的空间是激活的,不能被占用,所有4需要从外面申请一块空间5,来插到1和4之间来使用


 

 

回滚段的空间使用机制--回收

只能回收连续的Inactive 的空间,不能跨active区域回收

下图将456的空间回收,回收后合并到6号空间

回收空间是自动的过程,ORACLE会自动回收空间


 

 

一致性读:写操作不会阻塞读

DML操作不再阻塞读


 

 

通过SCN来保证一致性读

当发出SELECT时,这时的SCN是10023,所有以后读的数据块的SCN只能小于10023,大于10023的数据块不会被读取,这样就保证了不会读到被修改过的块,如果读到了大于10023的数据块,这个ORACLE会从回滚段中找到被修改的块的前映象,将旧的数据读取出来,保证一致性读



 


 

一致性读并非总要去读取回滚段。

一致性读并不总是要去读取回滚段,如下列子,一直显示consistent gets,所有一致性读只是个叫法,不一定总去读回滚段:


currnet read 是上面显示的 db block gets

 

update操作修改的数据块,一定是当前的数据块,不可能去回滚段里修改数据块的前镜像

当一个数据块被多个update会话更新时,会发生锁或会话等待,一致性读不会发生会话等待

 

一致性读---ORA-01555

在回滚段的数据如果被覆盖,就会出现01555

如果在当前数据块中找不到旧的镜像,就会去回滚段里面读取,如果这时数据块的前镜像被覆盖了,就会报01555错误 

 也可以避免01555错误,代价是回滚段不被重用,回滚段的容量要无限大,这种情况不可能现出,不现实

当事务已提交时,回滚段会被标记为inactive,那么这个回滚段就是可以被覆盖的

 


 

 自动管理UNDO


 

Oracle 9i之前,需要手工创建回回滚段

  – create rollback segment rbs1 tablespace xxx;

  – 弊端

    • 考虑回滚段的个数(系统的事务数量,并发发数量)

    • 考虑回滚段的存储设置

 Oracle9i开始,使用自动管理回滚段(Automatic Undo Management)

  Oracle11G开始,创建UNDO表空间变成数据库创建的一部分。

 

   优点

    – Oracle根据业务需求,自动创建新的回滚段或者将多的回滚段离线。

    – Oracle自动管理UNDO数据的保留时间(需要预先设置)。

 

UNDO的相关参数:

注意:undo_retention是一个动态调整的参数,同时,Oracle无法保证 在这个保留时间内的UNDO数据不被覆盖,当UNDO空间不足时,

Oracle将覆盖即使未过保留期的数据以释放空间。

undo_tablespace可以创建多个表空间,但当前只能使用一个表空间

undo_retention:单位秒


 


强制保留undo_retention时间内的数据,即使这块数据的事务已提交了

  – 设置Undotablespace GUARANTEE属性

配置:

SQL>ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;

取消配置:

SQL>ALTER TABLESPACE UNDOTBS1 RETENTION  NOGUARANTEE;

UNDO的相关视图

SQL>selecta.usn,b.name,extents,rssize,shrinks,wraps,extends,status from v$rollstata,v$rollname b where a.usn=b.usn;

       USN NAME                   EXTENTS    RSSIZE         SHRINKS      WRAPS   EXTENDS STATUS

---------- -------------------- ---------- -------------------- ---------- ---------- ---------------

         0 SYSTEM                       6     385024              0          0            0 ONLINE

         1_SYSSMU1_3724004606$         19   4186112               0         0             0 ONLINE

         2_SYSSMU2_2996391332$          5   2285568               0         0             0 ONLINE

         3_SYSSMU3_1723003836$         19   4186112               0         0             0 ONLINE

         4_SYSSMU4_1254879796$         20   5234688               0         0             0 ONLINE

         5_SYSSMU5_898567397$                4     253952              0          0            0 ONLINE

         6_SYSSMU6_1263032392$          6    385024               0         0             0 ONLINE

         7_SYSSMU7_2070203016$          4   1236992               0         0             0 ONLINE

         8_SYSSMU8_517538920$                4    1236992              0          0            0 ONLINE

         9_SYSSMU9_1650507775$          3   1171456               0         0             0 ONLINE

        10 _SYSSMU10_1197734989         5    3268608              0          0            0 ONLINE

 

EXTENTS:回滚段区的个数

RSSIZE:回滚段的大小bytes

SHRINKS:回滚段回收的次数

WRAPS:一个EXTENTS写满后切到下一个空的EXTENTS的动作的次数,如果WRAPS数据比较大,就说明现在的事务比较多,切换比较频繁

EXTENDS:当初始的EXTENDS不够用时,申请新的EXTENDS的次数

STATUS:回滚段的状态

 

v$undostat

 保留4天的数据,每次快照10分钟。

 再早的数据保留在DBA_HIST_UNDOSTAT视图中。

SQL> selectto_char(begin_time,'hh24:mi'),to_char(end_time,'hh24:mi'),undoblks,txncount,maxquerylen,maxqueryid,maxconcurrency,ssolderrcnt,nospaceerrcnt,activeblks,tuned_undoretentionfrom v$undostat;

 

TO_CH TO_CH   UNDOBLKS        TXNCOUNT MAXQUERYLEN MAXQUERYID    MAXCONCURRENCYSSOLDERRCNT NOSPACEERRCNT ACTIVEBLKS TUNED_UNDORETENTION

----- ----- ---------- ---------- ------------------------ -------------- ----------- ------------- -----------------------------

13:53 14:00          110             539          936 0rc4km05kgzb9                3            0                  0            160               1536

13:43 13:53           25              158         334 0rc4km05kgzb9                4             0                  0           288               1175

在13:53 14:00时间段,产生了UNDOBLKS=110个回滚,产生了TXNCOUNT=539个事务,最大一次查询所用的时间MAXQUERYLEN=MAXQUERYLEN,最大一次查询的ID=0rc4km05kgzb9,最大并发数据MAXCONCURRENCY=3,

出现ORA-15555的次数SSOLDERRCNT=0 ,回滚段没有扩展空间报错的次数NOSPACEERRCNT=0

ACTIVEBLKS:表示在这个时间段有多少个活动块

TUNED_UNDORETENTION:动态调整RETENTION的时间值,这个动态的数值取决于SQL语句执行时间,如果SQL执行的时间很长,就会增加这个值,如果SQL执行的时间很短,就会减少这个数据的大小,避免出现一致性读的错误

 

关于UNDO tablespace

  11g开始,创建数据库时必须指定的表空间。

  最好将它设置为自动扩展,以免出现比如ora-01555错误。

 

查看表空间是否是自动扩展:

SQL> select tablespace_name,AUTOEXTENSIBLE fromdba_data_files;

TABLESPACE_NAME               AUT

------------------------------ ---

USERS                               YES

UNDOTBS1                      YES

SYSAUX                           YES

SYSTEM                           YES

EXAMPLE                        YES

 

总结

 回滚段能够实现数据库的读不会受到写的阻塞。

 回滚段有自身无法解决的问题,ora-01555.

 回滚段可是实现对历史数据的查询(flashback).

分割线
打赏
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS