`

Oracle数据库中的缓存Cache

阅读更多
Cache和Buffer是两个不同的概念,简单的说,Cache是加速“读”,而buffer是缓冲“写”,前者解决读的问题,保存从磁盘上读出的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据。在很多情况下,这两个名词并没有严格区分,常常把读写混合类型称为buffer cache,本文后续的论述中,统一称为cache。

Oracle中的log buffer是解决redo写入的问题,而data buffer cache则解决data block的读写问题。对于Oracle来说,如果IO没有在SGA中命中,都会发生物理IO,Oracle并不关心底层存储的类型,可能是一套存储系统,可能是本地磁盘,可能是RAID 10,也可能是RAID 5,可能是文件系统,也可能是裸设备,或是ASM。总之,Oracle把底层的存储系统称为存储子系统。

在存储系统中,cache几乎无处不在(在后面的论述中,我们统称为cache),文件系统有cache,存储有cache,RAID控制器上有cache,磁盘上也有cache。为了提高性能,Oracle的一个写操作,很有可能写在存储的cache上就返回了,如果这时存储系统发生问题,Oracle如何来保证数据一致性的问题。

Oracle数据库(数据库培训 数据库培训机构 数据库认证 数据库专业 数据库教程 )最重要的特性是:Write ahead logging,在data block在写入前,必须保证首先写入redo log,在事务commit时,同时必须保证redo log被写入。Oracle为了保证数据的一致性,对于redo log采用了direct IO,Direct IO会跳过了OS上文件系统的cache这一层。但是,OS管不了存储这一层,虽然跳过了文件系统的cache,但是依然可能写在存储的cache上。

一般的存储都有cache,为了提高性能,写操作在cache上完成就返回给OS了,我们称这种写操作为write back,为了保证掉电时cache中的内容不会丢失,存储都有电池保护,这些电池可以供存储在掉电后工作一定时间,保证cache中的数据被刷入磁盘,不会丢失。不同于UPS,电池能够支撑的时间很短,一般都在30分钟以内,只要保证cache中的数据被写入就可以了。存储可以关闭写cache,这时所有的写操作必须写入到磁盘才返回,我们称这种写操作为write throuogh,当存储发现某些部件不正常时,存储会自动关闭写cache,这时写性能会下降。

RAID卡上也有cache,目前一般是256MB或者更大,同样是通过电池来保护的,不同于存储的是,这个电池并不保证数据可以被写入到磁盘上,而是为cache供电以保护数据不丢失,一般可以支撑几天的时间。还有些RAID卡上有flash cache,掉电后可以将cache中的内容写入到flash cache中,保证数据不丢失。如果你的数据库没有存储,而是放在普通PC机的本地硬盘之上的,一定要确认主机中的RAID卡是否有电池,很多硬件提供商默认是不配置电池的。当然,RAID卡上的cache同样可以选择关闭。

磁盘上的cache,一般是16MB-64MB,很多存储厂商都明确表示,存储中磁盘的cache是禁用的,这也是可以理解的,为了保证数据可靠性,而存储本身又提供了非常大的cache,相比较而言,磁盘上的cache就不再那么重要。SCSI指令中有一个FUA(Force Unit Access)的参数,设置这个参数时,写操作必须在磁盘上完成才可以返回,相当于禁用了磁盘的写cache。虽然没有查证到资料,但是我个人认为一旦磁盘被接入到RAID控制器中,写cache就会被禁用,这也是为了数据可靠性的考虑,我相信存储厂商应该会考虑这个问题。

至此,我们可以看到Oracle的一个物理IO是经历了一系列的cache之后,最终被写入到磁盘上。cache虽然可以提高性能,但是也要考虑掉电保护的问题。关于数据的一致性,是由Oracle数据库,操作系统和存储子系统共同来保证的。
分享到:
评论

相关推荐

    oracle数据库主键自动生成

    这个序列从 1 开始,每次增加 5, cache 20 表示缓存 20 个序号,避免频繁地访问数据库。 触发器(Trigger) 触发器是数据库的一个自动执行程序,能够在特定事件发生时自动执行某些操作。在 Oracle 数据库中,可以...

    Oracle数据库各类指标统计的SQL语句

    下面是 Oracle 数据库各类指标统计的 SQL 语句,涵盖了数据库的各种方面,包括访问报告、数据字典缓存效率、数据库块缓存效率、磁盘读取效率、索引统计等。 一、访问报告 访问报告是指当前数据库中当前解析的游标...

    Oracle数据库应用试验指导书.pdf

    数据库高速缓冲区(Database Buffer Cache) 共享存储区(Shared Pool) 重做日志存储缓冲区(Redo Log Buffer) JAVA存储区(Java Pool) 大型存储区(Large Pool) SGA总容量=共享池+缓冲区高速缓存+大型存储区...

    Oracle Cache Fusion 原理介绍

    Cache Fusion 可以实现在集群中的数据块高速传输、缓存同步和恢复机制等功能,从而提高了 Oracle RAC 集群中的性能和可用性。 Cache Fusion 的主要概念包括: 1. Cache Fusion 概念:Cache Fusion 是一种高效的...

    oracle性能调优之buffer cache

    Buffer Cache 是 Oracle 中的一种缓存机制,负责将磁盘上的数据 block 读取到内存中,以提高数据库的访问速度。在本文中,我们将详细介绍 Buffer Cache 的工作原理、状态、管理和优化方法。 Buffer Cache 的工作...

    Cache Server V1.2.0 嵌入式(实时)内存数据库(linux 32)

    Cache Server提供了和传统关系数据库管理系统(MS SQL SERVER、Oracle、Sybase、DB2、mysql)的访问接口,可以以同步或异步方式和RDBMS交互。 Cache Server内存数据库为需要容错服务的系统提供实时数据库复制功能...

    Oracle_RAC安装配置指导书

    RAC,全称real application clusters,译为“实时应用集群”, 是Oracle新版数据库中采用的一项新技术,是高可用性的一种,也是Oracle数据库支持网格计算环境的核心技术。 RAC提供的优缺点: 优点  Oracle RAC主要...

    Oracle_AWR_报告分析实例讲解.doc

    缓存大小部分显示了 SGA 中每个区域的大小,包括 Buffer Cache、Shared Pool Size、Log Buffer 等。这些信息可以帮助数据库管理员了解数据库的缓存使用情况,例如缓存是否足够大、是否需要调整缓存大小等。 分析...

    oracle实例内存(SGA和PGA)调整

    2. 缓冲区高速缓存(Database Buffer Cache):用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能。 3. 大型池(Large Pool):是 SGA 中一个可选的内存区域,仅用于 shared server 环境。 4...

    网络内存数据库

    Cache Server提供了和传统关系数据库管理系统(MS SQL SERVER、Oracle、Sybase、DB2、mysql)的访问接口,可以以同步或异步方式和RDBMS交互。 Cache Server内存数据库为需要容错服务的系统提供实时数据库复制功能...

    高能所计算中心-oracle9ias简介.pptx

    5. Database Cache:提供了一套只读、透明的中间层高速缓存解决方案,能够提高访问 Oracle 数据库的 Web 网站和应用的吞吐量和性能。 三、Oracle9iAS 的主要组件 Oracle9iAS 的主要组件包括: 1. J2EE 应用组件:...

    ORACLE9i_优化设计与系统调整

    §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1 数据文件 26 §1.2.2 控制文件 26 §1.2.3 重做日志文件 26 §...

    Oracle系统调优详解.docx

    Oracle 系统调优是指在 Oracle 数据库系统中,通过调整初始化参数以提高系统性能和稳定性。在 Oracle 8i 及以前的版本中,这些初始化参数记录在 INITsid.ora 文件中;而 Oracle 9i/10g/11g 中将这些参数记录在 ...

    Oracle DBA 参考手册

    Buffer Cache Performance Tuning(数据库缓存调整) 55 10.3.6.3. Latch Contention(加锁或插销竞争) 55 10.3.6.4. Redo Log Buffer Performance Tuning(重写日志缓冲的调整) 55 10.3.6.5. Query Performance ...

    php-dba-cache:使用数据库(dbm样式)抽象层创建缓存以缓存对象,字符串,整数或数组

    php-dba-cache使用数据库(dbm样式)抽象层来缓存/存储您PHP对象,字符串,整数或数组。 甚至SimpleXMLElement的实例都可以放入缓存中。 您不必担心缓存文件的大小。 这取决于磁盘的可用空间。 具有持久连接的Oracle...

    Oracle9i的init.ora参数中文说明

    值范围: Oracle8i National Language Support Guide 中指定的任何有效的10 字节字符串。 默认值: 从 NLS_TERRITORY 中获得 nls_date_language: 说明: 指定拼写日期名, 月名和日期缩写词 (AM, PM, AD, BC) 的语言。...

    数据库优化设计方案.doc

    二、充分利用系统全局区域 系统全局区域是数据库平台的心脏,如Oracle数据库的SGA(SYSTEM GLOBAL AREA) 。用户的进程对这个内存区发送事务,并且以这里作为高速缓存读取命中的数据 ,以实现加速的目的。正确的SGA...

    oracle系统结构

    一. Oracle的内存结构描述: 1. SGA (System Global Area) 系统全局区: (主要由以下三部分组成) ... 用于存储最近从数据库中读取出来的数据块。用户进程首先查看数据缓冲区,不在则访问物理磁盘。

    狂神说Redis笔记.pdf

    翻译为:Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。 官网:https://redis.io Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以...

    oracle动态性能表

     按照OracleDocument中的描述,v$sysstat存储自数据库实例运行那刻起就开始累计全实例(instance-wide)的资源使用情况。 类似于v$sesstat,该视图存储下列的统计信息: 1>.事件发生次数的统计(如:user commits) 2>...

Global site tag (gtag.js) - Google Analytics