ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 进程结构之SMON,PMON,DBWn,LGWR (小猫爪印二)

进程结构之SMON,PMON,DBWn,LGWR (小猫爪印二)

原创 Linux操作系统 作者:木呼 时间:2011-07-04 14:37:06 0 删除 编辑

进程结构

系统监视器 SMON   system monitor

这个进程对于Oracle数据库来说,其负责的内容并不是很多,但是对于数据的安全与数据库的性能却有很关键的作用。如随着表空间中的数据不断的建立、删除、更新等等,在表空间中难免会产生碎片。由于这些碎片的存在,数据库的性能会逐渐的降低。而现在系统监视进程SMON的作用,就可以解决这些碎片。

  Oracle SMON进程会将各个表空间的空闲碎片合并在一起,让数据库系统更加容易分配。从而提高数据库的性能。另外,在数据库运行的过程中,会因为断电或者其他的原因而发生故障。此时由于数据高速缓存中的脏缓存块还没有来得及写入到数据文件中,从而导致数据的丢失。

  在数据库启动的时候,系统监视进程SMON会在下一次启动例程的时候,自动读取重做日志文件并对数据库进行恢复。也就是说,进行将已提交的事物写入数据文件(已经写入到日志文件中而没有写入到数据文件中的数据)、回退未提交的事务操作。可见,Oracle SMON进程是一个比较小但是却非常重要的角色。

  在管理这个进程的时候,主要需要注意两个问题。一是其启动的时机。一般情况下,实例重新启动的时候,会启动这个系统监视进程。然后在这个实例运行期间,这个进程也会被系统定期的唤醒,然后其会检查是否有工作需要其完成。最重要的是,在有需要的时候,数据库管理员可以通过其他进程来启动这个SMON系统系统监视进程,来完成一些特定的工作。

  第二需要注意表空间配置对这个进程的影响。在表空间管理中,有一个参数叫做PCTINCREASE。如果将这个参数设置为0的话,则这个SMON系统监视进程对于这个表空间的作用就要打折扣了。在设置为0的情况下,SMON进程就不会对这个表空间中的空闲碎片进行整理、合并操作。也就是说,需要数据库管理员通过数据的导出导入等手工操作,才能够解决表空间的碎片问题。

  显然这会增加数据库管理员的工作量。为此笔者建立,除非有特别的需要,不要将这个参数设置为0。让Oracle SMON进程自动对表空间中的碎片进行管理,自动合并表空间中的空闲碎片。不过如果某个表空间这个参数设置为0的话,不会影响到系统监视进程的其他用途,如不会影响到在例程非正常关闭时对数据的恢复操作。

即即使这个参数设置为0 ,在有需要的时候其仍然可以利用重做日志文件中的记录来恢复相关的数据。

 

进程监视器 PMON process monitor

用户会话是连接到服务器进程的用户进程。PMON监视所有服务器进程,并检测会话中任何问题,如果会话异常终止,PMON将销毁服务器进程,将其PGA内存返回给操作系统的空闲内存池,并回滚任何尚在进行的未完成事物。

 

数据库写入器 DBWn    Database Writer

会话通常并不将数据写入磁盘。会话将数据(或现有数据的更改)写入数据库告诉缓存区中的缓冲区。由数据库写入器负责在随后将缓冲区写入磁盘。一个实例可能有多个数据库写入器(最多不超过20个),依次为 DBW0 DBW1….. 默认数量是每8CPU对应一个数据库写入器。

DBWn 根据极懒算法执行写入:尽可能少,再尽可能少。在以下四种情况,DBWn将执行写操作:没有任何可用缓冲区,脏缓冲区过多,遇到三秒超时,或遇到检查点。

1,           如果服务器进程需要将块复制到数据库高速缓存区中,则首先必须查找可用缓冲区。可用缓冲区是既不脏(更新过,但尚未写回磁盘)也未被占用(即相应时刻正被另一个会话使用)。不能覆盖脏缓冲区,否则将丢失已更改的数据,也不能覆盖被占用的缓冲区,因此操作系统的内存保护机制不允许这么做。如果服务器进程查找可用缓冲区用时过长,就会通知DBWn将某些脏缓冲区写入磁盘。一旦完成,就会清理缓冲区,也就有了可用的缓冲区。

2,           脏缓冲区数量过多

Oracle发现脏缓冲区过多,由CKPT发起一个增量checkpoint,然后dbwn执行

3,           遇到三秒超时,DBWn每三秒会对一些缓冲区清理一次。在实践中,这对生产系统影响不大,因为前面描述的两种情况将强制执行写入,但超时意味着:即使系统处于闲置状态,最终也会清理数据库高速缓存。

4,           可能存在请求的检查点。当遇到检查点时,会写入所有脏缓冲区。这意味着可能有几十万个脏缓冲区。在检查点期间,磁盘I/O数量将达到顶峰,CPU使用率可能高达100%,终端用户会话性能将下降,用户开始发牢骚。当完成检查点后(这可能需要数分钟的时间),性能将恢复到通常的状态。

唯一绝对需要检查点的时刻是:关闭了数据库,关闭了实例。检查点将所有脏缓冲区写入磁盘:这就是先了高速缓存区与数据文件的同步,实例与数据库的同步。

强制设置检查点:  alter system checkpoint;

注:这里说的检查点是 完全检查点

注意:在提交事务的时候,DBWn 什么都不做。

 

数据库写进程在以下事件之一发生时把数据库高速缓冲区的数据写到数据文件上:

    当脏缓冲区的数量超过了所设定的限额

当所设定的时间间隔已到

当有进程需要数据库高速缓冲区却找不到空闲的缓冲区时

当检查点发生时

当某个表被删除(drop)或被截断(truncate)

当某个表空间被置为只读状态(read only)

当使用类似于ALTER TABLESPACE users BEGIN BACKUP的命令对某个表空间进行联机备份

..

当某个临时表空间被设置为只脱机状态(offline)或正常状态(normal)时等

日志写入器 LGWR        log writer

LGWR 将重做日志缓冲区的数据写入到磁盘上的联机重做日志文件。

当会话对数据库高速缓冲区中的块执行任何更改时,在其将更改应用到块之前,会将要应用的更改矢量写出到日志缓冲区。为了保证不丢失任何工作,必须在最大程度减少延迟的情况下将这些更改矢量写入磁盘。

当会话发出commit时,LGWR会实时写入:在LGWR将缓冲区写入磁盘时,会话将挂起。

 

LGWR是一个必须和前台用户进程通信的进程。当数据被修改的时候,系统会产生一个重做日志并记录在重做日志缓冲区内。这个重做日志可以类似的认为是以下的一个结构:

  SCN=000000001000

  数据块ID

  对象ID=0801

  数据行=02

  修改后的数据=0011

  提交的时候,LGWR必须将被修改的数据的重做日志缓冲区内数据写入日志数据文件,然后再通知前台进程提交成功,并由前台进程通知用户。从这点可以看出LGWR承担了维护系统数据完整性的任务。

1,    LGWR 工作的主要条件如下

2,    用户提交

3,    1/3 重做日志缓冲区未被写入磁盘

4,    有大于1M 重做日志缓冲区未被写入磁盘

5,    超时 注意超时实际是在DBWR上,但是由于LGWR总是优秀于DBWRLGWR也就有了三秒超时

6,    DBWR需要写入的数据的SCN号大于LGWR 记录的SCN号,DBWR 触发LGWR写入

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23754390/viewspace-701299/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-04-19

  • 博文量
    93
  • 访问量
    152830