一文搞懂oracle事务提交以及脏数据落盘的原则
本文基于oracle 19c 做事务提交以及oracle脏数据落盘的相关解读
第一章 相关进程及组件介绍:
1.LGWR:
重做日志条目在系统全局区域 (SGA) 的重做日志缓冲区中生成。LGWR 按顺序将重做日志条目写入重做日志文件。如果数据库具有多重做日志,则 LGWR 会将重做日志条目写入一组重做日志文件。
2.DBWn:
数据库写入器进程 (DBW) 将数据库缓冲区的内容写入数据文件。DBW 进程将数据库缓冲区缓存中修改的缓冲区写入磁盘。
尽管一个数据库写入器进程 (DBW0) 对于大多数系统来说已经足够了,但您可以配置其他进程(DBW1 到 DBW9、DBWa 到 DBWz 以及 BW36 到 BW99),以便在系统大量修改数据时提高写入性能。这些额外的 DBW 进程在单处理器系统上没有用。
3.CKPT:
在特定时间,CKPT 通过向 DBWn 发送消息来启动检查点请求,以开始写入脏缓冲区。在完成单个检查点请求后,CKPT 会更新数据文件头和控制文件以记录最近的检查点。
CKPT 每 3 秒检查一次,查看内存量是否超过初始化参数的值,如果是,则执行“PGA_AGGREGATE_LIMIT”中描述的操作。
4 buffer cache:
数据库缓冲区高速缓存(也称为缓冲区高速缓存)是存储从数据文件中读取的数据块副本的内存区域。
缓冲区是一个主内存地址,缓冲区管理器在其中临时缓存当前或最近使用的数据块。并发连接到数据库实例的所有用户共享对缓冲区缓存的访问权限。
数据库缓冲区缓存的用途
Oracle 数据库使用缓冲区缓存来实现多个目标。
目标包括:
-
优化物理 I/O
数据库更新缓存中的数据块,并将有关更改的元数据存储在重做日志缓冲区中。之后,数据库将重做缓冲区写入联机重做日志,但不会立即将数据块写入数据文件。相反,数据库写入器 (DBW) 在后台执行延迟写入。
COMMIT -
将经常访问的块保存在缓冲区缓存中,并将不经常访问的块写入磁盘
启用数据库智能闪存缓存(闪存缓存)后,部分缓冲区缓存可以驻留在闪存缓存中。此缓冲区缓存扩展存储在一个或多个闪存设备上,这些设备是使用闪存的固态存储设备。数据库可以通过在闪存中缓存缓冲区而不是从磁盘读取来提高性能。
使用 和 初始化参数配置多个闪存设备。缓冲区缓存跟踪每个设备,并将缓冲区均匀地分配给设备。
DB_FLASH_CACHE_FILEDB_FLASH_CACHE_SIZE
缓冲区状态

翻译出来就是:
-
闲置
缓冲区可供使用,因为它从未使用过或当前未使用过。这种类型的缓冲区是数据库最容易使用的。
-
干净
此缓冲区以前使用过,现在包含截至某个时间点的块的读取一致性版本。该块包含数据,但“干净”,因此不需要检查点。数据库可以固定块并重用它。
-
脏
缓冲区包含尚未写入磁盘的已修改数据。数据库在重用块之前必须对块进行检查点。
第二章 事务提交
当事务提交时,将发生以下操作:
-
数据库为 .
COMMIT关联撤消表空间的内部事务表记录了事务已提交的记录。事务的对应唯一SCN被分配并记录在事务表中。
-
日志写入器进程 (LGWR) 进程将重做日志缓冲区中剩余的重做日志条目写入联机重做日志,并将事务 SCN 写入联机重做日志。此原子事件构成事务的提交。
-
Oracle 数据库释放了对行和表的锁。
在未提交事务持有的锁上排队等待的用户可以继续他们的工作。
-
Oracle 数据库删除保存点。
在表 10-1 中,事务中不存在任何保存点,因此不会擦除任何保存点。
sal_update -
Oracle 数据库执行提交清理。
第三章:redo从缓冲区记录到日志文件
在以下情况下,LGWR 会写入自上次写入以来已复制到缓冲区中的所有重做条目:
-
用户提交事务。
-
发生联机重做日志切换。
-
自 LGWR 上次写信以来已经过去了三秒钟。
-
重做日志缓冲区已满三分之一或包含 1 MB 的缓冲数据。
-
DBW 必须将修改后的缓冲区写入磁盘。
在 DBW 可以写入脏缓冲区之前,数据库必须将与缓冲区更改关联的重做记录(预写协议)写入磁盘。如果 DBW 发现某些重做记录尚未写入,它会向 LGWR 发出信号,将记录写入磁盘,并等待 LGWR 完成,然后再将数据缓冲区写入磁盘。
第四章 脏数据落盘:
脏数据落盘主要由DBWn进程来完成,我们来看下官网的解释:
Process Architecture (oracle.com)

