Oracle专家高级编程 第二章 进程
在Oracle实例中有3类进程
- 服务器进程(Server Process),基于客户端请求执行工作
- 后台进程(Background Processes),伴随数据库启动而启动,执行各种维护工作
- 从属进程(Slave Process),类似于后台进程,代表后台进程或服务器进程执行额外工作的进程
服务器进程
在专用服务器模式下,客户端会话和服务器进程之间存在一对一的映射关系,如果在UNIX机器上有100个会话,将有100个进程执行
当客户端和服务器在相同的机器上时,采用双进程(双任务)体系结构:
远程执行(Remote Execution),对于在数据库本身以外的机器上运行的客户端应用程序
地址空间隔离(Address Space Isolation),服务器进程拥有对SGA的读写访问,如果客户端进程和服务器进程是物理链接在一起的话,客户端进程中的错误指针可以容易损坏SGA中的数据结构
共享服务进程
客户端和服务器在相同的机器上
客户端应用程序,连接有Oracle库,将物理地连接到MTS分配器上
可以为任何一个给定的实例配置MTS分配器,只将一个分配器配置给大量用户不现实
分配器负责接收来自客户端应用程序的入站请求,并将它们放入请求队列中俄SGA中
第一个可提供的共享服务器进程基本上与专用服务器进程相同,从队列获取,共享服务器处理请求,并将其输出到响应队列中
分配器监控结果的响应队列,传递回客户端应用程序
专用服务器和共享服务器
专用服务器模式
- 是所有基于SQL的应用程序使用连接到Oracle最一般方法
- 容易建立,提供了便捷方法
- 客户会话和服务器进程具有一对一映射
共享服务器模式
- 不要长时间占有
- MTS的第一条规则,保证事务是短期的
- 可以是频繁的,应该是短小的,如OLTP系统特性
- 如果不短小,由于共享资源被一些进程独占,导致系统速度下降,如果全部共享服务都忙,系统被挂起
MTS主要做3件事
- 减少OS进程或线程的数量,os可以在更大程度上避免来回切换
- 允许手动限制并行的程度
并行的用户增加,事务的数量也在增加,添加附加的用户并不增加每秒可以执行的事务数量,趋向平稳
吞吐量达到高峰,响应时间上升,当添加用户时,发现吞吐量开始下降,下降前的并行用户数量期望允许并行的最大值
- 缩减系统上需要的内存
系统使用MTS最有价值的理由之一,减少所要求内存的数量
当使用MTS时
- UGA位于SGA中,在MTS切换时,必须准确地决定所期待的UGA内存的需要,借助LARGE_POOL在SGA中合理分配
- SGA对MTS配置的要求通常情况下很大,内存必须是预分配的
当使用专用服务器时
- 任何人都可以使用没有分配给SGA的任何内存
- 如果SGA由于UGA在其中而比较大,它来自拥有许多已分配的小PGA
- 每个专用/共享服务器有一个PGA,排序盘区、散列盘区以及其他进程相关的结构
后台进程
Oracle实例由两个部分组成:SGA和一系列的后台进程,后台进程执行维持数据库运行所需的日常维护任务
两类后台进程
- 集中的后台进程
- 实用程序后台进程
集中的后台进程
启动实例时,多数但不是全部进程呈现出来
如果在归档日志模式中,已经启用了自动归档,只看到ARCn(归档器),只能看到
LMD0,LCKn,LMON和BSP
PMON -- 进程监控器
负责连接非正常中断后的清除工作,如果专用服务器失败或由于某种原因被破坏,PMON是负责释放资源的进程
PMON负责监控其他Oracle后台进程,在需要的时候重新启动它们
如果一个共享服务器或分配器失败,PMON将监控所有这些Oracle进程,而不是重启,在适当时候中断实例
SMON -- 系统监控器
SMON是完成其他进程不能完成的那些工作的进程,它是数据库的一种"垃圾回收器"
清除临时空间 --
- 构建一个索引时,在创建期间分配给索引的盘区标记为TEMPORARY(临时)
- 如果CREATE INDEX会话由于某种原因中断,SMON将负责将它们清除
崩溃恢复 --
- 在启动时,SMON负责实施失败实例的崩溃恢复
聚结空闲空间 --
- 如果正在使用字典管理表空间,SMON负责获得在表空间中空闲盘区,连接到一起,聚结成为一个"较大"空闲盘区
从不可用的文件中恢复事务的活动 --
- 类似于数据库启动期间的作用,SMON恢复失败的事务
- 这些事务在是例/崩溃恢复期间,由于文件对于恢复不可用而忽略
OPS中失败节点的实例恢复 --
- 在Oracle并行服务器配置中,当聚簇中的一个节点宕机(机器发生故障)
- 实例中其他一些节点将打开失败节点的重做日志文件,对那个失败的节点执行全部数据的恢复
清除OBJ$ --
- OBJ$是一个低级的数据字典表,它是数据库中几乎所有对象都包含的一个入口
- 这个入口代表删除的对象,用于Oracle的依赖机制,SMON是删除这些不再使用的行的进程
缩减回滚段 --
- 如果已经设置,SMON是执行将回滚段自动缩减至最佳大小进程
使回滚段"脱机",回滚段不是真正脱机,被标记"挂起脱机"
RECO--分布式的数据库恢复
- 它恢复在两阶段提交(2PC),由于崩溃或连接丢失而遗留的准备状态的事务
- 2PC是一个分布式协议,允许影响许多独立的数据库的修改能自动提交
- 提交前试图尽可能多的关闭分布式失败的窗口
- 在N个数据库之间的2PC中,这些数据库中的一个,通常是客户端最初注册的那个数据库,成为协调者
- 如果所有的站点都报告为yes,站点协调者在N-1个站点的每一个上广播消息,都提交持久化
- 如果在一些站点报告yes后,准备提交,网络故障,这个事务就变成了一个有问题的分布事务
- 2PC试图限制发生此事的时间窗口,但不能删除它,如果此时此刻发生了故障,事务变成RECO的责任,RECO联系协调者,联系上之后提交事务
- 如果长时间的停止,又有一些未完成的事务,可以手工提交/回滚
CKTP -- 检查点进程
- 通过更新数据文件的头文件协助检查点进程
- 过去CKPT可选的进程,从Oracle8开始,必须启动
DBWn -- 数据库块写入器
- 是一个后台进程,负责将脏块写入磁盘
- DBWn从缓冲区高速缓存中写出脏块,通常是为了在高速缓存中腾出更多的空间(读取、释放缓冲区)或增进一个检查点
- 当Oracle切换日志文件时,就标志了一个检查点
- Oracle需要增进检查点,从而使它不再需要它刚填满的联机重做日志文件
- 需要重做日志文件却没能够增进检查点,获得"checkpoint not complete"的消息,并且必须等待
- DBWn性能很关键,将块写出的速度不能足够快释放缓冲区,将等待 FREE_BUFFER_WAITS,而且"Write Complete Waits"开始增长
总结一下DBWn
将块分散地写到所有磁盘上
当进行一个更新时,将修改到处保存的索引块,也修改随机分布在磁盘上的数据块
LGWR完成了重做日志的连续写入,分散写入明显比顺序慢,通过拥有SGA缓冲区的修改块,LGWR进程进行大量的顺序写入
顺序写入可以重建这些脏缓冲区,性能上获得提升
LGWR -- 日志写入器
LGWR进程负责将位于SGA中的重做日志缓冲区中的内容刷新到磁盘
- 每3秒
- 当提交时
- 当重做日志缓冲区1/3满时,或包含了1MB的缓存数据
ARCn -- 归档进程
- 当LGWR填满联机重做日志时,将其复制到另外的位置
- 归档联机重做日志文件将随后用于实施介质恢复
- 联机重做日志是在万一硬盘发生故障时,修改数据文件用的
- ACRn通常将联机重做日志文件复制到至少两个其他位置,一个在本地一个在另一台机器,即使灾难性故障也不怕
BSP -- 块服务器进程
- 用于Oracle并行服务器(OPS)环境,OPS是Oracle的一个配置,一个以上的事例装载并打开相同的数据库
- 每一个Oracle的实例在聚簇中不同的机器上运行,都以读写方式访问完全相同的数据库文件
- SGA块缓冲区必须保持相互一致,这时BSP的主要目标
- 在OPS早起版本中,通过ping完成,如果簇中一个节点需要一个块的读取一致的视图,此块被另一个节点锁定为独占模式
- 数据交换通过磁盘刷新来完成,耗时耗空间,通过BSP,数据互换在聚簇之间额高速连接上通过高速缓冲存储器之间交换完成
LMON -- 锁定监控进程
- 用于OPS环境,LMON监控聚簇中所有进程,检测实例的失败
- 通过与聚簇硬件使用的分布式锁定管理器(DLM,distributed lock manager)配合,实现由失败实例保存的全局块的恢复
LMD -- 锁定管理器守护程序
- 用于OPS环境,LMD进程控制聚簇环境中的块缓冲区缓存高速的全局锁和全局资源
- 其他实例对本地LMD发出请求,请求他释放锁,LMD也处理全局死锁的检测与解决
LCKn -- 锁定进程
- 用于OPS环境,类似LMD,处理所有全局资源的请求,不是数据库缓冲区的请求
实用程序后台进程
- 两个实用的后台进程:一个处理提交作业的运行,Oracle有一个内置于数据库内的批作业队列,允许一次性进行调度或重复执行作业
- 其他进程管理并处理与SQ相关联的队列表
SNPn -- 快照进程(作业队列)
QMNn -- 队列监控进程
EMNn -- 事件监控进程
从属进程
IO从属进程
为不支持异步IO的系统或设备模拟异步IO
将不支持异步IO的设备,通过使用IO从属进程模拟为驱动器实现异步IO
- BACKUP_TAPE_IO_SLAVES,指定IO从属进程是否由RMAN应用来备份数据、复制数据或把数据恢复到磁带中
- DBWn_IO_SLAVES,描述由DBWn进程使用的IO从属进程的数量
并行查询从属进程
Oracle7引入了并行查询功能,执行计划中可以同时完成执行计划,每一个计划输出合并为一个大的结果
睁开眼,书在面前 闭上眼,书在心里