最近的《镜花缘10个赏析的片段》很火,是在腾讯动漫APP更新的吗

查看: 7851|回复: 32
redo和undo区别到底在哪
论坛徽章:2
如题,知道redo和undo有区别,但还是不知道他们的本质区别,很容易混淆,求大师指教,
最好给点实际的例子,谢谢啦
论坛徽章:10
说起来太长了. 建议看看oracle concept官方文档.
论坛徽章:5
区别大了,redo 用于 事务重演 即前滚, redo 用于 事务回滚 也用于一致性都(多版本控制)
需要好好看看基础知识。
不要着急。
论坛徽章:15
这种问题确实应该先看看书了
认证徽章论坛徽章:41
首先些redo
论坛徽章:2
mkstone 发表于
这种问题确实应该先看看书了
看书也没懂,前滚和回滚怎么区别啊
论坛徽章:15
前滚可以理解为事务的重放, 当异常崩溃时,内存中已经提交的数据可能没有及时写入磁盘,或者修改之后没提交的数据可能已经写入磁盘,但这些数据无一例外的都记了redo;
系统重启时,oracle就应用redolog,恢复崩溃时的现场(redo中取出已提交的数据;将磁盘未提交的数据读入内存,并从undo中取出前镜像),接着发生rollback。 这些处理是由SMON进程完成的
恢复现场叫“前滚”,rollback叫“回滚”
论坛徽章:1
从字面理解 undo 撤销 redo 重做。哪些操作需要撤销哪些需要重做?多思考,结合官方文档
论坛徽章:6
这么说吧,一个是走回头路,就是回到起点(往回走undo),另一个是重走一遍走过的路(往前走redo)。
论坛徽章:4
RE: redo和undo区别到底在哪
mkstone 发表于
前滚可以理解为事务的重放, 当异常崩溃时,内存中已经提交的数据可能没有及时写入磁盘,或者修改之后没提交 ...
这位老师的回答其实已经很全面了,楼主可以参考
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号2922人阅读
计算机原理(47)
数据库存放数据的文件,本文称其为data file。
数据库的内容在内存里是有缓存的,这里命名为db buffer。某次操作,我们取了数据库某表格中的数据,这个数据会在内存中缓存一些时间。对这个数据的修改在开始时候也只是修改在内存中的内容。当db buffer已满或者遇到其他的情况,这些数据会写入data file。
undo,redo
日志在内存里也是有缓存的,这里将其叫做log buffer。磁盘上的日志文件称为log file。log file一般是追加内容,可以认为是顺序写,顺序写的磁盘IO开销要小于随机写。
Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback;Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。下面的示例来自于杨传辉《大数据分布式存储系统 原理解析与架构实践》,略作改动。
例如某一事务的事务序号为T1,其对数据X进行修改,设X的原值是5,修改后的值为15,那么Undo日志为&T1,
X, 5&,Redo日志为&T1,
也有把undo和redo结合起来的做法,叫做Undo/Redo日志,在这个例子中Undo/Redo日志为&T1,
X, 5, 15&。
当用户生成一个数据库事务时,undo log buffer会记录被修改的数据的原始值,redo会记录被修改的数据的更新后的值。
redo日志应首先持久化在磁盘上,然后事务的操作结果才写入db buffer,(此时,内存中的数据和data file对应的数据不同,我们认为内存中的数据是脏数据),db buffer再选择合适的时机将数据持久化到data file中。这种顺序可以保证在需要故障恢复时恢复最后的修改操作。先持久化日志的策略叫做Write
Ahead Log,即预写日志。
在很多系统中,undo日志并非存到日志文件中,而是存放在数据库内部的一个特殊段中。本文中就把这些存储行为都泛化为undo日志存储到undo log file中。
对于某事务T,在log file的记录中必须开始于事务开始标记(比如“start T”),结束于事务结束标记(比如“end T”、”commit T”)。在系统恢复时,如果在log file中某个事务没有事务结束标记,那么需要对这个事务进行undo操作,如果有事务结束标记,则redo。
在db buffer中的内容写入磁盘数据库文件之前,应当把log buffer的内容写入磁盘日志文件。
有一个问题,redo log buffer和undo log buffer存储的事务数量是多少,是按照什么规则将日志写入log file?如果存储的事务数量都是1个,也就意味着是将日志立即刷入磁盘,那么数据的一致性很好保证。在执行事T时,突然断电,如果未对磁盘上的redo log file发生追加操作,可以把这个事务T看做未成功。如果redo log file被修改,则认为事务是成功了,重启数据库使用redo log恢复数据到db buffer和 data file即可。
如果存储多个的话,其实也挺好解释的。就是db buffer写入data file之前,先把日志写入log file。这种方式可以减少磁盘IO,增加吞吐量。不过,这种方式适用于一致性要求不高的场合。因为如果出现断电等系统故障,log buffer、db buffer中的完成的事务会丢失。以转账为例,如果用户的转账事务在这种情况下丢失了,这意味着在系统恢复后用户需要重新转账。
检查点checkpoint
checkpoint是为了定期将db buffer的内容刷新到data file。当遇到内存不足、db buffer已满等情况时,需要将db buffer中的内容/部分内容(特别是脏数据)转储到data file中。在转储时,会记录checkpoint发生的”时刻“。在故障回复时候,只需要redo/undo最近的一次checkpoint之后的操作。
幂等性问题
在日志文件中的操作记录应该具有幂等性。幂等性,就是说同一个操作执行多次和执行一次,结果是一样的。例如,5*1
= 5*1*1*1,所以对5的乘1操作具有幂等性。日志文件在故障恢复中,可能会回放多次(比如第一次回放到一半时系统断电了,不得不再重新回放),如果操作记录不满足幂等性,会造成数据错误。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2801875次
积分:19916
积分:19916
排名:第365名
原创:40篇
转载:805篇
评论:191条
(1)(5)(2)(2)(3)(3)(2)(2)(2)(1)(7)(3)(1)(1)(1)(2)(6)(24)(6)(6)(3)(24)(2)(2)(10)(13)(7)(20)(8)(21)(14)(34)(34)(34)(34)(54)(55)(55)(57)(57)(37)(37)(37)(17)(20)(48)(11)(2)(5)(10)(6)5579人阅读
Oracle基础知识(49)
首先看一下undo与redo的字面意思:
& 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了。
  COMMIT&以前,常想当然地认为,一个大的TRANSACTION(比如大批量地INSERT数据)的COMMIT会花费时间比短的TRANSACTION长。而事实上是没有什么区别的,
  因为ORACLE在COMMIT之前已经把该写的东西写到DISK中了,
  我们COMMIT只是
  1,产生一个SCN给我们TRANSACTION,SCN简单理解就是给TRANSACTION排队,以便恢复和保持一致性。
  2,REDO写REDO到DISK中(LGWR,这就是log file sync),记录SCN在ONLINE REDO LOG,当这一步发生时,我们可以说事实上已经提交了,这个TRANSACTION已经结束(在V$TRANSACTION里消失了)
  3,SESSION所拥有的LOCK(V$LOCK)被释放。
  4,Block Cleanout(这个问题是产生ORA-01555: snapshot too old的根本原因) ROLLBACK ROLLBACK和COMMIT正好相反,ROLLBACK的时间和TRANSACTION的大小有直接关系。因为ROLLBACK必须物理上恢复数据。
