-
前面在Oracle体系结构概述篇中总体介绍了Oracle的体系结构,接下来分别详细深入介绍其组成部分的各个模块的功能与作用,本篇先深入内存部分。
一.先上图:Oracle DB 内存结构图
Oracle DB 实例的两大基本内存结构(也有的说三大:SGA/PGA/UGA,但是UGA基本包含于SGA(共享服务器模式)或者PGA(占用服务器模式),本人更倾向于两大结构,即SGA和PGA):
a.系统全局区 (SGA):加载Oracle DB 实例的数据和控制信息。所有服务器进程和后台进程共享 SGA。SGA在DB启动时候即完成分配。
b.程序全局区 (PGA):包含单个服务器进程或后台进程的数据及控制信息的内存区域。PGA 是在服务器进程或后台进程启动时分配的私有内存。服务器进程对 PGA 的访问是独占式的。每个服务器进程和后台进程都具有自己的专属的 PGA。PGA 分成两个主要区: 堆栈空间和 用户全局区 (UGA);
二.系统全局区 (SGA)又细分为以下部分:
a 共享池:用于缓存可在用户间共享的各种数据结构;
b.数据库缓冲区高速缓存:用于缓存从数据库中读取到的数据块;
c.保持缓冲区池:专用的数据库缓冲区高速缓存,用于长时间在内存中保留的数据块(热数据).;
d.RECYCLE 缓冲区池:专用的数据库缓冲区高速缓存,用于从内存中快速回收或删除数据块;
e. nK 缓冲区高速缓存:多种专用的数据库缓冲区高速缓存,用于存放不同规格大小的数据块的数据;
f.重做日志缓冲区:redo信息(用于实例恢复)在写入磁盘中存储的物理重做日志文件前,缓存在此;
g. 大型池:用于为某些大型进程(例如:备份和恢复操作)和I/O 服务器进程提供大型内存分配。大型池为可选内存区域。
h.Java 池:用于存储 Java 虚拟机 (JVM) 中的 Java 代码和数据;
i. 流池:供 Oracle Streams 用来存储捕获和应用操作所需的信息;
二(1).共享池(Shared Pool)的结构:
a.数据字典(data dictionary):是数据库表和视图的集合,其中包含有关数据库、数据库结构及其用户的信息。在 SQL 语句语法分析期间,Oracle DB 会频繁访问数据字典。因此在内存中指定了两个特殊的位置来存放字典数据,所有用户进程都共享这两个高速缓存以便访问数据字典信息:
b.数据字典高速缓存(data dictionary cache):也称为行高速缓存,因为它以行的形式存放数据。
c. 库高速缓存(library cache):以缓冲区的形式存放数据(缓冲区用于存放完整的数据块)。
d. 共享 SQL 区域(含 PGA 中保留的专用 SQL 区域):用于存放数据库运行的 SQL 语句,包括 SQL 语句的语法分析树和执行计划。Oracle DB 可识别出不同用户执行了相同 SQL 语句,多次运行的 SQL 语句将会使用同一个共享 SQL 区域来节省内存。
e. 固定区域:是启动 SGA 所需要使用的内存区,其大小远小于其它 SGA 内存区块。
二(2)数据库缓冲区高速缓存(Database Buffer Cache)的结构:
用于存放从数据文件读取的数据块,当前所有用户都可以共享访问该区的缓存数据。高速缓存中的缓冲区是由一个复杂 LRU(Least Recently Used)列表算法管理,确保最近使用的块都留在内存中,从而最大限度地减少磁盘访问。
二(3) KEEP 缓冲区池是用于延长缓冲区在内存中的保留时间,比使用 LRU 时的正常保留时间长。
二(4) RECYCLE 缓冲区池有更快的缓冲区刷新速度,缩短缓存数据保留时间。
二(5) 重做日志缓冲区(Redo Log Buffer):
重做日志缓冲区是 SGA 中的循环缓冲区,存放有关对数据库所做的更改信息,包含 DML 和 DDL 等操
作所做的更改的相关信息。后台的日志写进程会适时地将此缓冲区的数据保存写入到磁盘上的活动重做日志文件(或文件组)中。
二(6)大型池(Large Pool)
大型池可以更好地满足对大型内存的请求,为以下对象提供大型内
存分配:
a. 共享服务进程和 Oracle 接口(在事务处理与多个数据库交互时使用)的会话内存;
b. I/O 服务进程;
c. Oracle DB 备份和还原操作;
d.并行查询操作;
二(7)Java 池(Java Pool)流池(Streams Pool)
a.Java 池用于存储 JVM 中所有会话的 Java 代码和数据;
b.流池 以独占方式使用流池内存来执行以下操作:
– 存储缓冲的队列消息
– 为 Oracle Streams 进程提供内存,池大小会根据需要动态增长。
三。程序全局区 (PGA)的结构:
程序全局区 (PGA) 是一个专用内存区,包含服务器进程的数据及控制信息。每个服务器进程都有独立的 PGA。PGA 只能由相应的服务器进程访问,开发人员的代码不能访问 PGA。
- 每个 PGA 都包含堆栈空间。
- 在专用服务器环境中,连接到数据库实例的每个用户都有单独的服务器进程。
-对于这种类型的连接,PGA 包含一个名为用户全局区 (UGA) 的内存分区。
UGA 包括以下部分:
① 游标区,用于存储游标的运行时信息
② 用户会话数据存储区,用于存储有关会话的控制信息
③ SQL 工作区,用于处理 SQL 语句,其中包括:
• 排序区,用于对数据排序的函数,如 ORDER BY 和 GROUP BY
• 散列区,用于执行表的散列联接
• 位图创建区,用于创建数据仓库常用的位图索引
• 位图合并区,用于解析位图索引计划的执行
- 在共享服务器环境中,多个外接的用户共享服务器进程。在这种模式下,UGA
将移入 SGA(共享池,也可配置到大型池),则 PGA 仅包含堆栈空间。
四。Oracle内存结构的相关维护操作:
四(1)针对SGA和PGA的操作:
查看 SGA 设置:
• SELECT * FROM v$sga;
• SHOW PARAMETER sga_max_size
• SHOW PARAMETER sga_target
查看 PGA 设置:
• SHOW PARAMETER pga_aggregate_target
查看自动内存设置:
• SHOW PARAMETER memory_target
• SHOW PARAMETER memory_max_target
四(2)针对数据库缓冲区高速缓存(Database Buffer Cache)的相关操作:
查看各缓冲区的大小:
• show parameter db_cache_size
• show parameter db_keep_cache_size
• show parameter db_recycle_cache_size
使用指定的缓冲区:
• ALTER TABLE customers STORAGE (BUFFER_POOL RECYCLE);
• CREATE INDEX cust_idx … STORAGE (BUFFER_POOL KEEP);
修改数据库高速缓冲区的大小:
• ALTER SYSTEM SET db_cache_size=500m;
清空数据库高速缓冲区(包括 KEEP、RECYCLE、及默认的高速缓冲区):
• ALTER SYSTEM FLUSH buffer_cache;
备注:其他部分内存结构都是系统自己调整管理,基本无需用户手动调整。
下一篇介绍Oracle的进程体系结构
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,后续不定期分享DB基本知识和排障案例及经验、性能调优等。