REDOLOG与UNDOLOG这两个概念的区别

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

REDOLOG与UNDOLOG这两个概念的区别--转载转自:[url][/url]redolog重做日志/undolog撤消日志重做日志:每当有操作执行前,将数据真正更改时,先前相关操作写入重做日志。这样当断电,或者一些意外,导致后续任务无法完成时,系统恢复后,可以继续完成这些更改撤消日志:当一些更改在执行一半时,发生意外,而无法完成,则可以根据撤消日志恢复到更改之前的壮态网上找到一些解说:以便以后自己参考有两个概念:前滚与回退比如某一时刻数据库DOWN机了,有两个事务,一个事务已经提交,另一个事务正在处理数据库重启的时候就要根据日志进行前滚及回退,把已提交事务的更改写到数据文件,未提交事务的更改恢复到事务开始前的状态。redo--undo--datafileinsert一条记录时,表跟undo的信息都会放进redo中,在commit或之前,redo的信息会放进硬盘上.故障时,redo便可恢复那些已经commit了的数据.redo-每次操作都先记录到redo日志中,当出现实例故障(像断电),导致数据未能更新到数据文件,则数据库重启时须redo,重新把数据更新到数据文件undo-记录更改前的一份copy,但你系统rollback时,把这份copy重新覆盖到原来的数据redo-记录所有操作,用于恢复(redorecordsallthedatabasetransactionusedforrecovery)undo-记录所有的前印象,用于回滚(undoisusedtostoreuncommiteddatainforusedforrollback)redo-已递交的事务,实例恢复时要写到数据文件去的undo-未递交的事务.redo的原因是:每次commit时,将数据的修改立即写到onlineredo中,但是并不一定同时将该数据的修改写到数据文件中。因为该数据已经提交,但是只存在联机日志文件中,所以在恢复时需要将数据从联机日志文件中找出来,重新应用一下,使已经更改数据在数据文件中也改过来!undo的原因是:在oracle正常运行时,为了提高效率,加入用户还没有commit,但是空闲内存不多时,会由DBWR进程将脏块写入到数据文件中,以便腾出宝贵的内存供其它进程使用。这就是需要UNDO的原因。因为还没有发出commit语句,但是oracle的dbwr进程已经将没有提交的数据写到数据文件中去了。undo也是也是datafile,可能dirtybuffer没有写回到磁盘里面去。只有先redoapply成功了,才能保证undodatafile里面的东西都是正确的,然后才能rollback做undo的目的是使系统恢复到系统崩溃前(关机前)的状态,再进行redo是保证系统的一致性.不做undo,系统就不会知道之前的状态,redo就无从谈起所以instancecrashrecovery的时候总是先rollforward,再rollbackundo回退段中的数据是以“回退条目”方式存储。回退条目=块信息(在事务中发生改动的块的编号)+在事务提交前存储在块中的数据在每一个回退段中oracle都为其维护一张“事务表”在事务表中记录着与该回退段中所有回退条目相关的事务编号(事务SCN&回退条目)redo重做记录由一组“变更向量”组成。每个变更变量中记录了事务对数据库中某个块所做的修改。当用户提交一条commit语句时,LGWR进程会立刻将一条提交记录写入到重做日志文件中,然后再开始写入与该事务相关的重做信息。#事务提交成功后,Oracle将为该事备生成一个系统变更码(SCN)。事务的SCN将同时记录在它的提交记录和重做记录中。commit提交事务前完成的工作:·在SGA区的回退缓存中生成该事务的回退条目。在回退条目中保存有该事务所修改的数据的原始版本。·在SGA区的重做日志缓存中生成该事务的重做记录。重做记录中记载了该事务对数据块所进行的修改,并且还记载了对回退段中的数据块所进行的修改。缓存中的重做记录有可能在事务提交之前就写入硬盘中。·在SGA区的数据库缓丰中记录了事务对数据库所进行的修改。这些修改也有可能在事务提交之前就写入硬盘中。提交事务时完成的工作:·在为该事务指定的回退段中的内部事务表内记录下这个事务已经被提交,并且生成一个惟一的SCN记录在内部事务表中,用于惟一标识这个事务。·LGWR后进进程将SGA区重做日志缓存中的重做记录写入联机重做日志文件。在写入重做日志的同时还将写入该事务的SCN。·Oracle服务进程释放事务所使用的所有记录锁与表锁。·Oracle通知用户事务提交完成。·Oracle将该事务标记为已完成。rollback回退事务完成的工作:·Oracle通过使用回退段中的回退条目,撤销事务中所有SQL语句对数据库所做的修改。·Oracle服务进程释放事务所使用的所有锁·Oracle通知事务回退成功。·Oracle将该事务标记为已完成举个例子:insertintoa(id)values(1);(redo)这条记录是需要回滚的。回滚的语句是deletefromawhereid=1;(undo)试想想看。如果没有做insertintoa(id)values(1);(redo)那么deletefromawhereid=1;(undo)这句话就没有意义了。现在看下正确的恢复:先insertintoa(id)values(1);(redo)然后deletefromawhereid=1;(undo)系统就回到了原先的状态,没有这条记录了16.1.4日志文件(RedologFiles)在Oracle数据库环境下流传着这样一句话:要想知道数据库曾经都做过什么,问问重做日志文件就知道!人们是这样说,重做日志文件也是这样做的。重做日志文件为什么能做到这一点,又是如何数十年如一日,始终保持重做日志组成员先进性的呢?这一切,要从重做日志文件的名字说起……重做有一个好听的英文名字叫Redo,特指一项操作。在Oracle数据库中,执行数据修改操作后,并不是马上写入数据文件,而是首先生成重做信息,并写入SGA中的一块叫LOG_BUFFER(关于这部分内容将在介绍实例的体系结构时详细阐述)的固定区域,LOG_BUFFER的空间并不是无限大,事实上它非常小,一般设置在3~5MB左右。LOG_BUFFER有一定的触发条件,当满足触发条件后,会有相应进程将LOG_BUFFER中的内容写入一个特定类型的文件,就是传说中的联机重做日志文件。16.1.4.1联机重做日志文件(OnlineRedologFiles)在Oracle数据库环境中,如果开展评选劳动模范之类的活动,联机重做日志绝对是当之无愧的劳模代表(没有之一)。在某些比较极端的环境,甚至自联机重做日志文件降临到Oracle数据库环境的那刻起,它就要从早忙到晚,从这头忙到那一头,再从那头忙回到这一头,艰苦朴素、吃苦耐劳,时刻履行着作为一名重做日志组成员的光荣使命,数十年如一日,毫无怨言并且无条件地服从组织安排,全心全意完成组织交待的各项任务,忠实做好各项操作的记录工作。这一切,都是每一名重做日志组成员的真实写照。一个好汉三个帮,重做日志文件也有多个帮手,每个数据库至少要有两个重做日志文件组(一般应该为3~5组)。联机重做日志文件是循环使用,如图16-1所示,创建了3个重做日志文件组,Oracle以循环方式使用这些重做日志文件组。如当前在写LOG日志组1,那么LOG日志组1即为CURRENT状态,当该重做日志文件组中的日志文件被写满数据后,后台进程LGWR就开始写下一个,即LOG日志组2(此时LOG日志组1状态被切换为ACTIVE状态,LOG日志组2的状态则变为CURRENT)。以此类推,当所有的日志文件都被写满后,后台进程LGWR再次重新写入LOG日志组1……因为联机重做日志文件非常重要,Oracle建议每组联机重做日志文件至少要有一份冗余。Oracle管这种方式叫复合(Multiplexed),即为每个重做日志文件保持多份镜像,这样一旦因为磁盘损坏,或误操作导致丢失了某个重做日志文件,只要该组至少还有一个重做日志文件状态正常,就能够保证数据不会丢失。1.管理联机重做日志创建联机重做日志文件时都是以组为单位,也就是说,想为数据库添加一个联机重做日志文件,就必须先为数据库创建一个联机重做日志文件组(如果使用DBCA建库,默认会创建三个联机重做日志文件组)。创建联机重做日志文件组的语法如图16-2所示。在创建重做日志文件组时,可以为联机重做日志文件指定复合,并设置联机重做日志文件的大小,例如:1.JSSBOOKALTERDATABASEADDLOGFILEGROUP42.2('f:\oracle\oradata\jssbook\redod01.log',3.3'f:\oracle\oradata\jssbook\redod02.log')size50m;4.Databasealtered.删除连接联机重做日志文件组的语法就更简单了,例如,删除刚创建的GROUP4:1.JSSBOOKALTERDATABASEDROPLOGFILEGROUP4;2.Databasealtered.注意使用ALTERDATABASEDROPLOGFILE命令删除联机重做日志文件组时,不能删除当前系统正在使用(CURRENT)或活动(ACTIVE)状态的联机重做日志文件组(一般来说,刚刚创建的联机重做日志文件组的状态应该为UNUSED,表示还从未被写入过数据)。另外,ALTERDATABASEDROPLOGFILE命令只删除该联机重做日志文件组在数据字典中的定义,不会级联删除操作系统中对应的物理文件,如果需要删除对应的物理文件,DBA必须手动通过操作系统命令进行删除。你也可以为当前的联机重做日志组添加联机重做日志文件,语法如图16-3所示。例如,为第3组联机重做日志添加日志文件:1.JSSBOOKALTERDATABASEADDLOGFILEMEMBER'f:\oracle2.\oradata\jssbook\redoa02.log'TOGROUP1;3.Databasealtered.注意添加联机重做日志文件不能指定大小,因为每个联机重做日志文件组中的文件都是相互冗余,因此文件大小必须一致。实际上在Oracle数据库中,每一个联机重做日志文件组都可以拥有不同于其他联机重做日志文件组的大小,不过Oracle建议数据库中每组联机重做日志文件都拥有相同的大小。删除联机重做日志文件组中的某个日志文件也很简单,如删除GROUP1中刚刚添加的日志文件,执行命令如下:1.JSSBOOKALTERDATABASEDROPLOGFILEMEMBER'2.f:\oracle\oradata\jssbook\redoa02.log';3.Databasealtered.注意删除联机重做日志文件组成员前,必须确保删除后该联机重做日志文件组中至少还拥有一个组员,不然删除操作可能会触发ORA-00361错误。2.查看联机重做日志有两个视图可以用来查询当前系统中的联机重做日志文件的相关信息,其中用V$LOG视图查询当前的联机重做日志文件组信息,例如:1.JSSBOOKSELECT*FROMV$LOG;2.GROUP#THREAD#SEQUENCE#BYTESMEMBERSARCSTATUSFIRST_CHANGE#FIRST_TIM3.-------------------------------------------------------------------4.1113524288002YESINACTIVE865158536029-JUN-095.2114524288001NOCURRENT865162651401-JUL-096.3112524288001YESINACTIVE865158535

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功