COMMIT之所以快,是因为ORACLE在COMMIT之前已经作了很多工作(产生UNDO,修改BLOCK,REDO,LATCH分配), ROLLBACK慢也是基于相同的原因。
  1. UNDO表空间用于存放UNDO数据。当执行DML操作时,Oracle会将这些操作的旧数据写入UNDO段。管理UNDO数据不仅可以使用回滚段,还可以使用UNDO表空间。
  2. UNDO数据的作用:当用户执行DML操作修改数据时,UNDO数据被存放在UNDO段,而新数据则被存放到数据段中,如果事务操作存在问题,就需要回退事务,以取消事物变化。
  例如:执行完UPDATE emp SET sal=1000 WHERE empno=7788后,发现应该修改雇员7963的工资,而不是7788.此时应该执行ROLLBACK语句。
  3.读一致性
  用户检索数据时,ORACLE总是使用户只能看到被提交过的数据,这是由Oracle自动提供的。当用户修改数据,但是没有提交时,另外一个用户使用select语句查找该值时,该值就是从undo表空间中取得的。
  4.事务恢复
  事务恢复是例程恢复的一部分,它是由Oracle Server自动完成的。如果在数据库运行过程中出线例程失败,那么当启动Oracle Server时,后台进程SMON会自动执行例程恢复。执行例程恢复时,Oracle会重做所有未应用的记录。然后打开数据库,回退未提交事务。
  5.倒叙查询
  倒叙查询用于取得某一特定时间点的数据库数据。
  6.UNDO_MANAGEMENT
  使用初始化参数用于指定UNDO数据的管理方式。如果使用自动管理模式,必须设置该参数为AUTO,此时采用UNDO表空间管理UNDO数据;如果使用手工管理模式,必须设置该值为MANUAl,此时采用回滚段管理UNDO数据。
  7.UNDO_TABLESPACE
  用于指定例程所要使用的UNDO表空间。使用自动UNDO管理模式时,通过配置该参数可以指定例程所要使用的UNDO表空间。
  使用RAC结构时,必须为每个例程配置一个独立的UNDO表空间。
  8.UNDO_RETENTION
  该参数用于控制UNDO数据的最大保留时间,其默认值为900秒,该值时倒序查询可以查看到的最早时间点。
  9.UNDO表空间上不能建立任何数据对象。
