undo与redo的区别
admin
2023-06-11 04:22:41
0次

undo:撤销,也就是取消之前的操作。

 redo:重做,重新执行一遍之前的操作。

什么是REDO

  REDO记录transaction logs,分为online和archived。以恢复为目的。

  比如,机器停电,那么在重起之后需要online redo logs去恢复系统到失败点。

  比如,磁盘坏了,需要用archived redo logs和online redo logs去恢复数据。

  比如,truncate一个表或其他的操作,想恢复到之前的状态,同样也需要。

什么是UNDO

  REDO 是为了重新实现你的操作,而UNDO相反,是为了撤销你做的操作,比如你得一个TRANSACTION执行失败了或你自己后悔了,


则需要用 ROLLBACK命令回退到操作之前。回滚是在逻辑层面实现而不是物理层面,因为在一个多用户系统中,数据结构,blocks等都


在时时变化,比如我们 INSERT一个数据,表的空间不够,扩展了一个新的EXTENT,我们的数据保存在这新的EXTENT里,其它用户随后


也在这EXTENT里插入了数据,而此时我想ROLLBACK,那么显然物理上讲这EXTENT撤销是不可能的,因为这么做会影响其他用户的操作


。所以,ROLLBACK是逻辑上回滚,比如对INSERT来说,那么ROLLBACK就是DELETE了。




一.undo中数据的特点:

1。是数据修改前的备份,主要是保证用户的读一致性

2. 在事务修改数据时产生

3。至少保存到事务结束


二。undo数据的作用:

1.回滚(rollback)操作

2.实现读一致性与闪回查询

3.从失败的事务中还原数据

4. 非正常停机后的实例恢复


三.undo回滚段的特点:

1.回滚段是由实例自动创建用于支持事务运行的专用段,同样是区和块组成,回滚顶会按实际需要自动进行增长或收缩,是一段可以


给指定事务循环使用的存储缓冲区。

2.每个事务只会使用一个回滚段,一个回滚段在同一时刻可能会服务于多个事务

3.当一个事务开始的时候,会指定一个回滚段,在事务进行的过程中,当数据被修改时,原始的数据会被复制到回滚段。

4。在回滚段中,事务会不断填充盘区,直到事务结束或所有的空间被用完,如果当前的盘区不够用,事务会在段中请求扩展下一个盘


区,如果所有已分配的盘区都被用完,事务会覆盖最初的盘区或者在回滚段允许的情况下扩展新的盘区来使用.

5。回滚段存在于undo表空间中,在数据库中可以存在多个undo表空间,但同一时刻只能使用一个undo表空间。



四.回滚段中的数据类型:

回滚段中的数据主要分为以下三种:

1.Uncommitted undo information; 未提交的回滚数据,该数据所关联的事务并未提交,用于实现读一致性,所以该数据不能被其它


事务的数据所覆盖

2.Committed undo information;已经提交但未过期的回滚数据,该数据关联的事务已经提交,但是仍受到undo retention参数保持时


间的影响

3.Expired undo information;事务已经提交,而且数据保存时间已经超过undo retention参数指定的时间,属于已经过期的数据

当回滚段满了后,会优先覆盖Expired undo information,当过期数据空间用完后,会再覆盖Committed undo information的区域,


这时undo retention参数所规定的保持时间会被破坏,Uncommitted undo information的数据是不允许覆盖的,如果要求提交的数据


在undo retention参数规定的时间内不会被覆盖,可以在undo表空间上指定RETENTION GUARANTEE,语法如下:

ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;



五。undo数据与redo数据的区别:



redo--> undo-->datafile

insert一条记录时, 表跟undo的信息都会放进 redo 中, 在commit 或之前, redo 的信息会放进硬盘上. 故障时, redo 便可恢复那些


已经commit 了的数据.


redo->每次操作都先记录到redo日志中,当出现实例故障(像断电),导致数据未能更新到数据文件,则数据库重启时须redo,重新


把数据更新到数据文件

undo->记录更改前的一份copy,但你系统rollback时,把这份copy重新覆盖到原来的数据


redo->记录所有操作,用于恢复(redo records all the database transaction used for recovery)

undo->记录所有的前印象,用于回滚(undo is used to store uncommited data infor used for rollback)


redo->已递交的事务,实例恢复时要写到数据文件去的

undo->未递交的事务.


redo的原因是:每次commit时,将数据的修改立即写到online redo中,但是并不一定同时将该数据的修改写到数据文件中。因为该数


据已经提交,但是只存在联机日志文件中,所以在恢复时需要将数据从联机日志文件中找出来,重新应用一下,使已经更改数据在数


据文件中也改过来!


undo的原因是:在oracle正常运行时,为了提高效率,假如用户还没有commit,但是空闲内存不多时,会由DBWR进程将脏块写入到数据


文件中,以便腾出宝贵的内存供其它进程使用。这就是需要UNDO的原因。因为还没有发出commit语句,但是oracle的dbwr进程已经将


没有提交的数据写到数据文件中去了。


undo 也是datafile, 可能dirty buffer 没有写回到磁盘里面去。

只有先redo apply 成功了,才能保证undo datafile 里面的东西都是正确的,然后才能rollback


做undo的目的是使系统恢复到系统崩溃前(关机前)的状态,再进行redo是保证系统的一致性.

不做undo,系统就不会知道之前的状态,redo就无从谈起



六.与undo有关的相关参数

undo_management = auto 自动的undo表空间管理

undo_tablespace = undotbs1 设置undo表空间的名称,可以存在多个undo表空间,但同时只能使用一个

undo_retention = 900(秒) 设置快照保存的最少时间,设置后在此时间段内仍有可能会被覆盖

ALTER TABLESPACE UNDO_TS RETENTION GUARANTEE; 强制所有快照必须保存 undo_retention所规定的时间。


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...