https://www.jianshu.com/p/6c87cb6cd320

读与写是每个数据库提供的最基本的功能。当数据库中出现第一个进程时,总免不了要将数据从磁盘上加载到内存中,一次数据库的物理I/O由此发生。而这对应着数据库的读事件。通常大多数情况下,数据库中不仅会伴随着大量的读,也会产生大量的写入更新操作,而类似写入更新的操作则需要将修改后的数据写回到磁盘中。

显然,对于读操作来说,总是依据需要读取数据的请求从磁盘上或内存中找到对应满足的数据返回给客户端。也就是说,读操作必定是伴随着客户端会话的请求而出现的。那么,写操作在数据被更新/修改后是如何写回到磁盘中的?

Oracle实例在启动时在内存中划分了一块区域,被称作 SGA(System Global Area,系统全局区)。其中共有6大内存区域,缓冲数据库中的数据部分的内存区域则称为 Database Buffer Cache(数据库高速缓存区)

Database Buffer Cache 主要用来提高数据的访问性能,避免访问数据库过程中出现大量的磁盘读写。可见,Database Buffer Cache 存在的意义不仅在于缓存数据库中读的数据,而且需要提升数据库的写性能。既然如此,数据被修改或更新后也不是立刻会写回到磁盘中的,而应该有一定的规则将数据缓存区中的数据写回到磁盘中。而实现这一机制的,则是 DBWR(Database Writer)

后台进程-DBWR

DBWR 是Oracle数据库中的一个后台进程,用于将 Database Buffer Cache 中的被修改的数据写回到磁盘中。在数据库中,数据最先从磁盘上读取数据并加载到内存中,此时的数据并没有被任何的用户进程修改过,这种类型的数据称为 Cleaning Data。而当数据库中的数据被用户进程修改了某些字段的值后,因为数据是在内存中被修改的,修改后的数据(内存中)因为与磁盘上的数据文件中记录的数据已经发生了不同,因此这部分被修改过的数据被称为 Dirty Data。当内存区域中的 Dirty Data 被 DBWR 进程写入到磁盘上后,数据文件又恢复 Clenaing 状态,这个过程称为 刷脏

内存中的数据是无论如何也要写回到磁盘中的,这一点是确定无疑的。但更困难的问题在于以什么样的机制将数据写回到磁盘。

针对这个问题,或许有很多中解决方案。或者写入发生在数据修改的那一刻,或者定时定量将数据写回到磁盘,或者由其他机制(进程)触发写入操作,或许都是可行的方案。

先说说写入发生在数据修改的那一刻的情况,这种情况下数据库中发生一次数据修改后,就需要立刻将数据写回到磁盘中。显然,一旦这么做会在数据库中产生大量的物理写入,而过多的物理I/O会降低数据库的性能,显然,修改即写入无法满足数据库的性能要求,但这种方式或许是保障数据不会丢失的好办法。

接着是定时定量将内存中的数据写回到磁盘中,这种方式也是 DBWR 机制中的一种。与修改即写入不同的是,被修改的数据会在内存中保留一段时间,直到达到数据库后台进程 DBWR 设定(默认)的时间阈值后,一次将内存中被修改的数据块写回到磁盘中。相比修改即写入,定时定量将内存区域被修改的数据块则可以避免可能发生在数据库中的大量物理I/O问题,从而提高数据库的访问性能。

DBWR 后台进程中也是定时定量对 数据库高速缓存区 中的数据进行写回到磁盘操作的。在Oracle中,DBWR 每隔3s启动一次进程将数据写回到磁盘中;另一种情况是当内存中的脏数据块占比达到一定限制后,也会触发 DBWR 进程将脏数据刷回到磁盘中去。

再来说按规则(机制)将内存中的数据写回到磁盘的情况。这种方式类似于定时定量的方式,都是以某一种设定条件作为触发 DBWR 写数据的依据。在Oracle中,则是使用 CKPT 检查点作为触发 DBWR 的条件。