一.undo中数据的特点:
1。是数据修改前的备份,主要是保证用户的读一致性
2. 在事务修改数据时产生
3。至少保存到事务结束
二。undo数据的作用:
1.回滚(rollback)操作
2.实现读一致性与闪回查询
3.从失败的事务中还原数据
4. 非正常停机后的实例恢复
三.undo回滚段的特点:
1.回滚段是由实例自动创建用于支持事务运行的专用段,同样是区和块组成,回滚顶会按实际需要自动进行增长或收缩,是一段可以给指定事务循环使用的存储缓冲区。
2.每个事务只会使用一个回滚段,一个回滚段在同一时刻可能会服务于多个事务
3.当一个事务开始的时候,会指定一个回滚段,在事务进行的过程中,当数据被修改时,原始的数据会被复制到回滚段。
4。在回滚段中,事务会不断填充盘区,直到事务结束或所有的空间被用完,如果当前的盘区不够用,事务会在段中请求扩展下一个盘区,如果所有已分配的盘区都被用完,事务会覆盖最初的盘区或者在回滚段允许的情况下扩展新的盘区来使用.
5。回滚段存在于undo表空间中,在数据库中可以存在多个undo表空间,但同一时刻只能使用一个undo表空间。
四.回滚段中的数据类型:
回滚段中的数据主要分为以下三种:
1.Uncommit 未提交的回滚数据,该数据所关联的事务并未提交,用于实现读一致性,所以该数据不能被其它事务的数据所覆盖
2.Commit已经提交但未过期的回滚数据,该数据关联的事务已经提交,但是仍受到undo retention参数保持时间的影响
3.Expi事务已经提交,而且数据保存时间已经超过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数据的区别:
1.undo记录数据修改之前的操作,redo记录磁盘数据将要进行的操作.
2.undo用于数据的回滚操作,和实现一致性读,redo用于前滚数据库操作
3.undo存储在回滚段里,redo存储在重做日志文件里
4.undo用于在多用户并发的系统里保证一致性读,redo用于防止数据丢失
六.与undo有关的相关参数
undo_management = auto 自动的undo表空间管理
undo_tablespace = undotbs1 设置undo表空间的名称,可以存在多个undo表空间,但同时只能使用一个
undo_retention = 900(秒) 设置快照保存的最少时间,设置后在此时间段内仍有可能会被覆盖
ALTER TABLESPACE UNDO_TS RETENTION GUARANTEE; 强制所有快照必须保存 undo_retention所规定的时间。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1102814次
积分:8583
积分:8583
排名:第2042名
原创:123篇
转载:47篇
译文:21篇
评论:106条
(2)(5)(6)(6)(1)(1)(6)(1)(11)(6)(1)(1)(2)(4)(8)(6)(7)(2)(3)(6)(6)(8)(10)(3)(5)(11)(3)(6)(2)(3)(1)(11)(5)(4)(11)(17)oracle(17)
1. redo和undo
也就是重新做的意思,当系统发生故障时重新做。
oracle日志文件分为重做日志文件(Redo Log File)和归档日志文件。
由于数据库缓冲,对磁盘数据的更新不是实时的,但是对redo日志的更新会在commit之后确切发生。
如果在事务提交之后,磁盘数据更新之前,系统发生故障,比如断电,系统重启之后会将那些已经写入redo,但是没有更新到磁盘的数据进行重做,这样系统就恢复到故障点之前了。
redo日志默认3组,循环写入,第一组(每个组所有成员同时写入同样的信息)满了,切换到第二个,第二个满了切换到第三个,当所有组都写满之后,日志进程再次开始写第一个,后面的数据覆盖前面的数据,即为非归档模式。
鉴于redo如此重要,需要将已写满的日志归档,即复制内容到其他地方,即开启归档日志模式,但是会影响系统性能。
undo保存在undo表空间中,且包含在redo日志中。
当执行DML操作时,旧数据会写入undo中。
事务回滚,未提交时,rollback,把undo中的旧数据重新写回数据段中;已提交时,进行闪回(flashback)操作 ,大多都是基于undo数据实现的。
读一致性:用户检索数据时,ORACLE总是使用户只能看到被提交过的数据(当前事务中的其他语句可以看到未提交的数据),或者特定时间点的数据(select语句时间点)。当某个用户在此查询点之后修改了数据,此查询读到这个数据时,就是通过在undo中读取来实现的。
oracle使用scn来实现读一致性,系统变化号(SCN)是一个数据结构,它定义了一个给定时刻提交的数据库版本,SCN可以被认为是oracle的逻辑时钟,每一次提交数值都要增加。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:398256次
积分:4621
积分:4621
排名:第5874名
原创:109篇
转载:33篇
译文:17篇
评论:58条
(1)(1)(1)(14)(7)(5)(1)(7)(4)(10)(9)(3)(2)(2)(2)(7)(4)(3)(1)(30)(5)(9)(28)(2)(1)

我要回帖

更多关于 镜花缘中的国家 的文章

 

随机推荐