Oracle data buffer写入原理

因为oracle需要随时预防可能的实例崩溃现象,所以oracle在数据库的正常运行过程中,会不断的 定位这个起点,以便在不可预期的实例崩溃中能够最有效的保护并恢复数据。同时,这个起点的选择 非常有讲究。首先,这个起点不能太靠前,太靠前意味着要处理很多的重做条目,这样会导致实例再 次启动时所进行的恢复的时间太长;其次,这个起点也不能太靠后,太靠后说明只有很少的脏数据块 没有被写入数据文件,也就是说前面已经有很多脏数据块被写入了数据文件,那也就意味着只有在 DBWR启动的很频繁的情况下,才能使得buffer cache中所残留的脏数据块的数量很少。但很明显, DBWR启动的越频繁,那么所占用的写数据文件的I/O就越严重,那么留给其他操作(比如读取buffer cache中不存在的数据块等)的I/O资源就越少。这显然也是不合理的。

从这里也可以看出,这个起点实际上说明了,在日志文件中位于这个起点之前的重做条目所对应的 在buffer cache中的脏数据块已经被写入了数据文件,从而在实例崩溃以后的恢复中不需要去考虑。 而这个起点以后的重做条目所对应的脏数据块实际还没有被写入数据文件,如果在实例崩溃以后的恢 复中,需要从这个起点开始往后,依次取出日志文件中的重做条目进行恢复。考虑到目前的内存容量 越来越大,buffer cache也越来越大,buffer cache中包含几百万个内存数据块也是很正常的现象的 前提下,如何才能最有效的来定位这个起点呢?

为了能够最佳的确定这个起点,oracle引入了名为CKPT的后台进程,通常也叫作检查点进程 (checkpoint process)。这个进程与DBWR共同合作,从而确定这个起点。同时,这个起点也有一个 专门的名字,叫做检查点位置(checkpoint position)。oracle为了在检查点的算法上更加的具有可 扩展性(也就是为了能够在巨大的buffer cache下依然有效工作),引入了检查点队列(checkpoint queue),该队列上串起来的都是脏数据块所对应的buffer header。而DBWR每次写脏数据块时,也是 从检查点队列上扫描脏数据块,并将这些脏数据块实际写入数据文件的。当写完以后,DBWR会将这些 已经写入数据文件的脏数据块从检查点队列上摘下来。这样即便是在巨大的buffer cache下工作, CKPT也能够快速的确定哪些脏数据块已经被写入了数据文件,而哪些还没有写入数据文件,显然,只 要在检查点队列上的数据块都是还没有写入数据文件的脏数据块。而且,为了更加有效的处理单实例 和多实例(RAC)环境下的表空间的检查点处理,比如将表空间设置为离线状态或者为热备份状态等, oracle还专门引入了文件队列(file queue)。文件队列的原理与检查点队列是一样的,只不过每个 数据文件会有一个文件队列,该数据文件所对应的脏数据块会被串在同一个文件队列上;同时为了能 够尽量减少实例崩溃后恢复的时间,oracle还引入了增量检查点(incremental checkpoint),从而 增加了检查点启动的次数。如果每次检查点启动的间隔时间过长的话,再加上内存很大,可能会使得 恢复的时间过长。因为前一次检查点启动以后,标识出了这个起点。然后在第二次检查点启动的过程 中,DBWR可能已经将很多脏数据块已经写入了数据文件,而假如在第二次检查点启动之前发生实例崩 溃,导致在日志文件中,所标识的起点仍然是上一次检查点启动时所标识的,导致oracle不知道这个 起点以后的很多重做条目所对应的脏数据块实际上已经写入了数据文件,从而使得oracle在实例恢复 时再次重复的处理一遍,效率低下,浪费时间。

时间: 2024-11-01 05:20:06

Oracle data buffer写入原理的相关文章

Oracle Data Recovery Advisor(DRA) 数据恢复顾问

Oracle Data Recovery Advisor(DRA) 数据恢复顾问 对DBA而言,数据备份.还原是日常工作的基本功.Oracle发展到今天,自动化.智能化是一个重要的发展方向.数据库可以自动的诊断问题故障,并且解决修复错误,可能离我们并不遥远.     数据备份和还原,在Oracle DBA学习过程中,占到了很大的篇幅.从冷备份到热备份,从完全恢复到非完全恢复,这个过程中涉及了很多的技术细节和知识点.一些DBA初始接触这些概念和操作,容易被弄乱.Oracle 11g推出的Data

Oracle Freelist和HWM原理探讨及相关性能优化