在以下情况下,DBW 进程将脏缓冲区写入磁盘:
1.描缓冲区数的阈值数后找不到干净的缓冲区
当服务器进程在扫描缓冲区数的阈值数后找不到干净的可重用缓冲区时,它会向 DBW 发出写入信号。如果可能,DBW 在执行其他处理时将脏缓冲区异步写入磁盘。
这种情况下由参数_db_block_max_scan_pct决定。_db_block_max_scan_pct表示已经扫描的buffer header的个数占整个LRU链表上buffer header总数的百分比。
当进程在辅助LRU链表和主LRU链表上扫描以查找可以覆盖的buffer header(空闲缓冲区)时,如果已经扫描的buffer header的数量达到一定的限度(由隐藏参数:_db_block_max_scan_pct决定)时,触发DBWR进程。
如果主LRUW链表和辅助LRUW链表上的脏数据块的总数超过一定限度,也将触发DBWR进程。该限度由隐藏参数:_db_large_dirty_queue决定。
查询隐含参数的方法:
-- xxx是你想查找的参数名
SELECT ksppinm, ksppstvl, ksppdesc FROM x$ksppi x, x$ksppcv y WHERE x.indx = y.indx AND ksppinm like '%xxxx%';
2.定期启动
DBW 会定期写入缓冲区以推进检查点,检查点是重做线程中实例恢复开始的位置。检查点的日志位置由缓冲区缓存中最早的脏缓冲区确定。
在许多情况下,DBW 写入的块分散在整个磁盘中。因此,写入往往比 LGWR 执行的顺序写入慢。DBW 尽可能执行多块写入以提高效率。多块写入中写入的块数因操作系统而异。
这个定期启动在ckpt解释中可以找到,每三秒执行一次,检查点会触发DBWn进程。
3.其他(这些是在网上搜集的具体没有验证)
(1)将表空间设置为离线(offline)状态时触发DBWR。
(2)发出命令:alter tablespace … begin backup,从而将表空间设置为热备份状态时触发DBWR。
(3)将表空间设置为只读状态时,触发DBWR。
(4)删除对象时(比如删除某个表)会触发DBWR。
参考:Oracle DBWR,LGWR,CKPT,ARCH 触发条件 - 墨天轮 (modb.pro)
相关文章:
一文搞懂oracle事务提交以及脏数据落盘的原则
本文基于oracle 19c 做事务提交以及oracle脏数据落盘的相关解读 第一章 相关进程及组件介绍: 1.LGWR: 重做日志条目在系统全局区域 (SGA) 的重做日志缓冲区中生成。LGWR 按顺序将重做日志条目写入重做日志文件。如果数据库具有…...
OceanBase:列存储
目录 1、列存储的定义 1、默认创建列存表 3、指定创建列存表 4、指定创建列存行存冗余表 5、行、列存储查询测试 1、列存储的定义 行存储(Row-based Storage):行存储是以行为单位进行组织和存储数据。在这一模式下,数据库将…...
Rust:WIndows 环境下交叉编译 Linux 平台程序
在Windows下交叉编译Rust程序以在x86_64位的CentOS操作系统上运行,你需要遵循几个步骤来设置交叉编译环境并编译你的程序。以下是一个大致的指南: 1. 安装Rust和Cargo 首先,确保你已经在Windows上安装了Rust和Cargo。你可以从Rust官方网站下…...
从零学爬虫:使用比如说说解析网页结构
新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、网页结构概述 示例:查看网页结构 三、使用比如说说解析网页 1.…...
C#数据类型变量、常量
一个变量只不过是一个供程序操作的存储区的名字。 在 C# 中,变量是用于存储和表示数据的标识符,在声明变量时,您需要指定变量的类型,并且可以选择性地为其分配一个初始值。 在 C# 中,每个变量都有一个特定的类型&…...
Java高级面试问题及答案
Java高级面试问题及答案 问题1: 请描述Java内存模型(JMM)及其在并发编程中的重要性。 探讨过程: 在并发编程中,多个线程之间如何协调对共享变量的访问是一个核心问题。Java内存模型定义了一组规则,来确保在多线程环境中对共享变量的修改能够…...
出现 Transaction rolled back because it has been marked as rollback-only 解决方法
目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 用户反馈的Bug如下所示: Transaction rolled back because it has been marked as rollback-only截图如下: 浏览器终端同样显示: 2. 原理分析 错误表明,在事务的生命周期内,遇到了某个异常或条件,导致该事务被标记…...
数据结构算法题day03
数据结构算法题day03 题目 题目 2.设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)算法思想: 1、常规的解法: Void reverse (sqlist &L){Elemtype temp; //辅助变量for(i 0,i < L.length; i){temp…...
深入分析C#中的“编写器”概念——代码修改、注解与重构
文章目录 1. 编写器(Writer)的概念2. 编写器的作用和工作原理3. 编写器的重要性4. 写入器常用方法5. 写入器示例6. 编写器示例——使用Fody进行代码注解和重构7. 总结 在软件开发过程中,代码的维护和更新是至关重要的。C#作为一种流行的编程语…...
uview1.0 u-form表单回显校验不通过
提交到后端的数据,回显后不做任何修改无法通过表单校验 原因,u-form表单校验的类型默认为string,但是后端返回的是integer类型,导致无法通过校验 解决,既然后端返回的是整数形,那么我们就将校验规则的type…...
监控员工电脑的软件有哪些,不得不说这几款电脑监控软件太好用了
监控员工电脑的软件在市场上种类繁多,以下是几款备受好评的电脑监控软件,它们各自具有独特的功能和优势,选择前必须了解一下才能做成正确决定。 1.安企神: 这款软件支持7天试用测试,获取测试版请移驾 ↓↓↓ 安企神…...
【MySQL精通之路】索引优化(2)
目录 1 MySQL如何使用索引 2 主键优化 3 空间索引优化 4 外键优化 5 列索引 6 多列索引 7 验证索引使用情况 8 InnoDB和MyISAM索引统计集合 9 B树索引与哈希索引的比较 9.1 B-树索引特征 9.2 哈希索引特征 10 索引扩展的使用 11 优化器使用生成的列索引 12 不可见…...
VUE3 学习笔记(5):数组处理、计算属性与函数、class与Style绑定
数组监测处理方法 VUE 提供了关于数组处理的直接方法,但并非全部都是可以处理的 如下可以直接处理: .push --向数组中增加 .pop --从数组中最后减去一个元素 .shift --从数组中第一个减去一个元素 .unshift --在数组中的头部添加一个元素 .splice --自定…...
基于springboot实现大学生一体化服务平台系统项目【项目源码+论文说明】
基于springboot实现大学生一体化服务平台系统演示 摘要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统大学生综…...
惠海 H6902B 升压恒流芯片 太阳能 风扇灯 应急灯 支持3.7V 5V 7.4V
惠海H6902B升压恒流驱动芯片是一款专为LED照明应用设计的驱动方案。该芯片具有多项产品特征,能够满足多种LED照明需求。 适用于多种电压输入范围(2.7V-80V)并具备效率(达95%以上)和工作频率(1MHzÿ…...
体验SmartEDA的高效与便捷,电子设计从未如此简单
SmartEDA:革新电子设计,让高效与便捷触手可及 在快节奏的现代生活中,科技日新月异,各行各业都在寻求更高效、更便捷的解决方案。对于电子设计行业而言,SmartEDA的出现,无疑是一场革命性的变革。它以其高效…...
LangChain笔记
很好的LLM知识博客: https://lilianweng.github.io/posts/2023-06-23-agent/ LangChain的prompt hub: https://smith.langchain.com/hub 一. Q&A 1. Q&A os.environ["OPENAI_API_KEY"] “OpenAI的KEY” # 把openai-key放到环境变量里&…...
金融序列的布朗运动
https://zhuanlan.zhihu.com/p/659164160 python金融衍生品定价系列之一 —— 布朗运动与伊藤公式 导语:网络上和书本上关于期权定价相关的内容已经较为丰富,但将理论和python代码结合起来讲的却很少,这也是python金融衍生品定价系列的写作初衷,在用python实现相关模型的同…...
利用ChatGPT辅助数学建模竞赛:理清思路、解题技巧与实战经验
导言 数学建模竞赛是许多学生在学术领域追求卓越的重要途径之一。然而,竞赛题目的复杂性常常让人望而生畏。在这样的情况下,利用人工智能工具,如ChatGPT,可以极大地辅助我们快速理清思路、解题技巧与实战经验。本文将探讨如何利用ChatGPT在数学建模竞赛中取得更好的成绩,…...
Java基础——Optional
Optional 类主要解决的问题是臭名昭著的空指针异常NPE(NullPointerException) 在 Java 8 之前,任何访问对象方法或属性的调用都可能导致 NullPointerException: String isocode user.getAddress().getCountry().getIsocode().to…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
