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的写缓存。

转载于:https://www.cnblogs.com/ironyoda/p/6051387.html

Log Buffer相关推荐

  1. Oracle - Log buffer 的相关设置

    这篇文章是参考甲骨论老相老师的教学视频: http://v.youku.com/v_show/id_XMzk2MjQ5Mzc2.html 所做的教学视频 1. 触发LGWR 将log buffer里的 ...

  2. 通过案例学调优之--和 LOG BUFFER 相关的主要 Latch

    4.1.和 LOG BUFFER 相关的主要 Latch  有:  Latch:Redo Copy       Latch:Redo Allocation Latch 4.2 当一个进程在修改数据时候 ...

  3. log buffer及日志管理深入分析及性能调整(七)

    3.2.2 其他相关的等待事件 当进程需要向日志缓冲区里拷贝重做记录时,发现没有足够的可用空间时,则必须等待log buffer space事件.如果一个进程花费了太多的时间在log buffer s ...

  4. MySQL(八):InnoDB 日志缓冲区(Log Buffer)

    1.简述 当在MySQL中对InnoDB表进行更改时,这些更改首先存储在InnoDB日志缓冲区的内存中,然后写入通常称为重做日志(redo logs)的InnoDB日志文件中. 日志缓冲区是内存存储区 ...

  5. Innodb中的buffer poll和redo undo log

    内存缓冲池 buffer pool,如果mysql不使用内存缓冲池,每次读取数据时,都需要访问磁盘,会大大的增加磁盘的IO请求,导致效率低下:在Innodb引擎在读取数据的时候,把相应的数据和索引载入 ...

  6. 必须了解的MySQL三大日志:binlog、redo log和undo log

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者: 六点半起床 juejin.im/post/68602522 ...

  7. 精讲 MySQL 事务日志:redo log 和 undo log

    来源:https://blog.csdn.net/demonson/article/details/104369733 innodb事务日志包括redo log和undo log.redo log是重 ...

  8. 必须了解的mysql三大日志-binlog、redo log和undo log

    来源:https://juejin.im/post/6860252224930070536 日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息.mysql日志主要包括错误日志. ...

  9. 在文件log 加入commit id_从物理文件理解InnoDB Redo Log

    导读 作为MySQL DBA都应该知道,Redo Log是可被覆盖的,是ACID中的D的最重要的构成部分,也就是关系型数据库中的WAL中的L. Redo Log记录的是redo,那么redo是什么呢? ...

最新文章

  1. 第02章 PyTorch基础知识
  2. 快速理解平衡二叉树、B-tree、B+tree、B*tree
  3. python 服务器_只要一行Python代码,就能搭建一个共享文件局域网服务器
  4. 【官方搭建入门】JEECG 平台开发环境搭建必读
  5. ubuntu linux 下 adb 连接andoid 设备
  6. VS2008中VC 项目 文件目录的管理
  7. C#调用C++的DLL搜集整理的所有数据类型转换方式
  8. 区块链 FISCO BCOS网络端口讲解
  9. 动易模板制作示例(一)
  10. python爬虫-book118
  11. java保护表格_java poi Excel单元格保护
  12. 技术能力和工作能力的联系和区别
  13. 【雅思阅读】王希伟阅读P3(Heading)
  14. 仿小米通讯录 右侧滑动条与带动画的悬停列表实现(一)
  15. 51单片机基础——串口通信字符串控制流水灯
  16. 测试人员的KPI考核指标
  17. 用编程Python赚钱的5个方法
  18. ajax timeout 内存溢出,setInterval 和 setTimeout会产生内存溢出
  19. 怎么做抖音故障艺术风格人物照片效果
  20. 边写边学Python(8)乘法口诀表(对齐)

热门文章

  1. 微软出资10亿美元研究AGI,意与谷歌竞争?
  2. android多线程下载原理,安卓多线程断点续传下载功能(靠谱第三方组件,原理demo)...
  3. nslookup默认服务器修改,Nslookup命令的使用 - [详细]
  4. 042_Popconfirm气泡确认框
  5. 007_Spring Data JPA JPQL
  6. wireshark读写pcap文件_PCAP-file-analysis 利用wireshark捕获tcp ip数据包和pcap文件分析 - 下载 - 搜珍网...
  7. 清华大学2017计算机录取分数线,2017年清华大学各省各批次录取分数线
  8. python导入csv文件是如何预览后10行-使用python中的csv reader只读取前N行csv文件
  9. 学会这几招设计思维让平面设计上一大台阶
  10. 添加cacti监控_小水谈监控---Cacti安装(监控)