1、Oracle实例的概念
Oracle数据库主要由放在磁盘中的物理数据库和对物理数据库进行管理的数据库管理系统。其中数据库管理系统是处于用户与物理数据库之间的一个中间层软件,又称为实例,由一系列内存结构和后台进程组成。
在启动数据库时,Oracle首先在内存中获取一定的空间,启动各种用途的后台进程,即创建一个数据库实例,然后由实例装载数据文件和重做日志文件,最后打开数据库。用户操作数据库的过程实质上是与数据库实例建立连接,然后通过实例来连接、操作数据库的过程。
(1) 数据库与数据库实例的关系
单实例数据库,如下图:
多实例数据库
并行oracle数据库服务器,同一时间,一个用户只能与一个实例联系
如下图:
(2)实例组成:
内存结构:系统全局区(SGA)和程序全局区(PGA)
后台进程:DBWR、LGWR、CKPT、SMON、PMON、ARCH等
他们之间的关系如下图:
用户进程、服务器进程、后台进程、数据库实例和数据库之间的关系,如下图:
2、Oracle内存结构
系统全局区(System Global Area,SGA)
SGA是由Oracle分配的共享内存结构,包含一个数据库实例共享的数据和控制信息。当多个用户同时连接同一个实例时,SGA数据可供多个用户共享,SGA又称为共享全局区(SharedGlobal Area)。用户对数据库的各种操作主要在SGA中进行。该内存区随数据库实例的创建而分配,随实例的终止而释放。
程序全局区(Program Global Area,PGA)
PGA是在用户进程连接数据库、创建一个会话时,由Oracle为用户分配的内存区域,保存当前用户私有的数据和控制信息,因此该区又称为私有全局区(PrivateGlobal Area)。每个服务器进程只能访问自己的PGA,所有服务器进程的PGA总和即为实例的PGA的大小。
系统全局区(SGA)
SGA 包含的内存结构有:
数据高速缓冲区(DatabaseBuffer Cache)
共享池(SharedPool)
重做日志缓冲区(Redo LogCache)
大型池(LargePool)
Java池(JavaPool)
流池(StreamsPool)
其他结构(如固定SGA、锁管理等)
(1)数据高速缓冲区
存储从数据文件中检索出来的数据拷贝。应用程序要访问的数据必须从磁盘的数据文件读到数据缓冲区中处理。
在数据缓冲区中被修改后的数据由数据写入进程(DBWR)写到硬盘的数据文件中永久保存。
1)数据高速缓冲区的工作过程 :
2) 缓冲块的类型
数据高速缓冲区由许多大小相等的缓存块组成。
脏缓存块(Dirty Buffers)
脏缓存块中保存的是已经被修改过的数据。当一条SQL语句对某个缓存块中的数据进行修改后,这个缓存块就被标记为脏缓存块。它们最终将由DBWR进程写入数据文件,以永久性地保存修改结
空闲缓存块(Free Buffers)
空闲缓存块中不包含任何数据,它们等待后台进程或服务器进程向其中写入数据。当Oracle从数据文件中读取数据时,将会寻找空闲缓存块,以便将数据写入其中
命中缓存块(Pinned Buffers)
正被使用,或者被显式地声明为保留的缓存块。这些缓存块始终保留在数据高速缓冲区中,不会被换出内存。
3)缓存块的管理
脏缓存块列表:包含那些已经被修改但还没有写入数据文件的脏缓存块。
LRU列表(LeastRecently Used):包含所有的空闲缓存块、命中缓存块和那些还没有来得及移入到脏缓存块列表中的脏缓存块。在该列表中,最近被访问的缓存块被移动到列表的头部,而其他缓存块向列表尾部移动,最近最少被访问的缓存块最先被移出LRU列表,从而保证最频繁使用的缓存块始终保存在内存中。
4)数据高速缓冲区大小
数据高速缓冲区越大,用户需要的数据在内存中的可能性就越大,即缓存命中率越高,从而减少了Oracle访问硬盘数据的次数,提高了数据库系统执行的效率。然而,如果数据高速缓冲区的值太大,Oracle就不得不在内存中寻找更多的块来定位所需要的数据,反而降低了系统性能。显然需要确定一个合理的数据高速缓冲区大小。
通过改变DB_CACHE_SIZE(标准块)来改变缓冲区的大小:
SQL>Alter system set DB_CACHE_SIZE=80M
(2)重做日志缓冲区
重做日志缓冲区用于缓存用户对数据库进行修改操作时生成的重做记录。
为了提高工作效率,重做记录并不是直接写入重做日志文件中,而是首先被服务器进程写入重做日志缓冲区中,在一定条件下,再由日志写入进程(LGWR)把重做日志缓冲区的内容写入重做日志文件中做永久性保存。在归档模式下,当重做日志切换时,由归档进程(ARCH)将重做日志文件的内容写入归档文件中
1)重做日志缓冲区的工作过程 :
2)重做日志缓冲区的大小
较大的重做日志缓冲区,可以减少对重做日志文件写的次数,适合长时间运行的、产生大量重做记录的事务。
通过修改LOG_BUFFER 参数来改变重做日志缓冲区的大小。
(3)共享池
共享池用于缓存最近执行过的SQL语句、PL/SQL程序和数据字典信息,是对SQL语句、PL/SQL程序进行语法分析、编译、执行的区域。
由库缓存和数据字典缓冲区组成。
库缓存用于缓存已经解释并执行过的SQL语句和PL/SQL程序代码,以提高SQL或PL/SQL程序的执行效率。包括SQL工作区和PL/SQL工作区 。
数据字典缓存区保存最常用的数据字典信息。
共享池大小
合适的共享池大小,可使编译过的程序代码长驻内存,大大降低重复执行相同的SQL语句、PL/SQL程序的系统开销,从而提高数据库的性能。
通过修改SHARED_POOL_SIZE参数来改变共享池的大小。
(4)大型池
大型池是一个可选的内存配置项,主要为Oracle多线程服务器、服务器I/O进程、数据库备份与恢复操作、执行具有大量排序操作的SQL语句、执行并行化的数据库操作等需要大量缓存的操作提供内存空间。如果没有在SGA区中创建大型池,上述操作所需要的缓存空间将在共享池或PGA中分配,因而影响共享池或PGA的使用效率。
通过修改LARGE_POOL_SIZE参数来改变大型池的大小。
(5)Java池
Java池提供对Java程序设计的支持,用于存储Java代码、Java语句的语法分析表、Java语句的执行方案和进行Java程序开发。Java池大小通过JAVA_POOL_SIZE来修改,通常不小于20M,以便安装Java虚拟机 。
(6)流池
流池是一个可选的内存配置项,用于对流的支持,流池大小通过修改STREAMS_POOL_SIZE参数来改变。
(7)SGA的管理
1)SGA组件大小调整 :
DB_CACHE_SIZE(数据高速缓存区大小)
LOG_BUFFER(重做日志缓冲区大小)
SHARED_POOL_SIZE(共享池大小)
LARGE_POOL_SIZE(大型池大小)
Java_POOL_SIZE (Java池大小)
STRAMS_POOL_SIZE(流池大小)
SGA_MAX_SIZE
注意:
除了SGA_MAX_SIZE不能修改外,其他几个参数可以使用ALTER SYSTEM语句进行动态调整。
2)SGA自动管理
在Oracle 10g中,通过设置初始化参数SGA_TARGET,可以实现对SGA中的数据高速缓冲区、共享池、大型池、Java池和流池的自动管理,即这几个组件的内存调整不需要DBA来干预,系统自动进行调整。但是对于日志缓冲区、非标准块的数据高速缓冲区、保留池、回收池等其他区域的调整还需要DBA使用ALTERSYSTEM语句手动进行调整。
3)设置SGA自动管理的方法
a) 计算参数SGA_TARGET的大小
SQL>SELECT ( (SELECT SUM(value) FROMV$SGA) –
(SELECT CURRENT_SIZE FROMV$SGA_DYNAMIC_FREE_MEMORY)) /1024/1024 ||'MB' "SGA_TARGET" FROM DUAL;
b) 设置参数SGA_TARGET
通过ALTER SYSTEM语句设置参数SGA_TARGET的值,该值可以是a) 中计算出来的结果,也可以是当前SGA大小与SGA_MAX_SIZE之间的某个值。例如:
将SGA中与自动管理相关的组件大小设置为0
SQL>ALTER SYSTEM SET SHARED_POOL_SIZE=0;
SQL>ALTER SYSTEM SET LARGE_POOL_SIZE=0;
SQL>ALTER SYSTEM SET Java_POOL_SIZE=0;
SQL>ALTER SYSTEM SET LARGE_POOL_SIZE=0;
SQL>ALTER SYSTEM SET STREAMS_POOL_SIZE=0;
如果要取消自动管理,只需将参数SGA_TARGET设置为0即可。
程序全局区(PGA)
PGA 是为每一个与Oracle数据库连接的用户保留的内存区,主要存储该连接使用的变量信息和与用户进程交换的信息。是非共享的,只有服务进程本身才能访问它自己的PGA区。由排序区、会话区、游标区以及堆栈区组成。
排序区主要用于存放排序操作所产生的临时数据,其大小由初始化参数SORT_AREA_SIZE定义;会话区用于保存用户会话所具有的权限、角色、性能统计信息;游标区用于存放执行游标操作时所产生的数据;堆栈区用于保存会话过程中的绑定变量、会话变量等信息。
Oracle后台进程
1、 进程概述:
Oracle进程分为:用户进程、服务器进程和后台进程。
(1)用户进程
当用户连接数据库执行一个应用程序时,会创建一个用户进程,来完成用户所指定的任务。
连接与会话:
连接:指用户进程与数据库实例这间的一条通信路径。
会话:指用户到数据库的指定连接。会话是通过连接实现的,同一个用户可以创建多个连接来产生多个会话。在用户连接数据库的过程中,会话始终存在,直到用户断开连接或终止应用程序为止。
(2)服务器进程
服务器进程由Oracle自身创建,用于处理连接到数据库实例的用户进程所提出的请求。用户进程只有通过服务器进程才能实现对数据库的访问和操作。
服务器进程分为专用服务器进程(只服务一个用户进程)和共享服务器进程(服务多个用户进程)两种。
服务器进程主要完成以下任务:
1)解析并执行用户提交的SQL语句和PL/SQL程序;
2)在SGA的数据高速缓冲区中搜索用户进程所要访问的数据,如果数据不在缓冲区中,则需要从硬盘数据文件中读取所需的数据,再将它们复制到缓冲区中;
3)将用户改变数据库的操作信息写入日志缓冲区中。
4)将查询或执行后的结果数据返回给用户进程。
(3)后台进程
为了保证Oracle数据库在任意一个时刻可以处理多用户的并发请求,进行复杂的数据操作,而且还要优化系统性能,Oracle数据库起用了一些相互独立的附加进程,称为后台进程。服务器进程在执行用户进程请求时,调用后台进程来实现对数据库的操作。
后台进程主要完成以下任务:
1)在内存与磁盘之间进行I/O操作;
2)监视各个服务器进程状态;
3)协调各个服务器进程的任务;
4)维护系统性能和可靠性等。
(2)各个后台进程
1)DBWR(数据库写入进程)
数据库写入进程负责把数据高速缓冲区中已经被修改过的数据(“脏”缓存块)成批写入数据文件中永久保存,同时使数据高速缓冲区有更多的空闲缓存块,保证服务器进程将所需要的数据从数据文件读取到数据高速缓冲区中,提高缓存命中率。
启动DBWR进程的条件:
a) 执行INSERT、UPDATE等操作时 ,没有足够的空闲块
b) 当检查点发生时,将启动DBWR进程
c) 当数据缓存的LRU列表的长度达到初始化 DB_BLOCK_WRITE_BATCH指定值的一半时
若DBWR发生超时(大约3秒未被启动) 启动DBWR进程的数目由初始化参数DB_WRITE_PROCESSES决定,但不超过CPU的数目
2)LGWR(日志写入进程)
日志写入进程负责把重做日志缓冲区的数据写入重做日志文件中永久保存。
数据写入进程在工作之前,需要了解日志写入进程是否已经把相关的日志缓冲区中记载的数据写入硬盘中,如果相关的日志缓冲区中的记录还没有被写入,DBWR会通知LGWR完成相应的工作,然后DBWR才开始写入。先写重写日志文件,后写数据文件。
启动LGWR进程条件:
用户通过COMMIT语句提交当前事务
重做日志缓存被写满三分之一
DBWR进程开始将脏缓存块写入数据文件
每隔3秒,即发生一次超时,将启动LGWR
3)CKPT(检查点进程)
检查点是一个事件,当该事件发生时(每隔一段时间发生),DBWR进程把数据高速缓冲区中脏缓存块写入数据文件中,同时Oracle将对数据库控制文件和数据文件的头部的同步序号进行更新,以记录下当前的数据库结构和状态,保证数据的同步。执行完检查点,数据库处于一个完整状态。
a) 检查点的级别 :
数据库检查点:每一次日志切换时,执行一个数据库检查点,DBWR进程将数据高速缓冲区中的脏缓存块写入数据文件中;
表空间检查点:当一个表空间设置为脱机状态时,执行一个表空间检查点,DBWR进程把数据高速缓存中与该表空间相关的脏缓存块写入数据文件中。
时间检查点:可以设置以时间为基础的检查点,每隔一段时间执行一次检查点。需要为检查点设置一个合适的执行间隔,间隔太短,将会产生过多的硬盘I/O操作;间隔太长,数据库的恢复将耗费太多时间。
b) 检查点事件的触发:
每一个日志切换时;
当实例以如下方式关闭时;
NORMAL, TRANSACTION,IMMEDIATE
当使用 ALTER TABLESPACE [OFFLINENORMAL|READ ONLY|BEGIN BACKUP] ,作用于某个数据文件上的检查点发生时;
设置以时间为基础的检查点事件;
当数据库管理员需要手工操作时
SQL>ALTER SYSTEM CHECKPOINT;
c) 与检查点的相关初始化参数
LOG_CHECKPOINT_INTERVAL
用来指定重做日志文件每写多少操作系统块发生一次检查点事件。例如重做日志文件1M,系统操作块为1K:设置此参数为500,则重做日志文件写入500K时,检查点事件发生。
LOG_CHECKPOINT_TIMEOUT
用来指定每隔多长时间发生一次检查点。如1800,表示每隔1800秒,如果为0,表示此参数无效。
LOG_CHECKPOINT_TO_ALERT
用于设置是否将检查点信息记录到警告日志中数
4)SMON(系统监控进程)
在实例启动时负责对数据库进行恢复;回收不再使用的临时空间;将各个表空间的空闲碎片合并(表空间的存储参数PCTINCREASE不为0时)。在数据库实例运行期间,会被定期唤醒。
5)PMON(进程监控进程)
负责恢复失败的用户进程或服务器进程,并且释放进程所占用的资源;
清除非正常中断的用户进程留下的孤儿会话,回退未提交的事务,释放会话所占用的锁、SGA、PGA等资源;
监控调度进程和服务器进程的状态,如果它们失败,则尝试重新启动它们,并释放它们所占用的各种资源。
6)ARCH(归档进程)
归档进程负责在日志切换后将已经写满的重做日志文件复制到归档目标中,防止写满的重做日志文件被覆盖。最多可启动10个归档进程( ARC0- ARC9),默认一个实例只启动一个ARCH进程。
7)RECO(恢复进程)
RECO进程负责在分布式数据库环境中自动解决分布式事务的故障。一个节点的RECO自动解决所有的悬而未决的事务。当一个数据库服务器的RECO后台进程试图建立同一远程服务器的通信,如果该远程服务器不可用或者网络连接不能建立时,RECO自动地在一个时间间隔之后再次连接。当且仅当数据库配置为分布式事务处理,且初始化参数DISTRIBUTED_TRANSACTIONS的值大于0时,RECO进程才会自动启动。
8) LCKn(锁进程)
LCKn进程用于Oracle并行服务器环境中。在数据库中最多可以启动10个LCKn进程,主要用于实例间的封锁。
9) Dnnn(调度进程)
Dnnn进程是多线程服务器(MultithreadedServer,MTS)的组成部分,以后台进程的形式运行。调度进程接受用户进程请求,将它们放入请求队列中,然后为请求队列中的用户进程分配一个服务器进程。最后,从响应队列返回数据给用户进程。