redo机制详解——做好数据的第一层安保

仅仅是个人对redo运行机制的理解,不对的地方,希望筒子们指出,共同学习。如果你想让你对redo的理解更加清晰,那么可以选择继续看下去。

redo存在的根本意义:

大家都知道数据库修改数据是在buffer cache中进行修改的,然而在commit之后,并不会马上写入数据文件(no-force-at-commit策略),因为这样零散的写出非常消耗资源,而且IO从来都是最有可能是性能瓶颈的地方,但是为了保证提交后的数据能够在故障后可以被恢复,这就产生了redo机制,通过将数据库的修改操作记录到redo log buffer中,写出到redo文件中,来推迟数据的写出,达到批量处理的效果,提高了效率。所以redo 对于数据库是极其重要的。

redo机制的组成:

redo机制,包含三大组件:redo log buffer,LGWR后台进程,redo log file日志文件(如果归档模式下还有arch后台进程以及归档

日志文件);

如果每产生一次redo就要写入到redo log file中,这同样也会产生IO的问题,同时在高并发的环境下还会引发redo log file的争用,所以就产生了 redo log buffer(oracle分配的一块内存区域,存在于SGA中,循环使用),但是该内存区域是循环使用的这就需要一个后台进程来不断的将log buffer 中的内容写出到redo log file中,这也就是LGWR的作用,同时 redo log file同redo log buffer一样也是循环使用的,那怎么来保证数据的安全性呢? 所以每次log switch的时候都会出发一次检查点,促使DBWR进程将写满的redo log file保护的脏数据写出到数据文件中,这样在检查点完成之后,redo log file 就变成了 inactive 状态,就可以被清空重用了。

redo 机制详解:

redo log buffer:

redo entries(redo 条目):包含了重构,重做数据库的变更信息,这些信息包括update,insert,delete,drop,alert,create 等;

一个redo 条目,是在用户全局区(PGA)中产生的,然后由oracle服务进程拷贝到redo log buffer中去,再一定条件下由LGWr后台进程写入到redo log file中。由于redo log buffer是共享的内存区域,在高并发的系统中,可能会出现redo log buffer争用的情况,这就产生了latch机制,log buffer由redo_allocation_latch保护,服务进程必须先获取到redo_allocation_latch才能分配相应log buffer;

redo条目写入到redo log buffer的过程如下:

1>redo并行机制:

高并发的环境下,必然会redo_allocation_latch的争用(redo log buffer 只有一个redo_allocation_latch),为了减少redo_allocation_latch的等待,在oracle9.2中,引入了log buffer的并行机制。

2>Share strand:

将log buffer划分成多个小的buffer,这些小的buffer称作strand,也叫shared strand,每个strand有一个redo_alloction_latch的保护,以前顺序的redo buffer的分配变成了现在的多个strand出现以后的并行的过程,大大提高了效率。

3>Priate strand:

为了进一步提高降低redo buffer的争用,oracle10g引入了一个新的机制---priate strand,priate strand不是在PGA中产生的,而是在share pool中分配的一块共享内存区域,每个priate starand由一个redo_allocation_latch保护,而每个priate strand只会服务于一个活动的事务,获取到priate strand的事务,不会再PGA中产生redo,而是在priate strand中产生,当flash priate strand或者commit的时候,priate strand将被批量写入到redo log file中;如果事务获取不到priate strand,那么将会继续遵循旧的log buffer机制,即shared strand,所以当告警日志出现Private strand flush not complete  可以选择忽略不管。

上面提到,priate strand会在flush/commit的时候直接写入到redo log file,而不经过redo log buffer,这就减少了对share strand的redo_allocation_latch的申请,提高了效率;

priate strand的过程如下:

注意:在没有获取priate strand的redo_allocation_latch成功的事务结束前,即使有其他的事物结束释放latch,该事物也不会再去申请priate strand的redo_allocation_latch;

LGWR后台进程:

Redo log buffer 是一块共享的循环使用的内存区域,LGWr就负责适时的将其脏的日志快释放掉,提供新的日志快供下次使用。其是顺序写入日志文件中,而不像DBWr那样随机写入,所以速度快的多;

LGWr的触发条件:

  • commit/rollback语句操作的时候
  • 当整个日志信息的数量达到日志缓冲区的1/3时,或者日志信息数量达到1M的时候会触发LGWr,这两个触发条件都是因为一个隐藏
  • 参数_log_io_size来定的,所以如果LGWr触发频繁的情况,可以选择将该参数设置成3M,这样1/3和1M便成了一个触发条件了。
  • 每个3秒触发一次
  • 当DBWr被触发,写出数据之前,会判断该部分数据信息有没有记录到日志文件,如果没有,便会将需要写入日志的block放入一个
  • 队列中,触发LGWr去写出,完成后DBWr才会继续写出数据到数据文件。

