oracle服务器的结构和组成
对oracle服务器 从实例结构和结构两个方面 分析
oracle服务器的总体结构
oracle实例的内存结构和进程结构
oracle数据库的结构和组成
关键术语
architecture 结构
process 进程
instancec 实例
database buffer cache 数据库高速缓存
library cache 库缓存
redo log buffer 重做日志缓存
java pool java池
connection 连接
online redo log 联机重做日志
sga(system global area)全局区
server process 服务器进程
parsing 分析
component 组成部件
parameter参数
memory内存
shared pool 共享池
data dictionary cache 数据字典缓存
large pool 大池
background process 后台进程
session 会话
dynamic 动态的
pga(program global area)程序全局区
user process 用户进程
一、 oracle服务器的构成
oracle服务器 ~ 高性能 高可靠性 面向对象关系型数据库 管理系统 ~也是 一个高效的sql 语句执行环境
oracle服务器 特点:
多用户环境下, 允许多用户访问
(一)、 oracle服务器的总体结构
oracle服务器, ~ 通过后台运行一组可执行程序 、 在内存中开辟程序运行的存储区域, 在磁盘上存储数据
oracle服务器, 由实例instance 和数据库database两大部分构成
实例~ 内存结构 ~ oracle后台进程
数据库 ~ 物理上 多个操作系统文件组成。 包括数据文件、 控制文件 和重做日志文件
oracle服务器 = 实例 + 数据库
(二)、 oracle实例
oracle 实例由 内存结构sga 和oracle 后台进程组成的
当用户启动start实例时,oracle将自动地为sga分配内存并启动后台进程,实例运行后,用户可以访问实例
由实例来访问数据库。
实例相当于 用户和数据库的中间层。
当用户关闭shutdown 实例时, 有操作系统负责回收内存。
每个实例都有自己的sga,并且,每个实例同时只能访问一个数据库
oracle数据库实例 instance = 内存结构sga + 后台进程background process
内存结构描述的是oracle数据库对内存的使用构成
oracle内存结构 sga system global area 。 包括数据库高速缓冲区 database buffer cache
重做日志缓冲区redo log buffer 共享池 shared pool 三个部分
oracle 后台进程主要包括 dbwn ckpt lgwr smon pmon arcn 和reco
(三)、 oracle 数据库
oracle数据库 包含 存放数据的数据文件 datafiles, 用于保护数据不丢失 的联机重做日志文件 online redolog files
用于连接oracle实例和数据库所需要的控制文件 control files
oracle数据库= 数据文件+控制文件+联机重做日志文件
除了以上三种文件外, oracle还包含 参数文件parameter file 、口令文件 password file
归档日志文件 archived log files、 跟踪文件 trace file 和警告文件 alert log file 等非数据库文件。
控制文件: 记录数据库各项信息, 连接oracle实例和oracle数据库的桥梁
每个oracle数据库包含1-8个控制文件
联机重做日志文件: 记录用户对数据的各项操作, 用于保护数据不丢失
以日志组的形成存在,每个oracle数据库至少包含两个日志组
数据文件: 用户存放数据
参数文件: 记录oracle实例的各项信息。 分为动态和静态初始化参数文件
口令文件: 存放特定用户的口令
归档日志文件: 相对于联机重做日志文件的备份,用户保护数据不丢失
追踪文件: 存放后台进程和服务器进程的跟踪信息
警告文件: 警告文件由连续的信息和错误组成
可以查看到oracle内部错误、块损坏错误以及非默认的初始化参数值等
二、oracle 内存结构
oracle 内存有系统全局区 system global area sga 和程序全局区 program global area pga组成
(一)、 系统全局区sga
系统全局区system global area sga 是一组包含了oracle 数据库数据及实例控制信息的共享内存结构。
当多个用户并发的连接同一个实例后,这些用户将共享此实例sga中的数据。
因此sga 也被称为共享全局区 shared global area
sga越大系统的性能越好, 但sga过大也会起到反作用。
一般情况,sga不应超过系统实际内存的1/2.
但 从oracle 9i开始支持动态sga特性, 即无需关闭实例就可以改变数据高速缓冲区、共享池和大池的大小。
数据高速缓冲区、共享池的大小也可以根据工作负载自动调整,但sga的总大小不能超过初始化参数sga_max_size的设置
1.sga的构成
sga包括三个子缓冲区: 保留缓存区, 循环缓冲区和非标准大小块缓冲区。
sga包括以下结构:
数据高速缓冲区 data buffer cache
重做日志缓冲区 redo log buffer
共享池 shared pool
java 池 java pool
大池 large pool
流池 stream pool
1.1 数据库高速缓冲区 database buffer cache
oracle中 无论是读取还是修改数据, 都是由服务器进程在 数据库高速缓存区 中完成的
数据库高速缓冲区的作用 就是 用来缓存最近从数据库 读取的数据块, 并可供其他客户进程共享。
用户进程查看数据时, 首先检查需要的信息是否在缓冲区内,如果在缓冲区中,就可以直接访问,~
否则访问物理文件并读取数据块到数据库缓冲区。
我们知道内存的读写速度要比物理设备的读写速度快很多,这样就可以大大提高oracle数据库的性能
1) 数据库高速缓冲区的子缓冲区
根据缓冲数据块的状态,oracle将数据高速缓冲区可划分为:
脏缓冲区 dirty buffer
当数据库发生dml(insert、update、delete)操作时,会对缓冲区内容进行修改,
这样缓冲区的内容就会和相对应的数据文件不一致,这时,缓冲区标识为脏缓冲区
自由缓冲区free buffer
当脏缓冲区 的内容被写入数据文件后, 因为该缓冲区与相应数据文件部分内容一致,
所以该缓冲区称为 自由缓冲区
当执行select语句时,会将对应数据文件部分数据读取到数据高速缓存的相应缓冲区~
因为缓冲区与数据块内容完全一致,所以这些缓冲区也被称为 自由缓冲区
忙缓冲区 pinned buffer
忙缓冲区 是指服务器进程正在访问的缓冲区
每个数据库的数据库高速缓冲区大小有限, 所以一般不会吧磁盘上所有数据都可以存放在缓冲区中。
为了防止数据库高速缓冲区空间不够用,oracle会将脏缓冲区中的数据写入对应的数据文件中~
以腾出空间给新的数据
如果缓冲区数据不脏,即为 自由缓冲区, 它可以直接被读入新的数据块。随后访问被写入磁盘~
导致额外的高速缓存未命中的数据
脏列表 的作用 就是记录脏缓冲区的情况。 如果某些缓冲区中的数据块被修改,就会加入该列表~
只有脏列表中的缓冲区数据需要写回数据库文件, 一旦写回数据库文件,缓冲区就会从脏列表中清除
2)非标准块大小支持
数据库块是oracle数据库i/o的最小单位
每个数据库都可以通过参数 db_block_size指定标准块大小(2、4、8、16、32k)默认为8k
但是oracle数据库同时指出多种块大小,我们称这些标准块以外的块为 非标准大小块
非标准大小块的高速缓冲区大小 指定以下参数 db_nk_cache_size
db_2k_cache_size、db_4k_cache_size、db_8k_cache_size、db_16k_cache_size、~
db_32k_cache_size、db_nk_cache_size参数不能用于设定标准大小块的高速缓存,~
标准大小块的缓存尺寸有参数db_cache_size的值决定。
3) 使用多个缓冲区
数据库管理员dba 可以通过创建多个缓冲池来提高数据库缓冲区高速缓存的性能。
用户可以指定方案对象 (schema object)(表,簇,索引,及分区)使用相应的缓冲池,~
以便控制数据被移出缓存区的时机。
保留缓冲区keep buffer cache : 用来保留在内存中最有可能重用的对象。
保留这些对象将减少i/o操作,指定db_keep_cache_size参数的值配置
循环缓冲区recycle buffer cache 用来保留被重用机会不大的内存块
指定db_recycle_cache_size参数的值配置库该缓冲区的大小
默认缓冲区 default buffer cache 此池始终存在,它相当于一个实例的数据库
高速缓冲区中保留和循环区以外的部分。 指定参数db_cache_size
注: 保留缓冲区和循环缓冲区并非默认缓冲区的子集。
可以使用buffer_pool子句对对象定义默认的缓冲区
create index cust_idx …
storage(buffer_pool keep);
alter table oe.customers
storage(buffer_pool recycle)
4) 数据库告诉缓冲区空间管理