当数据库发生检查点事件时,后台进程 DBWR 会被启动,并将当前内存区域中的脏数据统一写回到磁盘中的数据文件。数据中的检查点回周期性的执行,以此保证内存中的数据可以有效的被写回磁盘。

后台进程-LGWR

数据库中 DBWR 进程触发时,会响应启动另一个后台进程-LGWR,用于将数据库中数据变更的历史记录到日志文件中。并且,DBWR 后台进程在 LGWR 进程写入重做日志期间会保持阻塞状态,当 LGWR 写入日志完成后,DBWR 开始将内存中的数据写入到磁盘中。

在 SGA 内存区中,保存重做日志的区域称为 Redo Log Buffer(重做日志缓存区),当需要将数据修改对应的日志记录到日志文件中时,会触发 LGWR 后台进程将缓存区的日志写入到重做日志文件中。

在Oracle数据库中,日志的完整性是十分重要的。绝不仅仅只是记录,当实例异常故障后再恢复时需要应用重做日志文件,将数据库恢复到故障前一刻的状态。只有被写入重做日志中的数据,在内存区域被修改的数据才算是安全的。

与数据何时写回到磁盘一样,数据库日志缓存区的日志也需要根据一定的规则将日志文件记录到重做日志文件中。触发 LGWR 进程写入日志的情况包含以下几种:

当用户进程执行了 rollback(回滚) 或 commit(提交) 事件时,数据库会启动后台的 LGWR 进程,将相应的数据变更的记录记录到联机重做日志文件中;同样,当内存区域的日志缓存区的空间不够用时,也会触发 LGWR 后台进程将日志缓存区的日志写入到重做日志中。

与 DBWR 一样,LGWR 也会每隔3s将日志缓存区的日志写入到重做日志中。

redo log buffer 内存区域的日志占用的空间达到一定限制后(默认超过日志缓存区1/3的空间时),触发 LGWR 后台进程开始将缓存区的日志写入到重做日志中。

最后,LGWR 写日志时会根据日志出现的先后顺序将内存区域的日志顺序的写入到日志文件中,是为了数据库恢复时按照数据被修改的先后顺序应用redo,保证数据的正确性和一致性。

[转帖]DBWR与LGWR的写入机制的更多相关文章

  1. 谈谈MySQL bin log的写入机制、以及线上的参数是如何配置的

    目录 一.binlog 的高速缓存 二.刷盘机制 三.推荐的策略 推荐阅读 问个问题吧!为什么你需要了解binlog的落盘机制呢? 我来回答一下: ​ 上一篇文章提到了生产环境中你可以使用binlog ...

  2. android log写入机制

    这几天和华为的leader面试了下.感觉不错.关键是小女.不容易.是技术面啊.我说的不容易不是面试不容易,是说在华为写代码的小女不容易.哥走南闯北这么多年,女人代码写的好真不多. 其实在任何时候,只要 ...

  3. HDFS深度历险 之 从客户端逻辑看HDFS写入机制

    说明 除了标注之外,本文纯属原创,转载请注明出处:https://www.jianshu.com/p/ea6ef5f5b868, https://www.cnblogs.com/monkeyteng/ ...

  4. Linux系统的数据写入机制--延迟写入

    我们都知道,在Linux关机的之前都会要运行一个命令那就是sync,这个命令是同步的意思,那为什么要运行这个?而且之前的数据改变我们已经看见了,为什么还要运行这个命令?要回答这个问题就要说一下Linu ...

  5. Oracle物理体系结构

    一.ORACLE 物理体系结构 原理结构图 各部分解释: PGA: 私有内存区,仅供当前发起用户使用. 三个作用 用户登录后的session信息会保存在PGA. 执行排序,如果内存不够,oracle会 ...

  6. 【Oracle】物理体系结构

     一.ORACLE 物理体系结构 原理结构图 各部分解释: PGA: 私有内存区,仅供当前发起用户使用. 三个作用 用户登录后的session信息会保存在PGA. 运行排序.假设内存不够,orac ...

  7. Mongo写入安全机制

    写入安全(Write Concern) 是一种客户端设置,用于控制写入的安全级别.默认况下,插入.删除和更新都会一直等待数据库响应(写入是否成功),然后才会继续执行.通常,遇到错误时,客户端会抛出一个 ...

  8. Oracle Redo Log 机制 小结(转载)

    Oracle 的Redo 机制DB的一个重要机制,理解这个机制对DBA来说也是非常重要,之前的Blog里也林林散散的写了一些,前些日子看老白日记里也有说明,所以结合老白日记里的内容,对oracle 的 ...

  9. Oracle 后台进程(三)LGWR进程

    一.LGWR进程简介 LGWR,是Log Writer的缩写,也是一种后台进程.主要负责将日志缓冲内容写到磁盘的在线重做日志文件或组中.DBWn将dirty块写到磁盘之前,所有与buffer修改相关的 ...

  10. LGWR和DBWn的触发条件

    Rolling Forward(前滚) Oracle启动实例并加载数据库,然后通过Online Redologs中的重做日志,重现实例崩溃前对数据库的修改操作.在恢复过程中对于已经提交的事务,但尚未写 ...

