一个做了几年技术的老白菜
分类: Oracle
2009-05-17 19:16:26
第二节:Oracle实例
2.2、Oracle Server
一个运行的数据库就是一个Oracle Server。
Oracle Server由实例(Instance)和数据库(Database)组成。
1.实例
实例由内存结构(memory structure)和后台进程(Background Process)组成。
一个实例可以安装(mount)和打开(open)一个数据库,负责数据库的相应操作管理和用户管理。
Instance 有一些后台进程,如PMON, SMON, DBWR, LGWR, CKPT, Others
Instance是操作database的一种手段!一个instance实例,只能操作一个database,但是一个database可以被多个实例操作
2.数据库
数据库是一系列物理文件(数据文件、控制文件、重做日志文件)的集合和与之对应的逻辑结构(块、段、表空间)。
图一:Oracle server
2.3、Oracle内存结构(Memory Structure)
内存是用来保存指令代码和缓存数据的。要运行一个软件程序,必须先要在内存中为其指令代码和缓存数据申请,划分出一个区域,再将其从磁盘上读入,放置到内存,然后才能执行。oracle dbms是一个应用程序,所以它的执行也不例外,需要放置到内存中才能执行。
内存是影响数据库性能的重要因素,Oracle8i使用静态内存管理,Oracle
内存结构是oracle体系结构中最为重要的一部分,内存也是影响数据库性能的第一因素。内存的大小,速度直接影响数据库的运行速度。按照系统对内存使用方法的不同,Oracle数据库的内存可以分为以下几个部分:
•系统全局区:SGA(System Global Area)
•程序全局区:PGA(Programe Global Area)
•排序池:(Sort Area)
•大池:(Large Pool)
•Java池:(Java Pool)
图二:Oracle内存结构
SGA是一组为系统分配的共享的内存结构,可以包含一个数据库实例的数据或控制信息。如果多个用户连接到同一个数据库实例,在实例的SGA中,数据可以被多个用户共享。
SGA是指系统全局区,是一块用于加载数据,对象并保存运行状态和数据库控制信息的一块内存区域,当数据库实例启动时,SGA的内存被自动分配;当数据库实例关闭时,SGA内存被回收。
SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。
SGA区是例程内存结构的主要组成部分,每个例程都只有一个sga区,当多个用户同时连接到一个例程时,所有的用户进程,服务进程都可以共享使用sga区。它是不同用户进程与服务进程进行通信的中心,数据库的各种操作主要都再sga区中进行,所以将其称为系统全局区。
当数据库启动到nomount状态时,sga区已经分配,同时启动后台进程。SGA的有关信息可以通过下面的语句查询,sga_max_size的大小是不可以动态调整的。
=====================================
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- --------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer
sga_target big integer 0
SQL> alter system set sga_max_size=
alter system set sga_max_size=
*
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
======================================
SGA按作用不同,可以分为三部分:
Shared pool(共享池)
Database buffer cache(数据缓冲区)
Redo log buffer cache(归档日志缓冲区)
SGA各个组成部分的大小可以改变,只要它们的大小总和加起来不超过SGA_MAX_SIZE
一、数据缓冲区(Database Buffer Cache)
如果每次执行一个操作时,Oracle都必须从磁盘读取所有数据块并在改变它之后
又必须把每一块写入磁盘,显然效率会非常低。数据缓冲区存放需要经常访问的数据,供所有用户使用。修改数据时,首先从数据文件中取出数据,存储在数据缓冲区中,修改/插入数据也存储在缓冲区中,commit或DBWR(下面有详细介绍)进程的其他条件引发时,数据被写入数据文件。
数据缓冲区的大小是可以动态调整的,但是不能超过sga_max_size的限制。
数据缓冲区包括:DB_CACHE_SIZE(由DB_BLOCK_SIZE默认指定)、DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE。
数据缓冲区可以动态改变,命令为:ALTER SYSTEM SET DB_CACHE_SIZE =
二、日志缓冲区(Log Buffer Cache)
日志缓冲区用来存储的修改信息。该区对数据库性能的影响很小。
Redo Log Buffer Cache所记录的是database中有什么样的用户,在做什么样的改变,改变的旧值、改变后的新值。
三、共享池(Share Pool)
共享池是对SQL,PL/SQL程序进行语法分析,编译,执行的内存区域。
它包含三个部分:(都不可单独定义大小,必须通过share pool间接定义)
1.库缓冲区(Library Cache)包含SQL,PL/SQL语句的分析码,执行计划。
Library Cache 存储的是最近使用的SQL和PL/SQL语句,使用的算法是LRU. 当发现用户的命令时,先在Library Cache里边查找是否有匹配的SQL语句或者是PL/SQL语句。Library Cache以及Data dictionary cache的大小不可以直接定义,它的大小只能借助于Shared Pool。
2.数据字典缓冲区(Data Dictionary Cache)表,列定义,权限。
Data dictionary cache里边存放的是数据文件、表、索引、索引、columns、用户名、权限以及其他的数据对象。例如:select * from authors // 首先判断authors是否存在,再判断*是否存在,再判断语法是否正确,在判断用户是否有此权限。
3.用户全局区(Usr Global Area)用户MTS会话信息。
共享池的大小可以动态修改:
PGA是在用户进程连接到ORACLE实例并创建一个会话时自动分配的,保存每个与Oracle 数据库连接的用户进程所需的信息,PGA为非共享区,一个用户会话一个PGA,当一个用户会话结束,PGA释放。
程序全局区是包含单个用户或服务器数据和控制信息的内存区域,它是在用户进程连接到Oracle并创建一个会话时由Oracle自动分配的,不可共享,主要用于用户在编程存储变量和数组。
如上图:
•Stack Space是用来存储用户会话变量和数组的存储区域;
•User Session Data是为用户会话使用的附加存储区。
|--Session Information
|--Sort Area
|--Cursor Information
注意Session information(用户会话信息)在独占服务器中与在共享服务器中所处
的内存区域是不同的。
2.4、Oracle实例的进程结构(Process Structure)
Oracle包含三类进程:
•用户进程(User Process)
•服务器进程(Server Process)
•后台进程(Background Process)
用户进程和服务器进程
当数据库用户请求连接到Oracle的服务时启动用户进程(比如启动SQLPlus时)。
•用户进程首先必须建立一个连接。
•用户不能直接与Oracle服务器,必须通过服务器进程交互。
•服务器进程是用户进程与服务器交互的桥梁,它可以与Oracle Server直接交互。
•服务器进程可以有共享和独占两种形式。
Oracle的用户进程(User process)并不可以直接操作我们的instance或者是database,而是当我们在产生一个User process时,Oracle服务器会为我们产生一个Server process, 由此Server process去执行User process所发出的command!
启动一个SQL*Plus实际上就是启动了一个用户进程。在启动一个用户进程后,通过命令:conn ....建立与数据库的连接!此时oracle会为我们生成一个 server process服务进程,它在以后代替我们的用户进程,来执行用户进行所发出的command! server process完成与Instance的连接,当一个Instance被激活时,后台的database也就变得可用了。
后台进程为所有数据库用户异步完成各种任务,数据库的物理结构与内存结构之间的交互要通过后台进程来完成。数据库的后台进程包含两类,一类是必须的,一类是可选的:
•Mandatory background processes
|--DBWn(Database Writer):数据写入
|--PMON(Process Moniter):进程监控
|--LGWR(Log Writer):日志写入
|--SMON(System Moniter):系统监控
|--RECO(Recovery):恢复
|--CKPT(Chekpoint):检查点
•Optional background processes
|--ARCn(Archiver):归档
|--LCKn(Lock):锁
|--Dnnn(Dispatcher):调度
1.DBWR(Database Writer,数据写入进程)
将数据缓冲区的数据写入数据文件,是负责数据缓冲区管理的一个后台进程。
当数据缓冲区中的一数据被修改后,就标记为dirty,DBWR进程将数据缓冲区中“脏” 数据写入数据文件,保持数据缓冲区的”干净“。由于数据缓冲区的数据被用户修改并占用,空闲数据缓冲区会不断减少,当用户进程要从磁盘读取数据块到数据缓冲区却无法找到足够的空闲数据缓冲区时,DBWR将数据缓冲区内容写入磁盘,使用户进程总可以得到足够的空闲数据缓冲区。
DBWR的作用:
•管理数据缓冲区,以便用户进程总能够找到足够的空闲缓冲区。
•将所有修改后的缓冲区数据写入数据文件。
•使用LRU(最近最少使用)算法保持缓冲区数据是最近经常使用的。
•通过延迟写来优化磁盘I/0读写。
2:LGWR(Log Writer,日志写入进程)
将日志数据从日志缓冲区写入磁盘组。数据库在运行时,如果对数据进行修改则产生日志信息,日志信息首先产生于日志缓冲区。当日志达到一定数量时,由LGWR将日志数据写入到日志文件组,再经过日志切换,由归档进程(ARCH)将日志数据写入归档进程(前提是数据库运行在归档模式下)。数据库遵循写日志优先原则,即在写数据之前先写日志。
3.ARCH(Archiver,归档进程)
Oracle数据库有两种运行模式,归档(ARCHIVELOG),非归档(NOARCHIVELOG)模式。
以非归档模式运行时日志在切换时被直接覆盖,不产生归档日志,这是数据库默认的运行模式。数据库运行在归档模式时,在日志切换之前,由ARCH进程将日志信息写入磁盘,也就是自动备份在线日志。
Oracle数据库的Redo文件数量是有限的,所以Oracle以循环的方式向它们中写入。它顺序写满每一个Redo文件,当达到最后一个时,再循环回去开始填写第一个Redo文件。如果为了能恢复数据库而想保存日志文件,那么在它们被重新使用之前需要对其进行备份,归档进程管理此工作。
4.CKPT(Check Point,检查点进程)
运行CKPT时,系统对全部数据文件及控制文件文件头的同步信号进行修改,以保证数据
库的同步。检查点出现在以下情况:
|--在每个日志切换时产生。
|--上一个检验点之后又经过了指定时间。
|--从上一个检验点之后,当预定义数量的日志块被写入磁盘之后。
|--数据库关闭。
|--DBA强制产生。
|--当表空间设置为OFFLINE时。
5.SMON(System Moniter,系统监控进程)
SMON在实例启动时执行实例恢复,并负责清理不再使用的临时段。
6.PMON(Process Monitor,进程监控)
PMON在用户进程出现故障时进行恢复,负责清理内存区域和释放该进程所使用的资源。
7.RECO(Recovery,恢复进程)
RECO用于分布式数据库维持在分布式环境中的数据的一致性。
8.LCKn(Lock,锁进程,n=number)
在并行服务器中用于多个实例间的封锁。
9.Dnnn(Dispatcher,调度进程,n=number)
Dnnn存在于多线程服务器体系结构中,负责将用户进程连接到服务器进程,再把结果返 回给用户进程。