首先讲 Oracle 包含 的 三个部分:
1: Oracle Server :Oracle服务器,一般可以看作是一个摸得着看的见的机器,我们可以称之为服务器。也可以看作是一套运行在服务器上的软件。
在Oracle官方网站是这样定义的:
An Oracle server is a database management system that provides an open ,comperhensive ,integrated approach to information management 。
An Oralce server consits of an Oracle instance and an Oracle database;
从上面的一段文字我们可以看出Oracle server是一个比较大的概念 是一个数据库管理系统,提供开放的,复杂的集成的信息管理系统。里面包含两个一个就是我们通常所说的Instance(Oracle实例)另外一个就是Oracle数据库(Oracle database)。
图1:Oracle Server图解
2:Oracle Instance (Oracle 实例)
定义:A Oracle Instance is means to access an Oracle database;(是Oracle访问数据哭的一种手段)
Alway open one and only one database.这句话就是说Oralce的一个Instance对应一个也只能一个database来访问。而database可以有多个Instance与之对应并访问,在一般的方式下Oracle Instance 与Oracledatabase是 1:1 的关系 而在集群的时候是 n:1 的关系。
另外,Oracle Instance 是由内存以及oracle的后台进程构成(详见下图2)。
图2:The structure of Oralce Instance
Connection:Oracle客户端与进程建立的TCP连接。
Server Process:服务进程,主要是用于处理客户端和后台连接
在通过安全验证后,Oracle链接就建立起了一个Session(session) 3:Oracle Database
An Oracle database is a collection of data that is threaded as an unit.It. Constists of three file type.
Oracle database说白了就是一些数据文件,这三种文件作为一个整体构成了Oracle database。
Oracledatabase 包含三种文件: 数据文件 (datafiles 真正的数据文件,用于存储真正的数据文件) 、 控制文件 (Control files 操作Oracle数据的datafile的文件,提供具体的控制信息) 、 重做日志文件 (记录者数据库的改变信息及其状态,作用主要是用于进行数据恢复)。这些是Oracle 的基本的文件。另外在Oracle外围有Parameterfile(主要用于存贮参数)Password f ile主要是存储口令。Archived Log file(归档日志文件),这文件与Redo Log file相辅相成。归档日志文件,是为了进一步对数据进行恢复(解决Redo log循环覆盖的问题的一种方案。)
以d bf 为后缀的是 数据文件
以l og 为后缀的是 日志文件
以c tl 为后缀的 控制文件
如下图
解释描述
p s- ef | more
内存架构(Memory Structure)
系统全局区(SGA):在一个Instance启动的时候进行分配,而且是Instance的基本组成部分,此内存比较大。
程序全局区(PGA):在一个Server Process启动的时候进行分配。
Ipcs(进程通信机制)
Show sga;
接着讲述Oracle SGA 的内存分配
1: SGA基本的介绍
a. Shared Pool共享池
b. Dataabse Buffer Cache (数据块缓存)
c. Redo Log Buffer(重做日志缓冲区)
d. Large Pool(大池)
e. Java Pool (Java 池)
f. Others其他的
在Oracle 9i 以后 Oracle的SGA就可以动态进行分配。随着数据量的增大其内存必定要进行扩张,所以Oracle9i后SGA就出现了的动态参数设置。
SGA_MAX_SIZE(最大的内存大小)
查看 granules
Select component ,granule_size from v_$sga_dynamic component s ;
常见参数:
DB_CACHE_SIZE
LOG_BUFFER
SHARED_POOL_SIZE
LARGE_POOL_SIZE
JAVA_POOL_SIZE
g. Shared Pool共享池
I.用来存储的已经解析的SQL
II.存储当前数据的定义的信息。
Shared Pool共享池由 Library Cache(存储的是经过编译解析的的SQL和PL/SQL语句的内容,所以它包含几个部分,一个部分是 Shared SQL area 另外一部分是 Shared PL/SQL area 以及其他的区如privariy area等).它是由LRU(least recently used)算法进行管理的。
Data Dictionary Cache(数据字典缓存)
修改参数SQL命令示例:
ALTER SYS SET SHARED_POOL_SIZE = 64M;(设置共享池的大小)
h. Dataabse Buffer Cache (数据块缓存)
包含来自数据文件的数据,以及将要保存的数据。
查询时,Oracle会先把从磁盘读取的数据放入内存,以后再查询相关数据时不用再次读取磁盘。插入和更新时,Oracle会现在该区中缓存数据,之后批量写到硬盘中。通过块缓冲区,Oracle可以通过内存缓存提高磁盘的I/O性能。
块缓冲区中有三个区域:
默认池(Default pool):所有数据默认都在这里缓存。
保持池(Keep pool):用来缓存需要多次重用的数据。
回收池(Recycle pool):用来缓存很少重用的数据。
原来只有一个默认池,所有数据都在这里缓存。这样会产生一个问题:大量很少重用的数据会把需重用的数据“挤出”缓冲区,造成磁盘I/O增加,运行速度下降。后来分出了保持池和回收池根据是否经常重用来分别缓存数据。
这三部分内存区需要手动确定大小,并且之间没有共享。例如:保持池中已经满了,而回收池中还有大量空闲内存,这时回收池的内存不会分配给保持池。
9i开始,还可以设置db_nk_cache。9i之前数据库只能使用相同的块大小。9i开始同一个数据库可以使用多种块大小(2KB,4KB,8KB,16KB,32KB),这些块需要在各自的db_nk_cache中缓存。如果为不同的表空间指定了不同的块大小,需要为其设置各自的缓冲区。 设置 数据块缓存目的在于提高性能。
常见参数:
DB_BLOCK_SIZE
DB_CACHE_SIZE
DB_KEEP_CACHE_SIZE
DB_RECYCEL_CACHE_SIZE
修改参数SQL命令示例:
ALTER SYSTEM SET DB_CACHE_SIZE = 96M;
i. Redo Log Buffer(重做日志缓冲区)
数据写到重做日志文件之前在这里缓存,在以下情况中触发:
每隔3秒
缓存达到1MB或1/3满时
用户提交时
缓冲区的数据写入磁盘前
j. Large Pool(大池)
下面三种情况使用到大池:
并行执行:存放进程间的消息缓冲区
RMAN:某些情况下用于磁盘I/O缓冲区
共享服务器模式:共享服务器模式下UGA在大池中分配(如果设置了大池)
k. Java Pool (Java 池)
在数据库中运行Java代码时用到这部分内存。例如:编写Java存储过程在服务器内运行。需要注意的是,该内存与常见的Java编写的B/S系统并没关系。用JAVA语言代替PL/SQL语言在数据库中写存储过程才会用到这部分内存。
Others其他的 (如Stream Buffer ) 这里就不再赘述。