随机推荐

  1. jumpserver连接ecs实例报错:UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh_exchange_identification: Connection closed by remote host", "unreachable": true

    报错分析思路: 1.是ssh密钥设置有没有对接 2.防火墙拦截问题 3.用户设置问题 4.sshd配置问题 问题解决: 无法与221.229.216.39端口35846进行协商:找不到匹配的主机密钥类 ...

  2. js-audio-pluging(录音)

    安装 npm i js-audio-recorder 代码 <template> <div class="BaseRecorder"> <div cl ...

  3. Cesium案例解析(七)——Layers在线地图服务

    目录 1. 概述 2. 案例 2.1. Blue Marble 2.2. ArcGIS地形 2.3. Cesium地形 2.4. Natural Earth II 2.5. Earth at Nigh ...

  4. 打通Rasa Action Server和LLM接口的尝试方法

      本文使用最简单的方法对打通 Rasa Action Server 和 LLM 接口进行了尝试,即当 Rasa 对话 intent 为 out_of_scope 时,调用 action_gpt_fa ...

  5. 执行计划缓存,Prepared Statement性能跃升的秘密

    摘要:一起看一下GaussDB(for MySQL)是如何对执行计划进行缓存并加速Prepared Statement性能的. 本文分享自华为云社区<执行计划缓存,Prepared Statem ...

  6. 即使不会node.js,拖拽就可完成数据的可视化展示

    摘要:node-red是一款基于Node.js的开源可视化界面开发工具,不需要掌握node.js而通过拖拽即可完成数据的可视化展示. 1.首先看一下node-red对数据的渲染效果 你可能认为,必须熟 ...

  7. 火山引擎DataLeap:助你实现从数据研发1.0到数据研发3.0的跨越

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,火山引擎开发者社区 Meetup 第 12 期暨超话数据专场在深圳举办,本次活动主题为"数智化转型 ...

  8. 【Django drf】认证类 权限类 频率类 过滤类 排序类 分页类

    目录 认证类 前期准备 自定义认证类 配置认证类 全局配置 局部禁用 认证组件使用步骤 基于类中方法的认证(了解) 权限类 前期准备 重写has_permission() 添加权限不足信息 权限组件使 ...

  9. 新零售标杆 SKG 全面拥抱 Serverless,敏捷交付

    副标题:SKG 渠道中台借助 SAE +大禹打造云原生 DevOPS,提效 60% 作者:陈列昂(SKG).昕辰.龙琛.黛忻 项目背景 未来穿戴健康科技股份有限公司(SKG)是一家专注为个人与家庭提供 ...

  10. Vue-pdf实现在线预览PDF文件

    前言 在大多数项目中都会遇到在线预览PDF文件,项目使用的是element ui,使用vue-pdf实现. 安装依赖 npm install --save vue-pdf 相关参数 参数介绍: url ...