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).