`

关于redo log 和 undo log 这两个概念 (Oracle)

 
阅读更多

http://blog.163.com/idea_/blog/static/18097026220117268256447/

 

redo log
  重做日志
undo log
  撤消日志
重做日志:每当有操作执行前,将数据真正更改时,先前相关操作写入重做日志。这样当断电,或者一些意外,导致后续任务无法完成时,系统恢复后,可以继续完成这些更改
撤消日志:当一些更改在执行一半时,发生意外,而无法完成,则可以根据撤消日志恢复到更改之前的壮态
网上找到一些解说:以便以后自己参考
有两个概念:前滚与回退
比如某一时刻数据库DOWN机了,有两个事务,一个事务已经提交,另一个事务正在处理
数据库重启的时候就要根据日志进行前滚及回退,把已提交事务的更改写到数据文件,未提交事务的更改恢复到事务开始前的状态。

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就无从谈起

所以instance crash recovery 的时候总是先rollforward, 再rollback

undo
回退段中的数据是以“回退条目”方式存储。
回退条目=块信息(在事务中发生改动的块的编号)+在事务提交前存储在块中的数据

在每一个回退段中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将该事务标记为已完成

举个例子:
insert into a(id) values(1);(redo)
这条记录是需要回滚的。
回滚的语句是delete from a where id = 1;(undo)

试想想看。如果没有做insert into a(id) values(1);(redo)
那么delete from a where id = 1;(undo)这句话就没有意义了。

现在看下正确的恢复:
先insert into a(id) values(1);(redo)
然后delete from a where id = 1;(undo)
系统就回到了原先的状态,没有这条记录了。

分享到:
评论

相关推荐

    Oracle11g Memory&Storage Overview

    --Contolfiles&Online Redo Log Files --LMT vs DMT --ASSM --SEGments,extents&Datablocks --SPECIAL TABLESpaces:Temporary Tablespaces,SYSAUX,Undo Tablespace --Default Table space --BIGFILE ...

    linux系统给oracle数据库增加新的实例.pdf

    cd $ORACLE_HOME/dbs cp initorcl.ora initorcl.ora #复制⼀个原有的ora⽂件 vim initorcl.ora #修改为响应信息 ORACLE_BASE要改为绝对路径 不然会报错 3、创建密码⽂件 orapwd file=$ORACLE_BASE/product/10.2.0/db...

    深入解析OracleDBA入门进阶与诊断案例 4/4

     7.9 Redo Log Buffer的大小设置   7.10 commit做了什么?   7.11 日志的状态   7.12 日志的块大小   7.13 日志文件的大小   7.14 如何调整日志文件大小   7.15 为什么热备份期间产生的Redo要比...

    深入解析OracleDBA入门进阶与诊断案例 3/4

     7.9 Redo Log Buffer的大小设置   7.10 commit做了什么?   7.11 日志的状态   7.12 日志的块大小   7.13 日志文件的大小   7.14 如何调整日志文件大小   7.15 为什么热备份期间产生的Redo要比...

    深入解析OracleDBA入门进阶与诊断案例 2/4

     7.9 Redo Log Buffer的大小设置   7.10 commit做了什么?   7.11 日志的状态   7.12 日志的块大小   7.13 日志文件的大小   7.14 如何调整日志文件大小   7.15 为什么热备份期间产生的Redo要比...

    深入解析Oracle.DBA入门进阶与诊断案例

    针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识入手...

    oracle 12c 数据库 教程

    (一)衡量数据库可恢复性的两个指标 86 (二)数据库故障的类型 86 (三)配置数据库的可恢复性 88 (四)归档日志文件 88 (五)启用 ARCHIVELOG(归档)模式 89 (六)Oracle 数据库备份的解决方案 89 二、闪回 ...

    linux系统给oracle数据库增加新的实例(1).pdf

    cd $ORACLE_HOME/dbs cp initorcl.ora initorcl.ora #复制⼀个原有的ora⽂件 vim initorcl.ora #修改为响应信息 ORACLE_BASE要改为绝对路径 不然会报错 3、创建密码⽂件 orapwd file=$ORACLE_BASE/product/10.2.0/db...

    最完整的Toad For Oracle使用手册

    Redo Log Manager 282 Importing and Exporting Data 285 Data Pump 285 Export Dataset 304 Export DDL 310 Export File Browser 318 General Export 324 General Import 329 Generate Database Script 341 ...

    操作系统崩溃,数据库全部文件都在时,数据库恢复方法.pdf

    ⼀个朋友的Oracle数据库所在的 操作系统崩溃,现遗留下数据⽂件 ⽂件分布结构如下: d:/oracle/oradata/STAN CONTROL01.CTL CONTROL02.CTL CONTROL03.CTL INDX11.DBF INDX12.DBF INDX13.DBF INDX14.DBF REDO01.LOG ...

    Oracle Core Essential Internals for DBAs and Developers ■ ■

    ■Chapter 2: Redo and Undo ....................................................................................... 5 Basic Data Change ....................................................................

    Oracle从入门到精通

    8. redo log file 重做日志文件............................. 9. control file 控制文件 ................................. 10. parameter file 初始化参数文件......................... 11. password file 口令...

    vc++ 应用源码包_6

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 应用源码包_5

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 应用源码包_1

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 应用源码包_3

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 应用源码包_2

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 开发实例源码包

    这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! 如题。详细见源码。 GMem 内存管理单元源码。GMem.cpp...

Global site tag (gtag.js) - Google Analytics