Oracle-SGA内存结构

    Oracle数据库由 `实例` 和 `数据库` 两部分构成。Oracle数据库启动后,会在操作系统内存中划分出来一块独立的区域,并且在后台启动一些进程,而划分出来的内存和后台进程统称为 `实例`。

    `实例` 为访问数据库提供了入口,通常来说,一个数据库对应一个数据库的实例。而在某些特殊的结构中,一个数据库会对应多个数据库实例。例如,一个 `RAC` 数据库会对应至少两个数据库的实例。

    而数据库在启动过程中向操作系统内存申请的内存则称为 `SGA(System Global Area,系统全局区)`。`系统全局区SGA` 是一组共享内存结构,其中包含Oracle数据库的数据文件信息和控制文件信息。SGA提供给所有Oracle数据库的实例和后台进程共享,因此,系统全局区也被称为 `共享全局区(Shared Gloabl Area)`。

    在数据库启动后,内存中的一块独立区域(可能是提前划分好的)被用来存放Oracle数据库的一些基本信息,而这块划分出来的区域 `SGA` 通常包含以下6个部分,`Shared Pool(共享池)`、`Stream Pool(流池)`、`Large Pool(大型池)`、`Java Pool(java池)`、`Database Buffer Cache(数据库缓冲区高速缓存)` 和 `Redo Log Buffer(重做日志缓冲区)`。

如下图,为Oracle SGA内存结构图

oracle-sga.png
  • Database Buffer Cache: Oracle实例SGA内存区域至关重要的一块内存区域。主要用于提升数据库的访问性能。

      通常,当用户进程连接到数据库实例时,在数据库中会产生大量的I/O请求,而当用户进程需要查询或修改的数据库不在内存(`Database Buffer Cache`)高速缓冲区中时,不可避免需要将数据库存储在硬盘上的数据加载到高速缓存区中,而每当数据库需要从硬盘中提取数据到缓冲区时,则需要进行操作系统层面的I/O操作。
    
      而倘若用户进程连接到数据库中的查询请求的数据已经存在在 `Database Buffer Cache` 中时,数据库会直接从缓冲区中读入数据并将数据返回给用户请求。当请求数据被从数据库缓冲区中返回时,则称为一次缓存命中(hit)。显然,数据库中缓存命中可以极大提升数据库的访问性能。
    
      也因此,数据库的 `Database Buffer Cache` 内存区域的空间应该尽可能大一些,从而减少数据库进入硬盘读取数据而产生的I/O事件。
    
      但受限于操作系统内存的容量限制,`SGA` 不可能无限制的大。因此,`SGA` 内存结构中的各个结构区域也有各自的大小。而当 `Database Buffer Cache` 高速缓存区被塞满时,则需要清除掉部分不经常被访问的数据,以便将缓存中经常需要访问的数据保留下来实现更高的缓存命中率,提升数据库的访问性能。
    
    
      当下一次用户进程请求 `Database Buffer Cache` 中并不存在的数据时,数据库则会重新进入硬盘中找到并提取数据到高速缓冲区中。数据库高速缓冲区中主要包含三种类型的数据块,根据数据块的类型分为 `脏数据区(Dirty Buffers)`、`自由区(Free Buffers)`、 `保留区(Pinned Buffers)`。
    

脏数据区: 指数据库中的数据被修改后尚未写入到硬盘中。在数据库中,仅写入到磁盘中的数据才会被称为干净数据。因为数据库缓存区的数据极有可能因为各种原因无法写入到硬盘中,造成数据丢失从而导致数据库出现数据不一致的问题。

自由区: 指数据库中的干净区域,没有被使用过的区域。自由区中,数据库可以随时向该区域写入数据,通常从硬盘中读入的数据会放入干净区中。

保留区: 涉及到修改或正在操作的区域,或有其他用途的区域。

  • Shared Pool: 共享池缓存。主要用来存储可以被不同用户共享的重复SQL语句、数据字典中的信息。

      共享池是SGA中用来缓存程序数据的区域。主要包含 **可重用的SQL语句**、**数据字典信息**、**SQL存储过程**等。共享池主要包含两个部分,一部分是 `Library Cache`,另一部分是 `Data Dictionary Cache`。
    

