Oracle 进程类别
http://www.cnblogs.com/sopost/archive/2009/10/27/2190152.html
http://www.cnblogs.com/sopost/archive/2009/10/27/2190152.html
n Oracle实例主要有3类进程:
? 服务器进程(server process):这些进程根据客户的请求来完成工作。我们已经对专用服务器和共享服务器有了一定的了解。它们就是服务器进程。
? 后台进程(background process):这些进程随数据库而启动,用于完成各种维护任务,如将块写至磁盘、维护在线重做日志、清理异常中止的进程等。
? 从属进程(slave process):这些进程类似于后台进程,不过它们要代表后台进程或服务器进程完成一些额外的工作。
专用服务器(dedicated server)连接,采用专用服务器连接时,会在服务器上得到针对这个连接的一个专用进程。数据库连接与服务器上的一个进程或线程之间存在一对一的映射。
共享服务器(shared server)连接,采用共享服务器连接时,多个会话可以共享一个服务器进程池,其中的进程由Oracle实例生成和管理。你所连接的是一个数据库调度器(dispatcher),而不是特意为连接创建的一个专用服务器进程。
n 连接与会话
连接并不是会话的同义词,在一条连接上可以建立0个、一个或多个会话。各个会话是单独而且独立的,即使它们共享同一条数据库物理连接也是如此。一个会话中的提交不会影响该连接上的任何其他会话。实际上,还可以有连接而无相应的会话。另外,一个会话可以有连接也可以没有连接。使用高级Oracle Net特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会话上执行某个操作时,它会重新建立物理连接。
连接(connection):连接是从客户到Oracle实例的一条物理路径。连接可以在网络上建立,或者通过IPC机制建立。通常会在客户进程与一个专用服务器或一个调度器之间建立连接。
会话(session):会话是实例中存在的一个逻辑实体。这就是你的会话状态(session state),也就是表示特定会话的一组内存中的数据结构。提到“数据库连接”时,大多数人首先想到的就是“会话”。你要在服务器中的会话上执行SQL、提交事务和运行存储过程。
专用服务器模式中连接与会话的例子:如果一个用户连接上数据库进行操作,操作时也打开set autotrace on statistics, 则会创建一个跟踪统计的会话,此时一个连接有两个会话。如果用户执行命令disconnect,(其实这个命令真正的意思应该是“destroy_all_session”,因为用户并没有真正断开连接,如果要真正断开连接,则应该执行“exit“命令。)另一个用户在另一个窗口中打开另一个会话查询系统会话视图v$session则不会看到之前的会话,但仍有一个进程,即相应地有一条物理连接。这说明可以有连接而没有会话。之前的用户可以使用connect命令(真正的意思应该是create_session)在刚才的连接上再创建新会话。
如果是共享服务器模式,一个会话可能由多个服务进程轮流为之服务,一个进程可能为多个会话服务。简单地说,连接和会话之间有一种多对多的关系。
1. 什么时候使用专用服务器?
因为存在一对一的映射,所以不必担心长时间运行的事务会阻塞其他事务。其他事务只通过其自己的专用进程来处理。因此,在非OLTP环境中,也就是可能有长时间运行事务的情况下,应该只考虑使用这种模式。专用服务器是Oracle的推荐配置,它能很好地扩缩。只要服务器有足够的硬件(CPU和RAM)来应对系统所需的专用服务器进程个数,专用服务器甚至可以用于数千条并发连接。
某些操作必须在专用服务器模式下执行,如数据库启动和关闭,所以每个数据库中可能同时有专用服务器和共享服务器,也可能只设置一个专用服务器。
2. 什么时候使用共享服务器?
对于共享服务器,则有一种多对一的关系:多个客户对应一个共享服务器。共享服务器的首要原则:要确保事务的持续时间尽量短。事务可以频繁地执行,但必须在短时间内执行完(这正是OLTP系统的特点)。
共享服务器只适用于OLTP系统,这种系统的特点是事务短而且频繁。共享服务器对数据仓库很不适用,因为在数据仓库中,可能会执行耗时1分钟、2分钟、5分钟甚至更长时间的查询。
如果你的系统中90%都是OLTP,只有10%“不那么OLTP”,那么可以在同一个实例上适当地混合使用专用服务器和共享服务器。
许多高级连接特性都要求使用共享服务器。如果你想使用Oracle Net连接池,就必须使用共享服务器。如果你想在数据库之间使用数据库链接集合(database link concentration),也必须对这些连接使用共享服务器。
共享服务器主要为我们做3件事:减少操作系统进程/线程数,刻意地限制并发度,以及减少系统所需的内存。
使用共享服务器时,UGA在SGA中分配。这说明,转变为共享服务器时,必须能准确地确定需要多少UGA内存,并适当地在SGA中分配(通过LARGE_POOL_SIZE参数)。所以,共享服务器配置中对SGA的需求通常很大。这个内存一般要预分配,从而只能由数据库实例使用。
注意 对于大小可以调整的SGA,随着时间的推移确实可以扩大或收缩这个内存,但是在大多数情况下,它会由数据库实例所“拥有”,其他进程不能使用。
后台进程
可以使用一个V$视图查看所有可能的Oracle后台进程,确定你的系统中正在使用哪些后台进程:select paddr, name, description from v$bgprocess order by paddr desc
有两类后台进程:有一个中心(focused)任务的进程(如前所述)以及完成各种其他任务的进程(即工具进程)。
主要的Oracle后台进程:
1. PMON:进程监视器(Process Monitor)
这个进程负责在出现异常中止的连接之后完成清理。PMON会回滚未提交的工作,并释放为失败进程分配的SGA资源。PMON还负责监视其他的Oracle后台进程,并在必要时(如果可能的话)重启这些后台进程。PMON还会为实例做另一件事,这就是向Oracle TNS监听器注册这个实例。实例启动时,PMON进程会询问公认的端口地址(除非直接指定),来查看是否启动并运行了一个监听器。
2. SMON:系统监视器(System Monitor)
SMON进程要完成所有“系统级”任务。是一种数据库“垃圾收集器”。SMON所做的工作包括:
l 清理临时空间:例如,建立一个索引时,创建时为索引分配的区段标记为TEMPORARY。如果出于某种原因CREATE INDEX会话中止了,SMON就要负责清理。其他操作创建的临时区段也要由SMON负责清理。
l 合并空闲空间:如果你在使用字典管理的表空间,SMON要负责取得表空间中相互连续的空闲区段,并把它们合并为一个更大的空闲区段。
l 针对原来不可用的文件恢复活动的事务:这类似于数据库启动时SMON的作用:SMON会恢复一些失败的活动事务。
l 执行RAC中失败节点的实例恢复:在一个Oracle RAC配置中,集群中的一个数据库实例失败时,为该失败实例完成所有数据的恢复。
l 清理OBJ$:OBJ$是一个低级数据字典表,SMON进程删除这些不再需要的行。
l 收缩回滚段:如果有设置,SMON会自动将回滚段收缩为所设置的最佳大小。
l “离线”回滚段。
除此之外,它还会做许多其他的事情,如将DBA_TAB_MONITORING视图中的监视统计信息刷新输出,将SMON_SCN_TIME表中的SCN-时间戳映射信息刷新输出等。
3. RECO:分布式数据库恢复(Distributed Database Recovery)
RECO有一个很中心的任务:由于两段提交(two-phase commit,2PC)期间的崩溃或连接丢失等原因,有些事务可能会保持准备状态,这个进程就是要恢复这些事务。可疑的分布式事务可能导致写入器阻塞读取器(Oracle中只有此时会发生“写阻塞读”的情况)。
4. CKPT:检查点进程(Checkpoint Process)
检查点进程并不像它的名字所暗示的那样真的建立检查点,建立检查点主要是DBWn的任务。CKPT只是更新数据文件的文件首部,以辅助真正建立检查点的进程(DBWn)。
5. DBWn:数据库块写入器(Database Block Writer)
数据库块写入器(DBWn)是负责将脏块写入磁盘的后台进程。DBWn会写出缓冲区缓存中的脏块,通常是为了在缓存中腾出更多的空间(释放缓冲区来读入其他数据),或者是为了推进检查点(将在线重做日志文件中的位置前移,如果出现失败,Oracle会从这个位置开始读取来恢复实例)。
6. LGWR:日志写入器(Log Writer)
LGWR进程负责将SGA中重做日志缓冲区的内容刷新输出到磁盘。如果满足以下某个条件,就会做这个工作:
l 每3秒会刷新输出一次
l 任何事务发出一个提交时
l 重做日志缓冲区1/3满,或者已经包含1 MB的缓冲数据
7. ARCn:归档进程(Archive Process)
ARCn进程的任务是:当LGWR将在线重做日志文件填满时,就将其复制到另一个位置。
8. 其他中心进程
自动存储管理后台(Automatic Storage Management Background,ASMB)进程。
重新平衡(Rebalance,RBAL)进程。
以下进程是RAC环境所特有的,如果不是RAC环境,则看不到这些进程。
锁监视器(Lock monitor,LMON)进程:LMON监视集群中的所有实例,检测是否有实例失败。这有利于恢复失败实例持有的全局锁。
锁管理器守护(Lock manager daemon,LMD)进程。
锁管理器服务器(Lock manager server,LMSn)进程。
锁(Lock, LCK0)进程。
可诊断性守护(Diagnosability daemon, DIAG)进程。
5.2.2 工具后台进程
1. CJQ0和Jnnn进程:作业队列
Jnnn进程会不断地来来去去,也就是说,如果配置了最多1 000个Jnnn进程,并不会看到真的有1 000个进程随数据库启动。相反,开始时只会启动一个进程,即作业队列协调器(CJQ0),它在作业队列表中看到需要运行的作业时,会启动Jnnn进程。如果Jnnn进程完成其工作,并发现没有要处理的新作业,此时Jnnn进程就会退出,也就是说,会消失。
2. QMNC和Qnnn:高级队列
QMNC进程对于AQ表来说就相当于CJQ0进程之于作业表。Qnnn进程对于QMNC进程就相当于Jnnn进程与CJQ0进程的关系。QMNC进程要通知Qnnn进程需要完成什么工作,Qnnn进程则会处理这些工作。
参数AQ_TM_PROCESSES 可以指定最多创建10个这样的进程(分别名为Q000,…,Q009),以及一个QMNC进程。如果AQ_TM_PROCESSES设置为0,就没有QMNC或Qnnn进程。不同于作业队列所用的Jnnn进程,Qnnn进程是持久的。如果将 AQ_TM_PROCESSES设置为10,数据库启动时可以看到10个Qnnn进程和一个QMNC进程,而且在实例的整个生存期中这些进程都存在。
3. EMNn:事件监视器进程(Event Monitor Process)
EMNn进程是AQ体系结构的一部分,用于通知对某些消息感兴趣的队列订购者。
4. MMAN:内存管理器(Memory Manager)
这个进程是Oracle 10g 中新增的,自动设置SGA大小特性会使用这个进程。
5. MMON、MMNL和Mnnn:可管理性监视器(Manageability Monitor)
这些进程用于填充自动工作负载存储库(Automatic Workload Repository,AWR),这是Oracle 10g中新增的一个特性。MMNL进程会根据调度从SGA将统计结果刷新输出至数据库表。MMON进程用于“自动检测”数据库性能问题,并实现新增的自调整特性。Mnnn进程类似于作业队列的Jnnn或Qnnn进程;MMON进程会请求这些从属进程代表它完成工作。Mnnn进程本质上是临时性的,它们将根据需要来来去去。
6. CTWR:修改跟踪进程(Change Tracking Process)
这是Oracle 10g数据库中新增的一个可选进程。CTWR进程负责维护新的修改跟踪文件。
7. RVWR:恢复写入器(Recovery Writer)
这个进程也是Oracle 10g数据库中新增的一个可选进程,负责维护闪回恢复区中块的“前”映像,要与FLASHBACK DATABASE命令一起使用。
5.3 从属进程
从属进程(slave process)。Oracle中有两类从属进程:I/O从属进程和并行查询从属进程。
5.3.1 I/O从属进程
I/O从属进程用于为不支持异步I/O的系统或设备模拟异步I/O。采用这种方式,可以得到更高的吞吐量,这是因为会由I/O从属进程来等待慢速的设备,而原来的调用进程得以脱身,可以做其他重要的工作来收集下一次要写的数据。
I/O从属进程在Oracle中有两个用途。DBWn和LGWR可以利用I/O从属进程来模拟异步I/O,另外RMAN写磁带时也可能利用I/O从属进程。
有两个参数控制着I/O从属进程的使用:
BACKUP_TAPE_IO_SLAVES:这个参数指定RMAN是否使用I/O从属进程将数据备份、复制或恢复到磁带上。这个参数是一个布尔值,而不是所用从属进程的个数(这可能出乎你的意料)。
DBWR_IO_SLAVES:这个参数指定了DBW0进程所用I/O从属进程的个数。
DBWR I/O从属进程的名字是I1nn,LGWR I/O从属进程的名字是I2nn,这里nn是一个数。
5.3.2 并行查询从属进程
使用并行查询时,会看到名为Pnnn的进程,这些就是并行查询从属进程。处理一条并行语句时,服务器进程则称为并行查询协调器(parallel query coordinator)。操作系统上服务器进程的名字并不会改变,如果提到了协调器进程,你应该知道这就是原来的服务器进程。
=====
补充:
Oracle后台进程
后台进程用来执行保证数据库运行所需的实际维护任务。如:某个后台进程维护缓冲区缓存,根据需要将块写出到数据文件。
另个进程负责在线重做日志文件写满时将它自己复制到一个归档目标。
可以通过查询v$bgprocess视图看服务器当前后台进程
SQL> select paddr,name,description from v$bgprocess where paddr!='00';
PADDR NAME DESCRIPTION
---------------- ----- ----------------------------------------------------------------
00000001EB1F5920 PMON process cleanup
00000001EC226B30 VKTM Virtual Keeper of TiMe process
00000001EB1F69A0 GEN0 generic0
00000001F0269448 DIAG diagnosibility process
00000001EC227BB0 DBRM DataBase Resource Manager
00000001EB2137A0 VKRM Virtual sKeduler for Resource Manager
00000001F02683C8 PSP0 process spawner 0
00000001EB1F7A20 DIA0 diagnosibility process 0
00000001F026A4C8 MMAN Memory Manager
00000001EC228C30 DBW0 db writer process 0
00000001EB1F8AA0 DBW1 db writer process 1
00000001EB1FFE20 ARC0 Archival Process 0
00000001F02728C8 ARC1 Archival Process 1
00000001EC231030 ARC2 Archival Process 2
00000001EB200EA0 ARC3 Archival Process 3
00000001F026B548 LGWR Redo etc.
00000001EC229CB0 CKPT checkpoint
00000001EB1F9B20 SMON System Monitor Process
00000001EB1FCCA0 SMCO Space Manager Process
00000001F026C5C8 RECO distributed recovery
PADDR NAME DESCRIPTION
---------------- ----- ----------------------------------------------------------------
00000001EB201F20 CJQ0 Job Queue Coordinator
00000001F0273948 QMNC AQ Coordinator
00000001EC22AD30 MMON Manageability Monitor Process
00000001EB1FABA0 MMNL Manageability Monitor Process 2
根据版本的不同,后台进程数、名称、类型等都可能不同.
中心后台进程:
PMON(进程监视器):负责在出现异常中止的连接后完成清理.PMON还会向Oracle TNS监听器注册通信,向它传递相关的参数.
SMON(系统监视器):完成所有的系统级任务.包括以下内容:
清理临时空间,合并空闲空间,针对原来不可用的文件恢复活动的事务,执行RAC中失败节点的实例恢复,清理OBJ$,收缩回滚段,‘离线’回滚段.
RECO(分布式数据库恢复):基于2PC分布式协议,允许多个不同的修改实现原子提交,但是在真正提交前,出现网络失败等错误,事务成为一个可疑的分布式事务.此时
就需要RECO来负责联系事务协调器来发现协调的结果。在这之前事务会保持未提交状态.当恢复网络或者错误解决后,RECO可能会提交事务,也可能将事务回滚.
注:可疑分布式事务会导致写阻塞读的情况,即可疑分布式事务不能存在太长时间,DBA可自行手动提交或回滚.
CKPT(检查点进程):建立检查点主要是DBWn的任务.CKPT主要是更新数据文件的文件首部,从而辅助真正的建立检查点的进程.
DBWn(数据库块写入器):负责将脏块(修改过的块)写入磁盘的后台进程,它会写出缓冲区缓存的脏块,从而释放相应的空间.可以配置多个DBWn(上面有2个DBW0和DBW1),
最好的情况是DBWn使用异步I/O将块写入磁盘.采用异步I/O,DBWn会收集要写入的块,交给操作系统,然后立即返回,并收集下一批要写的块,操作系统完成写文件操作之后,它会异步地通知DBWn.
LGWR(日志写入器):它负责将SGA中重做日志缓冲区的内容刷新输出到磁盘.一般在下面几个情况时候,LGWR就会执行刷新操作:
1.每隔3秒会自动刷新一次
2.任何事务发出一个提交时
3.重做日志缓冲区1/3满,或者包含1MB的缓冲数据的时候.
ARCn(归档进程):当LGWR将在线重做日志写满时,归档进程就将其复制到另一个位置.ARCn一般将在线重做日志至少复制到两个位置.一般用于硬盘等介质损坏时数据库的恢复.
DIAG(诊断性进程):它会负责监视实例的整体状况,捕获处理实例失败时所需的信息并记录.
FBDA(闪回数据归档进程):此进程为oracle 11g r1版本新增进程.主要用于闪回数据,它主要维护随时间对表中每行所做的改变,而实现历史数据查询.它将读取事务生成的UNDO,并回滚事务做出的改变,然后将回滚的这些行记录保存在闪回数据归档中.
DBRM(数据库资源管理器进程):为数据库实例配置资源计划.
GEN0(通用任务执行进程):主要是分担另外某个进程的阻塞处理。
可选后台进程:
- ASMB(自动存储管理后台):该进程出现在ASM的数据库实例中.它负责与管理存储的ASM实例通信,向ASM实例提供更新的统计信息,并向ASM实例提供一个"心跳".
- RBAL(重新平衡进程):该进程也在使用了ASM的数据库实例中运行,向ASM磁盘组增加或去除磁盘时,它负责处理平衡请求,也就是重新分布负载请求.
RAC环境后台进程:
- LMON(锁监视器):监视集群中的所有实例,检测实例是否有失败.在实例离开或重新加入集群时重新配置锁和其他资源。
- LMD(锁管理器守护进程):它为全局缓存服务(保持块缓冲区在实例间一致)处理锁管理器服务请求.
- LMSn(锁管理器服务器进程):主要维持SGA块缓冲区缓存在各个RAC实例间相互保持一致.
- LOCK(锁进程):与LMD相似,但它处理所有全局资源的请求.
工具后台进程
- CJQO和Jnnn(作业队列进程):Oracle通过一种称为快照的数据库对象来提供复制特性,作业队列就是刷新快照时使用的内部机制.
- QMNC和Qnnn(高级队列进程):QMNC会监视高级队列.并告诉从队列中删除等待消息的"出队进程":已经有一个消息变为可用.它们还要负责队列传播.
- EMNC(事件监视器进程):它是AQ体系结构中的一部分,用于通知对某些消息感兴趣的队列.
- DMnn和DWnn(数据泵主进程/工作进程):数据泵是oracle 10g r1中新增的特性,主要用来替代EXP/IMP。
其他后台进程
- PSPO(进程生成器进程):它主要负责生成各个后台进程.
- VKTM(虚拟时间管理器进程):为oracle实例实现一个一致的、细粒度的时钟.
- SMCO(空间管理协调器进程):协调数据库的主动空间管理。