Log Buffer
Log Buffer
一、Log Buffer的引入
Oracle有一个原则:只要是已经提交的数据,就不会丢失,保证数据库的一致性。这该如何实现?事物提交时,直接写入dbf中,效率是极低的。因为直接写入文件系统,buffer对应的数据块可能分布在文件系统的各个地方,提交时直接写入,会有大量的IO和寻道时间,效率极低。同时,数据库在运行过程中,不可避免的要遇到各种能够导致数据块库损坏的情况。比如突然断电、oracle或者操作系统的程序bug导致数据库内部逻辑结构损坏、磁盘介质损坏等,都有可能造成数据库崩溃,从而导致数据丢失的现象发生。Oracle引入了Log Buffer的机制,完美的解决了以上两个问题。
二、Log Buffer的实现原理
Oracle在SGA中专门开辟一块空间,用来存放Log Buffer。LogBuffer将所有数据库中所有改变数据块的操作,都原原本本的记录下来。这些改变数据块的操作不仅包括对数据表的DML或者对数据字典的DDL,还包括对索引的改变、对回滚段数据块的改变、对临时表空间的临时段的改变等。只有将数据库中所有的变化都记录下来,当发生数据库损坏时,才能够从损坏时的那一点开始,将之后数据库中的变化重新运用一遍,从而达到恢复数据库的目的。
1、日志记录方式
(1)逻辑的记录方式
逻辑的记录方式:也就是用描述性的语句来记录整个变化过程。比如对于某个update更新操作来说来说,可以记录为两条语句:delete旧值以及insert新值。这种方式的优点是非常节省空间,因为对每个操作,只需要记录几条逻辑上的语句即可。但是缺点也很明显,就是一旦需要进行恢复,就会非常消耗资源。设想一下,某个update操作更新了非常多的数据块,由于buffer cache内存有限,很多脏数据块都已经写入了数据文件。但就在更新快结束时,突然发生断电,所做的更新丢失。那么重新启动实例时,oracle需要应用日志文件里的记录,于是重新发出delete旧值以及insert新值的语句。这个过程需要重新查找数据文件中符合条件的数据块,然后再挑出来进行更新。这个过程将非常消耗时间,而且会占用大量的buffer cache。
(2)物理的记录方式
物理的记录方式,也就是将每个数据块改变前的镜像和改变后的镜像都记录下来。这种方式优点就是恢复起来速度非常快,直接根据日志文件里所记录的数据块地址和内容更新数据文件中对应的数据块。但是缺点也很明显,就是非常占用磁盘空间。
(3)ORACLE使用的日志记录方式
oracle采用了逻辑和物理相结合的方式。也就是说,oracle针对每个数据块,记录了插入某个值或者删除某个值的描述语句。假如某个update更新了100个数据块,则oracle会针对每个数据块记录一对delete旧值和insert新值的语句,共有100对这样的描述语句。通过这种方式,oracle获得了物理记录方式的快速恢复的优点,同时又获得了逻辑记录方式的节省空间的优点。
三、SQL提交过程分析
Oracle引入Log buffer之后,sql的执行和提交过程如下:

