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数据库,操作系统和存储子系统共同来保证的。
分享到:
相关推荐
1. **缓冲区缓存(Buffer Cache)**:这是Oracle数据库中最主要的缓存机制,用于存储最近访问过的数据块。当数据被请求时,如果在缓存中找到,就直接从内存中读取,避免了慢速的磁盘I/O。缓冲区缓存的大小可以通过...
### Oracle数据库中的db_cache_size与granule_size详解 #### 一、db_cache_size参数解析 **1. 参数定义** - **名称**: `DB_CACHE_SIZE` - **类型**: 大整数(Biginteger) - **语法格式**: `DB_CACHE_SIZE = ...
- **读取块**: 从磁盘读取必要的数据块到数据库缓冲区高速缓存(Buffer Cache)。 - **应用过滤条件**: 应用WHERE子句中的过滤条件。 - **连接表**: 如果查询涉及多个表,则执行表连接操作。 - **排序和分组**: ...
本文将详细介绍Timesten如何定义cache,并探讨它与Oracle数据库之间数据同步的具体机制。 #### 二、Timesten为何如此之快 Timesten之所以能够在处理数据时展现出极高的效率,关键在于以下几个方面: 1. **内存驻留...
《Oracle数据库性能优化实践指南》是一本专注于Oracle数据库性能调优的专业书籍,旨在帮助读者深入理解和掌握如何在实际环境中提升Oracle数据库的运行效率。Oracle数据库是全球广泛使用的大型企业级数据库管理系统,...
在企业级应用中,Oracle数据库因其稳定性和高效性而被广泛采用。然而,随着数据量的急剧增长和业务需求的不断变化,优化Oracle数据库性能成为确保系统高效运行的关键。本文将深入探讨Oracle数据库调优配置中的两种...
当数据库需要读取或修改数据时,它会尝试首先从Buffer Cache中查找,而不是直接访问速度较慢的磁盘。这种机制大大提高了数据存取的效率,减少了I/O操作,进而提升了整体数据库性能。 Buffer Cache的工作原理是基于...
### Oracle数据库巡检报告知识点...以上内容涵盖了Oracle数据库巡检报告中的主要检查项,通过对这些关键指标的定期监控与维护,可以有效预防和解决数据库运行过程中可能出现的各种问题,保障业务系统的稳定性和可靠性。
内存结构中的SGA(System Global Area)是Oracle数据库的核心组件,主要包括三个部分:数据高速缓存(Buffer Cache)、重做日志缓冲区(Redo Log Buffer)和共享池(Shared Pool)。数据高速缓存存储最近访问的数据...
SGA是Oracle数据库在操作系统内存中分配的一块区域,大约占总内存的60-70%。主要组成部分包括共享池(shared pool)、数据缓冲区(database buffer cache)和重做日志缓冲区(redo log buffer)。 - 共享池:存储...
- 数据缓冲区(Database Buffer Cache):缓存最近访问的数据块,减少磁盘I/O。 - 重做日志缓冲区(Redo Log Buffer):记录对数据库所做的更改,用于恢复。 - Java池(Java Pool):存储Java代码和数据。 - ...
Oracle数据库体系架构是复杂而强大的,为了解析Oracle数据库的关键知识点,我们首先需要了解Oracle数据库的组成基础和整体架构。 Oracle数据库由数据库实例和数据库文件组成。数据库实例是指启动数据库时在内存和...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,尤其在企业级应用中占据重要地位。本文将深入探讨Oracle数据库的基础知识,包括其体系结构、内存结构、实例、会话、事务、后台进程以及SQL语句的执行流程。 ...
ORACLE数据库的内存结构主要包括Shared Pool、Database Buffer Cache和Redo Log Buffer等。Shared Pool用于存储共享的数据库对象,Database Buffer Cache用于缓存频繁访问的数据块,Redo Log Buffer用于缓存redo日志...
- Smart Flash Cache:使用固态硬盘作为缓存层来加速数据读取速度。 #### 六、Oracle云服务 - **Oracle Cloud Infrastructure (OCI)**: - 提供全面的IaaS、PaaS及SaaS解决方案,支持企业级应用程序部署与管理。...
- SGA是Oracle数据库运行时在操作系统内存中分配的一块区域,包含共享池(shared pool)、数据库缓冲区(database buffer cache)和重做日志缓冲区(redo log buffer)。 - **共享池**存储PL/SQL代码、SQL语句解析...
2. **数据库缓存区**(Database Buffer Cache):也称为数据缓冲区,是SGA的核心,用于存储最近访问过的数据块的副本,从而减少了对物理磁盘的I/O操作。 3. **大型池**(Large Pool):主要用于RMAN恢复、备份操作...
1. **表空间(Tablespace)**:表空间是Oracle数据库中的逻辑存储单元,用于组织和管理数据文件。一个数据库可以包含多个表空间,而每个表空间由一个或多个数据文件组成。 - **系统表空间(System Tablespace)**:默认...