oracle|性能|优化 Oracle Freelist和HWM原理探讨及相关性能优化 中兴通讯重庆研究所 游波   关键词:Freelist,HWM,存储参数,段,块,dump,优化 文章摘要:    近期来,FreeList的重要作用逐渐为Oracle DBA所认识,网上也出现一些相关的讨论.本文以FreeList为线索对Oracle的存储管理的原理进行较深入的探讨,涉及Oracle段区块管理的原理,FreeList算法等.而与FreeList密切相关的一个重用特性HWM,与sql性能密切相

Oracle update的内部原理

用ORACLE内部原理描述以下过程: 1.sqlplus user/passwd@orcl 2.update t set a=1 where b='ss'; 3.commit; 4.exit 1.sqlplus user/passwd@orcl (1).客户端SQLPLUS连接监听 (2).监听收到连接请求,Fork一个Oracle进程,作为服务器进程,同时分配一小块PGA内存. (3).服务器进程和客户端建立连接. (4).服务器进程(以下简称进程)查询USER$.PROFILE$等数据字典,

使用隐含Trace参数诊断Oracle Data Pump(expdp)故障

使用隐含Trace参数诊断Oracle Data Pump(expdp)故障  Data Pump数据泵是Oracle从10g开始推出的,用于取代传统exp/imp工具的数据备份还原组件.经过若干版本的演进和修改,Data Pump已经非常成熟,逐渐被越来越多的DBA和运维人员接受.   相对于传统的exp/imp,Data Pump有很多优势,也变得更加复杂.数据泵一个最显著的特点就是Server-Side运行.Exp/Imp是运行在客户端上面的小工具,虽然使用方便,但是需要处理数据源端和目标

Oracle Data Guard 理论知识

Oracle Data Guard 理论知识   来源:Linux社区 作者:tianlesoftware       RAC,Data Gurad,Stream是Oracle高可用性体系中的三种工具,每个工具即可以独立应用,也可以相互配合.他们各自的侧重点不同,适用场景也不同.   RAC它的强项在于解决单点故障和负载均衡,因此RAC方案常用于7*24的核心系统,但RAC方案中的数据只有一份,尽管可以通过RAID等机制可以避免存储故障,但是数据本身是没有冗余的,容易形成单点故障.   Data

Oracle Data Guard理论知识

RAC, Data Gurad, Stream 是Oracle 高可用性体系中的三种工具,每个工具即可以独立应用,也可以相互配合. 他们各自的侧重点不同,适用场景也不同. RAC 它的强项在于解决单点故障和负载均衡,因此RAC 方案常用于7*24 的核心系统,但RAC 方案中的数据只有一份,尽管可以通过RAID 等机制可以避免存储故障,但是数据本身是没有冗余的,容易形成单点故障. Data Gurad 通过冗余数据来提供数据保护,Data Gurad 通过日志同步机制保证冗余数据和主数据之前的同

Oracle内存结构详解(二) Oracle管理Buffer Cache

Buffer Cache是SGA区中专门用于存放从数据文件中读取的的数据块拷贝的区域.Oracle进程如果发现需要访问的数据块已经在buffer cache中,就直接读写内存中的相应区域,而无需读取数据文件,从而大大提高性能(内存的读取效率是磁盘读取效率的14000倍).Buffer cache对于所有oracle进程都是共享的,即能被所有oracle进程访问. 和Shared Pool一样,buffer cache被分为多个集合,这样能够大大降低多CPU系统中的争用问题. 1.Buffer c

Oracle Data Pump详解(1) 总览

从10g开始,Oracle提供更高效的Data Pump(即expdp/impdp)来进行数据的导入和导出,老的 exp/imp还可以用,但已经不建议使用.注意:expdp/impdp和exp/imp之间互不兼容,也就是说exp导出 的文件只能用imp导入,expdp导出的文件只能用impdp导入. Data Pump的组成部分 Data Pump有以下三个部分组成: 客户端工具:expdp/impdp Data Pump API (即DBMS_DATAPUMP) Metadata API(即

Oracle Data Guard学习(2) 日志传输

Oracle Data Guard从宏观上来说,主要提供以下两个服务: 1)日志传输:主库把生成的Redo日志传输至备库: 2)日志应用:备库应用从主库传输过来的Redo日志. 本文先介绍其中的日志传输服务,日志应用服务在下节<Data Guard 系列(3) - 日志应用>介绍 . 1. 日志传输方式 有两种日志传输方式(ARC和LGWR),第一种是采用ARC进程传输日志,其示意图如下: 注:上图来自<大话Oracle RAC> 其大致过程如下: 1)主库:日志先写入在线重做日志