修改数据Sql的执行过程:
1、客户端通过数据库连接提交sql到oracle。
2、Oracle为该数据库连接分配一个前台进程(Server Process),和PGA。
3、PGA计算sql的hash值,根据hash值查找shared pool中的Library Cache中,是否存在该sql对应的执行计划。
4、如果有该sql对应的执行计划,则跳到下一步。如果没有,需要生产相应的最优执行计划,并将执行计划挂到Library Cache的相应位置。
5、根据执行计划,查找需要的数据,是否在buffer cache中,如果存在,则跳至下一步。如果没有,PGA需发IO指令,到文件系统中加载相应的数据块到buffer cache中。
6、修改相应的buffer。在修改的过程中,会生成相应的日志,放入PGA中。当积累到一定数量,PGA将日志写入到log buffer中。
7、提交。提交时,pga并不会调用DBWR写入数据到文件系统,而只是调用LGWR,将修改日志按顺序的记录到文件系统中。由于是按照顺序记录,所以比直接将buffer写入到dbf文件的速度快很多,因为节省了磁盘的寻道时间。
因为log buffer空间小,提交频繁,所以,此种提交方式,保证了数据的一致性。就算数据库掉电,没有来得及将脏buffer写入dbf中,也能保证已提交的数据不会丢失。因为日志文件保存了所有的buffer的变更,所以,根据日志文件,都能跑出已经提交的数据,并提交。
四、LGWR触发条件:
1、用户提交
2、有1/3的重做日志缓冲区未被写入磁盘
3、有大于1M的缓存没有写入磁盘
4、write-ahead-log日志写入优先 dbwr需要写入数据的scn大于lgwr记录的scn,dewr触发lgwr写入。
5、发生日志切换时触发LGWR。
6、每3秒调用一次。
五、日志系统的意义
1、大幅提高commit的速度
为何?Oracle提交时,调用的是日志提交。日志提交比直接写入dbf快在哪?因为计算机系统的瓶颈就是IO,而IO的瓶颈是磁头的寻道时间。由于日志记录到redo log中是按顺序记录的,而block是分布在dbf文件的各个角落。所以,写入block会有很多的磁头寻道时间。因此,日志存档会比数据入库快很多。
这里引出另一个问题。Redo log,一般是放在存储上。那应该放置在什么样的磁盘上呢?这里建议:redo log 日志,需要放到io/ps 很高的磁盘上,因为写的很频繁,量少,顺序写,不要放到red5、red6上。可以放在read10 或者read01上,最好放在固态盘上。
2、成就buffer cache的写缓存
计算机系统中,所涉及的缓存,一般都只有缓存读。每当要写入的时候,都是直接针对文件系统中的文件进行操作。而如果,直接多次修改缓存,就能实现对文件的修改,这种缓存,就叫做写缓存。存储上的缓存和oracle 的buffer cache就是典型的写缓存。
因为有日志系统的存在,server process在提交的时候,不必每次的调用DBWR将修改的脏buffer写入到dbf中,而只需将该buffer加入到LRUW链表中,不用担心buffer的改动没有保存导致数据丢失。这样就实现了buffer cache的写缓存。
Log Buffer的更多相关文章
- 14.4.4 Redo Log Buffer
14.4.4 Redo Log Buffer redo log buffer 是内存区域持有数据被写入到redo log. Redo log buffer size 是通过 innodb_log_bu ...
- 如何修改dmesg log buffer size
CONFIG_LOG_BUF_SHIFT: Kernel log buffer size (16 => 64KB, 17 => 128KB) General informations Th ...
- log buffer space等待事件
最近,我们有台服务器在delete操作期间发现一直在等待log buffer space,其他节点就没与这个问题.经查,向重做缓冲区上写入重做记录的进程,为了确保拥有重做缓冲区内必要的空间,需要获得r ...
- 关于oracle redo log buffer 你所不知道的东西
[ora11@lixora ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Wed Oct 8 09:57:50 ...
- log buffer space事件(转)
看了这篇文章: Oracle常见的等待事件说明http://database.ctocio.com.cn/tips/38/6669538.shtml 对于Log Buffer Space-日志缓冲空间 ...
- Node.js:Buffer浅谈
Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...
- 【msql】关于redo 和 undo log
InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性.和大多数关系型数据库一样,Inno ...
- 箭头函数和Buffer对象
一.箭头函数 普通函数1 var add = function (a, b) { return a + b; } 普通函数2 function add (a, b) { return a + b; } ...
- node(Buffer缓存区)
// 创建buffer类 var buf=new buffer(10); var buf=new buffer([10,20,30,40]); var buf=new buffer("www ...
随机推荐
- sql server远程备份和恢复
sql server远程备份和恢复 SQLSERVER服务实例名称:192.168.0.2需要备份的数据库名称: a备份机器名称(Client端):192.168.0.3备份机用户:zf 密码:123 ...
- MyBatis入门学习教程-MyBatis缓存
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了 package me.gacl.test; 2 import me.gacl.domain.User; import ...
- SpringMvc JSON 406,吐血。。。。
解决方法一: 1.导入jackson-core-2.5.1.jar和jackson-databind-2.5.1.jar 2.Spring配置文件添加: 1 spring3为:org.springfr ...
- maven Error resolving version for plugin 'org.apache.maven.plugins:maven-eclipse-plugin' from the repositories 解决
报错:Error resolving version for plugin 'org.apache.maven.plugins:maven-eclipse-plugin' from the repos ...
- JAVA源码走读(一) HashMap与ArrayList
HashMap 一.HashMap基本概念: HashMap是基于哈希表的Map接口的实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒 ...
- VS中的活动debug和活动cpu
“活动”的含义就是当前项目所用的模式和平台.项目中的”活动“继承于解决方案中的配置.
- 大规模IP地址黑名单高性能查询实现
嗯……前阵子接了个活儿,需要做一个基于IP地址黑名单的分流网关.刚接到的时候心想iptables不就行了么,没想到一看客户给的IP黑名单规模……我擦……上亿个…… 黑名单到了这个规模,就不得不考虑下优 ...
- 黑马程序员_ C语言基础(二)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 今天基础知识分为以下几点内容(注意:循环.条件语句在此不再赘述): 1.Hello W ...
- Mware vCenter Server 识别固态硬盘为(非SSD)是什么原因?
人工定义一下: 用root登录进ESXi控制台:esxcli storage nmp device list #列出储存清单esxcli storage nmp satp rule add -s VM ...
- mac-终端命令
发现一个比较好点的关于mac终端下命令的解释文档,全文粘贴到这,免得丢了(原文在此): Mac终端 命令行 [一]bash 终端设置 1.环境变量设置首先要知道你使用的Mac OS X是什么 ...