Libray Cache 主要用来缓存用户执行过的SQL语句及PL/SQL的相关信息,缓存的主要信息包含用户执行过的SQL语句文本、执行结果及执行计划。位于该缓存区的SQL语句或执行计划同时会共享给其他不同的用户,当其他用户在数据库中执行同样的SQL语句或执行计划时,位于 Libray Cache 缓存区的执行结果将返回给其他用户而无需重新在数据库中执行一次相同的SQL语句。

    显然当数据库中有大批用户需要查询相同的数据时,使用系统的sql语句会极大提高数据库的响应速度,而这正是因为数据库的相同的SQL语句文本及执行结果、执行计划被缓存到 `Linrary Cache` 中了。

Data Dictionary Cache: 该部分缓存区主要缓存数据字典相关的一些信息,例如,用户账户数据、数据表及索引、及权限等信息。使用数据字典缓存,可以缩短数据的解析响应时间。

  • Redo Log Buffer: 重做日志缓冲区,主要用来记录数据库发生的事务变更。

      通常用户进程连接到数据库后,不可避免需要对数据中的数据进行增删改善,而涉及到被修改的数据,Oracle数据库会将被修改的数据相关信息写入到 `Redo Log Buffer` 中,最后通过 `LGWR` 后台进程将缓存区的日志写入到 Redo Log 日志文件中。
    
      需要注意的是,Oracle数据库对于已修改数据并不是数据发生修改后直接写回到硬盘的,而是将修改数据后产生的相关信息写入到日志中,而 `Redo Log Buffer` 缓存区的日志按照一定的规则将数据库变更的记录刷新到日志文件中。`Redo Log Buffer` 缓存区的容量并不会很大,而缓存区的日志写入到日志文件中也是按照数据发生修改的时间点按**顺序写入**,因此写入日志的性能要高于将数据写回到磁盘中。
    
      Redo Log 所记录的日志文件对于Oracle数据库的故障恢复有着非常重大的帮助。通过将修改后的数据写入到redo log日志文件中,即便处于缓存区的数据没有写入到硬盘上时数据库发生了故障,也能在数据库下一次启动时通过应用 redo log 日志中的记录将数据库再一次恢复到数据库崩溃前的状态,保障数据的一致性。
    
  • Large Pool: 大池,主要用于缓存数据库中的大型I/O请求。

    在一些场景下,数据库会出现大量并行查询的进程,而并行查询会产生从属进程,这些从属进程需要消耗额外的内存空间,而这些空间正式由 Large Pool 提供的。另外,在一些共享模式(Shared Server)的场景下,用户连接所需要的共享内存也会由 Large Pool 分配。在备份恢复的时候,启用异步I/O需要设置 Large Pool 以支持异步I/O模式。

  • Java Pool: java池,数据库中运行java代码时需要使用该内存区域。
  • Stream Pool: 流池。数据库中的数据可以通过 的方式共享。使用Oracle流,共享信息的每个单元称为一条消息,可以在流中共享一条条消息。

    流不仅可以在数据库中共享信息,而且支持在数据库间共享信息,使用流可以将一个数据库的信息传播到另一个数据库。

参考: SGAoracle SGA详解

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容

  • Oracle实例=内存+后台进程 Oracle数据库=实例+物理存储结构 由上图可知Oracle实例(一个Inst...
    职场亮哥阅读 343评论 0 0
  • ++ 逻辑结构(数据块, 区, 段和表空间)作为构建基础, 存储结构+数据块进程 等于 oracle实例 ++ o...
    sqlNoWhere阅读 763评论 0 4
  • 内存是Oracle数据库信息缓存和共享区域存储执行的程序代码、连接会话信息以及程序执行期间所需要的数据和共享信息 ...
    知向谁边阅读 210评论 0 0
  • Oracle数据库系统的体系结构主要讲解Oracle这款DBMS是如何设计和实现的。整体上Oracle数据库分为辅...
    __神经蛙__阅读 1,466评论 0 2
  • 阅读全文请点击http://click.aliyun.com/m/1000004613/ �Oracle数据库的体...
    rewq123阅读 210评论 0 0