- 1
- 0
- 约4.5千字
- 约 10页
- 2016-06-12 发布于湖北
- 举报
Oracle的软体结构
总体说来oracle的软体结构是针对内存和进程而言的。在oracle中每个数据库至少有一个实例与之对应。启动数据库时首先是在内存中创建一个实例,然后由实例加载并打开数据库。当用户连接数据库时,实际上是连接到实例中,然后由实例负责与数据库通信进行交互工作。
Oracle实例主要由两部分组成:
????????? 实例的内存结构
????????? 实例的进程结构
1.???? 实例的内存结构
Oracle实例在启动时,在内存中创建一个内存结构用以保存数据库实例在运行过程中所处理的数据。
实例内存结构的划分:
????????? SGA区(系统全局区,system global area):其位于系统的共享内存段中,可以被所有的服务和后台进程共享。
????????? PGA区(程序全局区,program global area):保存的是某个服务进程私有的数据和控制信息。
其主要包括的数据有:
????????? 缓存的数据。
????????? 解析后sql或PL/SQL程序代码
l???????? 数据库用户的会话信息
????????? 后台进程所需的共享信息和数据
a. SGA区
SGA区是oracle实例的主要组成部分。在这个区中保存着oracle系统和用户的共享信息。
其内存结构主要包括(参照上图):
????????? 数据库缓存-在缓冲区高速缓存中
????????? 重做日志缓存-在缓冲区高速缓存中
????????? 共享池-在共享池中
????????? Java池-在java池中
????????? 大型池-在大型池中
????????? 数据字典缓存-在共享池中
????????? 保存其他控制信息的结构-在共享池中
一般来说oracle会自动管理SGA区的各项参数。但是SGA区的整体大小不能超过初始化参数SGA_MAX_SIZE。
当然为了优化性能,最好将SGA区全部放在物理内存中,可以设置初始化参数LOCK_SGA为true来锁定其只能使用物理内存而不能使用虚拟内存。如图:
能够影响SGA区大小的初始化参数主要有:
????????? DB_CACHE_SIZE:设置数据库缓存大小
????????? LOG_BUFFER:设置从做日志缓存大小
????????? SHARED_POOL_SIZE:设置共享池大小
????????? LARGE_POOL_SIZE:设置大型池大小
当然假如你想用sql*plus查看一下当前SGA的分配情况,可以使用show sga命令,如图:
下面我们开始详细的讲一下SGA里的各个内存结构。
????????? 数据库缓存
顾名思义这个缓存区是用来保存最近从数据文件中读取的数据块的。为什么数据库都喜欢大内存?就是因为数据库喜欢将数据保存在内存中进行处理,毕竟在内存中进行处理要比在硬盘上处理要快的多。
数据库缓存块类型:
脏缓存块:保存已经修改过的数据,这些数据即将被保存到硬盘上了。
空闲缓存块:不包含任何数据。
命中缓存块:正在被用户访问的缓存块
缓存块的管理方式:
脏缓存块列表:包含已经被修改并需要重新写入硬盘的缓存块
LRU列表:包含所有空闲缓存块,命中缓存块以及那些还没来得及移入脏缓存块列表的脏缓存块。
数据库缓存也被分为几个独立的缓存池:
KEEP缓存池:对应的初始化参数BUFFER_POOL_KEEP,在keep 缓存池中的缓存块始终保留在数据库缓存中。
RECYCLE缓存池:对应的初始化参数BUFFER_POOL_RECYCLE,在recycle缓存池的缓存块一旦用完立即交给系统内存。
DEFAULT缓存池:DB_CACHE_SIZE减去上面2个参数值机为default缓存池大小,如果对象没有指定所使用的缓存池,他们的缓存块将放置在default缓存池中。
????????? 重做日志缓存
重做日志缓存位于SGA区中的缓存区,用于缓存在对数据进行修改的操作过程中生成的重做记录。重做日志缓存中的内容将被LGWR后台进程随时写入重做日志文件。
????????? 共享池
共享池是SGA区中的一系列内存结构,主要包括库缓存、数据字典缓存,以及用于存储并行操作信息和控制结构的缓存。
库缓存:用于缓存已经解析并执行过的sql和pl/sql程序代码。
数据字典缓存:保存最常使用的数据字典信息。
????????? 大型池
实际上是个备用池,用以缓解oracle对共享池和PGA区内存使用压力的。
b. PGA区
原创力文档

文档评论(0)