redo log file:

相关的视图:

SELECT * FROM v$log;

SELECT * FROM v$logfile;

SELECT * FROM v$archived_log;

SELECT * FROM v$recover_file;

SELECT * FROM v$log_history;

SELECT * FROM V$loghist;

重做日志文件状态:

  • UNUSED :表示该联机重做日志文件组对应的文件还从未被写入过数据,通常刚刚创建的联机重做日志文件组会显示成这一状态。当日志切换到这一组时,就会改变状态
  • CURRENT :表示当前正在使用的日志文件组。该联机重做日志组是活动的。当前Oracle数据库正在使用的联机重做日志文件组。
  • ACTIVE : 表示该组是活动的但不是当前组,实例恢复时需要这组日志。如果处于这一状态,表示当前日志组正在归档,如果当日志切换的时候全备都是active状态,就会在告警日志中产生     checkpoint not complete信息,并且伴随着cannot allocate new     log的错误信息, 反应到等待事件就是log file sync;
  • INACTIVE:表示实例恢复已不再需要这组联机重做日志组了。表示对应的联机重做日志文件中的内容已被妥善处理,该组联机重做日志当前处于空闲状态
  • CLEARING:表示该组重做日志文件正被重建(重建后该状态会变成UNUSED)。
  • CLEARING_CURRENT:表示该组重做日志重建时出现错误。
时间: 2024-10-10 07:15:21

redo机制详解——做好数据的第一层安保的相关文章

LINux网络的NAPI机制详解一

在查看NAPI机制的时候发现一篇介绍NAPI引入初衷的文章写的很好,通俗易懂,就想要分享下,重要的是博主还做了可以在他基础上任意修改,而并不用注明出处的声明,着实令我敬佩,不过还是附上原文链接! http://blog.csdn.net/dog250/article/details/5302853 处理外部事件是cpu必须要做的事,因为cpu和外设的不平等性导致外设的事件被cpu 当作是外部事件,其实它们是平等的,只不过冯氏机器不这么认为罢了,既然要处理外部事件,那么就需要一定的方法,方法不止一

Shiro的Filter机制详解---源码分析

Shiro的Filter机制详解 首先从spring-shiro.xml的filter配置说起,先回答两个问题: 1, 为什么相同url规则,后面定义的会覆盖前面定义的(执行的时候只执行最后一个). 2, 为什么两个url规则都可以匹配同一个url,只执行第一个呢. 下面分别从这两个问题入手,最终阅读源码得到解答. 问题一解答 相同url但定义在不同的行,后面覆盖前面 如 /usr/login.do=test3 /usr/login.do=test1,test2 不会执行test3的filter

Hibernate 所有缓存机制详解

Hibernate 所有缓存机制详解 hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户.也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和线程绑定了. hibernate一级缓存生命周期很短,和session生命周期一样,一级缓存也称session级的缓存或事务级缓存.如果tb事务提交或回滚了,我们称session就关闭了,生命周期结束了. 缓存和连接池的区别:缓存和池都是放在内存里,实现是一样的

Java反射机制详解

Java反射机制详解 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制. 1.关于Class 1.Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性    2.对象照镜子后(反射)可以得到的信息:某个类的数据成员名.方法和构造器.某个类到底实现

JavaScript 运行机制详解

JavaScript 运行机制详解——转载: 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. JavaScript的单线程,与它的用途有关.作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM.这决定了它只能是单线程,否则会带来很复杂的同步问题.比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另

JVM的垃圾回收机制详解和调优

JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作. 1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作. 在充分理解了垃圾收集算法和执行

心跳机制详解

应用场景: 在长连接下,有可能很长一段时间都没有数据往来.理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的.更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉.在这个时候,就需要我们的心跳包了,用于维持长连接,保活 什么是心跳机制? 就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有收到客户端信息则视客户端断开. 发包方:可以是客户也可以是服务端,看哪边实现方便合理. 心跳包之所以叫心跳包是因

sqlserver锁机制详解(sqlserver查看锁)

简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于 大多数数据库来说是需要同时处理多个查询的.这些查询并不会像绅士那样排队等待执行,而是会找最短的路径执行.因此,就像十字路口需要一个红绿灯那 样,SQL Server也需要一个红绿灯来告诉查询:什么时候走,什么时候不可以走.这个红绿灯就是锁. 图1.查询可不会像绅士们那样按照次序进行排队 为什么需要锁 在开始谈锁之前,首先要简单了解一下事

Android应用AsyncTask处理机制详解及源码分析

[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个知识点.前面我们分析了Handler异步机制原理(不了解的可以阅读我的<Android异步消息处理机制详解及源码分析>文章),这里继续分析Android的另一个异步机制AsyncTask的原理. 当使用线程和Handler组合实现异步处理时,当每次执行耗时操作都创建一条新线程进行处理,性能开销会比