`
suoyihen
  • 浏览: 1359991 次
文章分类
社区版块
存档分类
最新评论

《Oracle编程艺术》学习笔记(11)-Oracle进程

 
阅读更多
Oracle实例主要有3类进程(在Windows中,实际上是线程):
·服务器进程(server process):这些进程根据客户的请求来完成工作。服务器进程包括专用服务器和共享服务器。http://blog.csdn.net/fw0124/article/details/6898693
·后台进程(background process):这些进程随数据库而启动,用于完成各种维护任务,如将块写至磁盘、维护在线重做日志、清理异常中止的进程等。
·从属进程(slave process):这些进程类似于后台进程,不过它们要代表后台进程或服务器进程完成一些额外的工作。

可以用下面的语句来查询系统中有哪些后台进程,这个视图中paddr不是00的行都是系统上运行的进程。
select paddr,name,description from v$bgprocess order by paddr desc;

PADDR NAME DESCRIPTION
-------- ---------- ------------------------------------------------------------
35486804 CJQ0 Job Queue Coordinator
35485CFC SMCO Space Manager Process
354851F4 VKRM Virtual sKeduler for Resource Manager
354830DC QMNC AQ Coordinator
354825D4 ARC3 Archival Process 3
35481ACC ARC2 Archival Process 2
35480FC4 ARC1 Archival Process 1
3547F9B4 ARC0 Archival Process 0
3547D89C MMNL Manageability Monitor Process 2
3547CD94 MMON Manageability Monitor Process
3547C28C RECO distributed recovery
3547B784 SMON System Monitor Process
3547AC7C CKPT checkpoint
3547A174 LGWR Redo etc.
3547966C DBW0 db writer process 0
35478B64 MMAN Memory Manager
3547805C DIA0 diagnosibility process 0
35477554 PSP0 process spawner 0
35476A4C DBRM DataBase Resource Manager
35475F44 DIAG diagnosibility process
3547543C GEN0 generic0
35474934 VKTM Virtual Keeper of TiMe process
35473E2C PMON process cleanup
00 RSMN Remote Slave Monitor
...
00 XDWK cell automation worker actions

已选择295行。

后台进程包括一些必不可少的进程和一些可选进程。

以下是一些比较重要的后台进程。
1. PMON:进程监视器(Process Monitor)
·负责在出现异常中止的连接之后完成清理
·负责监视其他的后台进程,并在必要时(如果可能的话)重启这些后台进程
·这就是向Oracle TNS监听器注册Oracle实例

2. SMON:系统监视器(System Monitor)
·清理临时空间
·合并空闲空间
如果你在使用字典管理的表空间,SMON要负责取得表空间中相互连续的空闲区段,并把它们合并为一个更大的空闲区段。
·针对原来不可用的文件恢复活动的事务:这类似于数据库启动时SMON的作用
·执行RAC中失败节点的实例恢复
·清理OBJ$
·收缩回滚段
·“离线”回滚段
让一个有活动事务的回滚段离线(offline),在这种情况下,回滚段并没有真正离线;它只是标记为“将要离线”。在后台,SMON会定期尝试真正将其置为离线,直至成功为止。
·很多其他维护工作。
SMON会定期醒来或被其他后台进程唤醒,执行这些维护工作。

3. RECO:分布式数据库恢复(Distributed Database Recovery)

4. CKPT:检查点进程(Checkpoint Process)
建立检查点就是把脏块(已修改的块)从块缓冲区缓存写至磁盘。Oracle切换日志文件时就会标记(建立)一个检查点。Oracle需要推进检查点,推进检查点后,就不再需要它刚填满的在线重做日志文件了。
检查点进程并不真的建立检查点,建立检查点主要是DBWn的任务。CKPT只是更新数据文件的文件首部,以辅助真正建立检查点的进程(DBWn)

5. DBWn:数据库块写入器(Database Block Writer)
负责将脏块写入磁盘的后台进程。DBWn会写出缓冲区缓存中的脏块,通常是为了在缓存中腾出更多的空间(释放缓冲区来读入其他数据),或者是为了推进检查点(将在线重做日志文件中的位置前移,如果出现失败,Oracle 会从这个位置开始读取来恢复实例)。
可以配置多个DBWn,充分利用硬件系统能力。
可能情况下,DBWn使用异步I/O将块写至磁盘。采用异步I/O,DBWn会收集一批要写的块,并把它们交给操作系统,立即返回,并收集下一批要写的块。当操作系统完成写操作时,它会异步地通知DBWn。

DBWn会把块写出到所有磁盘,即分散在各个磁盘上,也就是说,DBWn会做大量的分散写(scattered write);
LGWR则是向重做日志完成大量的顺序写(sequential write)。
从理论上讲,如果提交期间Oracle已经将已修改的块物理地写出到磁盘,就可以跳过写在线重做日志文件。但实际上,提交期间,只是由LGWR会把每个事务的重做信息写至在线重做日志,DBWn则在后台将数据库块刷新输出到磁盘。
这么做的原因就是分散写比顺序写慢多了。DBWn 在后台完成它的任务(很慢),而LGWR在用户提交后等待时完成自己的任务(这个任务比较快),就能得到更好的整体性能。尽管从技术上讲这样会使Oracle执行更多不必要的I/O(写日志以及写数据文件)。

6. LGWR:重做日志写入器(Log Writer)
LGWR 进程负责将SGA中重做日志缓冲区的内容刷新输出到磁盘。
数据在重做缓冲区里停留的时间不会太长。实际上,LGWR会在以下某个情况发生时启动对这个区的刷新输出到磁盘(flush):
·每3秒一次
·无论何时有人提交请求
·要求LGWR切换日志文件
·重做缓冲区1/3满,或者包含了1MB的缓存重做日志数据
由于这些原因,如果重做缓冲区的大小超过几MB,通常对系统就没有什么意义了。如果是一个有大量并发事务的大型系统,也许大的重做日志缓冲区会对它有利,因为LGWR把日志缓冲区的一部分输出到磁盘时,其他会话可能会在缓冲区中填入新的数据。一般而言,如果一个事务长时间运行,就会生成大量重做日志,采用更大的日志缓冲区对这种事务最有好处。

7. ARCn:归档进程(Archive Process)
ARCn 进程的任务是:当LGWR 将在线重做日志文件填满时,就将其复制到另一个位置。
在线重做日志用于在出现电源故障(实例终止)时“修正”数据文件,而归档重做日志用于在出现硬盘故障或者误操作删除数据时配合数据文件备份“修正”数据文件。

如果在服务器的警告日志文件(alert_<ORACLE_SID>.log)中看到如下的警告消息:
Thread 1 cannot allocate new log, sequence 1466
Checkpoint not complete
Current log# 3 seq# 1465 mem# 0: /home/ora10g/oradata/ora10g/redo03.log
警告消息中也可能指出Archival required而不是Checkpoint not complete,但是结果几乎一样。
如果数据库试图重用一个在线重做日志文件,但是出现以下情况,就会输出这样一条警告消息。
·DBWn还没有完成重做日志所保护数据的检查点(checkpointing)
·ARCn还没有把重做日志文件复制到归档目标
对最终用户来说,这个时间点上数据库实际上停止了。DBWn 或ARCn将得到最大的优先级以将redo块刷新输出的磁盘。

解决这个问题的办法:
·对DBWR调优,或者使用多个DBWR进程。看看系统产生的I/O,查看是否有一个磁盘(或一组磁盘)“太热”,相应地需要将数据散布开。这个建议对ARCn也适用。
·增加更多在线重做日志文件或者创建更大的重做日志文件。这给DBWn留出了足够的活动空间来建立检查点,也给ARCn留出足够的时间来归档日志。
·让检查点发生得更频繁、更连续。可以修改诸如FAST_START_MTTR_TARGET 、LOG_CHECKPOINT_INTERVAL和LOG_CHECKPOINT_TIMEOUT等参数设置以强制DBWn更频繁地刷新输出脏块。缺点是会导致缓冲区缓存不能充分发挥作用。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics