oracle redo 状态,理解ORACLE REDO与UNDO
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)
系统就回到了原先的状态,没有这条记录了
oracle redo 状态,理解ORACLE REDO与UNDO相关推荐
- oracle dg状态查询,oracle dg状态检查及相关命令
oracle dg状态检查 先检查备库的归档日志同步情况 SELECT NAME,applied FROM v$archived_log; alter database recover managed ...
- oracle stalestats_深入理解oracle优化器统计数据(Optimizer Statistics)
理解oracle优化器统计数据 首先来介绍oracle数据库使用基于规则优化器(RBO)来决定如何执行一个sql语句.基于规则优化器顾名思义,它是遵循一组规则来判断一个sql语句的执行计划.这组规则是 ...
- oracle中@,深入理解Oracle中的DBCA
但凡是学习 过Oracle的同学,DBCA都是一个必备工具,有了这个工具,创建数据库成为可能.而DBCA本身有图形和静默两种方式.静默方式看起来高大上,可以轻松搞定一个看似很复杂的创建数据库过程,而只 ...
- oracle usenl,深入理解Oracle表(1):ORDERED和USE_NL | 学步园
ORDERED好理解,就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表 use_nl(t1,t2):表示对表t1.t2关联时采用嵌套循环连接,其并不能让优化器确定谁是驱动表或谁 ...
- Oracle数据库中的方案,学习Oracle数据库_理解Oracle数据库中的方案
理解数据库.表空间.数据文件之间的关系. 每个表空间由一个或多个数据文件组成.数据文件用于在物理上存储表空间中所有逻辑结构的数据.表空间中数据文件的大小之和就是表空间的存储容量(图中系统表空间存储容量 ...
- oracle 存储过程 状态,查看ORACLE中正在运行的存储过程 | 学步园
1.如何查看ORACLE中正在运行的存储过程 select owner,name from v$db_object_cache where type like '%PROCE%' and locks ...
- oracle 闩情况,理解oracle锁和oracle闩(3)TX锁和TM锁
oracle没有锁管理器和锁列表,这样可以避免行级锁维护的开销和行级锁数量不足导致的争用问题.在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定,要查看某一行是否被锁定,必须直接找到这 ...
- oracle数据库中_以下undo和redo说法错误的是,[案例]Oracle报错ORA-01157 ORA-01110 12C数据库undo异常恢复...
天萃荷净 运维DBA反映Oracle 12C数据库报错ORA-01157 ORA-01110,分析原因为undo异常导致 在Oracle 12c三个会话,其中第一个会话对pdb1中的表进行操作,并且有 ...
- Oracle 下马观花看redo
----------------------------------------- --Lerning Content :Oracle 下马观花看redo --Author :如人饮水冷暖自知 --版 ...
- oracle redo删除,意外删除redo的恢复
今天做了点删除redo log的测试,查阅资料和实际动手整理了一下的一些东西. A非当前联机日志被删除损坏 正常关闭数据库 shutdown immediate 我们在os上删除logfile red ...
最新文章
- JavaScript数组随机排序
- 添加新闻在分层里的实现
- 2018程序员最佳ssh免费登陆工具
- 《TCP/IP详解》学习笔记(四):ICMP 协议、ping 和 Traceroute
- Spring Cloud文档阅读笔记-初识Spring Cloud(对Spring Cloud初步了解)
- python db api_dbapi · PyPI
- 《Spring Boot实战》读书笔记
- 【广度优先搜索】一个实例+两张动图彻底理解 BFS | 思路+代码详解 | 用 DFS 自动控制我们的小游戏
- 代写R语言assignment经常用到的代码语法分享!
- 富文本++php+源码,轻量级富文本编辑器wangEditor
- java zinterstore_Java架构之Redis系列:通过文章点赞排名案例学习Sortedset命令
- Oracle备份恢复之闪回技术
- android 2D游戏开发,引擎设计(三) 实验脚本编写与纸娃娃系统
- 基于时序哨兵数据的汛期监测(好文分享)
- 小米蓝牙耳机使用说明_小米10手机专用?小米“真无线蓝牙耳机Air 2s”评测
- linux u盘 驱动怎么安装步骤,怎样利用U盘加载控制器驱动安装Linux系统?
- android usb ftdi,android-Nexus7 USB主机FTDI设备未检测到
- php抓取百度风云榜,php正则获取百度音乐排行榜top500
- 圆与圆的位置关系题目含答案_直线和圆的位置关系练习题附答案
- 美乐:用优雅的方式赚钱 感性的方式做音乐
热门文章
- 163邮箱邮件被退回,什么企业邮箱可以接收国外邮件?
- 揭秘淘宝平台广告策略,拆解最佳投放实践
- 用辩证数学解答“缸中之脑”
- python调用openapi_eleme.openapi.python.sdk · PyPI
- win10关机慢!windows10关机慢
- unity自动生成敌人_unity 2d AI 敌人 自动追踪(2)
- 搭建AutoCAD License服务器
- Qt对话框与窗口的关闭和隐藏(QCloseEvent、Qt::WA_DeleteOnClose属性、Qt::WA_QuitOnClose属性)
- 硬件工程师入门和进阶
- 编译java源文件(在cmd下编译)傻瓜式教学