我们所说的Oracle数据库由实例和数据库本身组成。实例由内存和进程组成,数据库本身由存储在本地的数据文件组成。所以学习Oracle数据库必须要理解的三座大山就是:内存结构、进程结构和存储结构。
本章学习第二座大山,进程结构。
Oracle最令人叹为观止的地方是它数据库的稳定性和可恢复性,这也是目前大部分国产数据库的劣势所在。世界都在去O,但是国内很多的政企、银行等用的都还是Oracle。
Oracle数据库里有5个历史悠久的非常重要的进程(本文中的重要主要指对Oracle数据库的理解比较重要,并非对Oracle数据库重要。所有的进程都对数据库非常重要),分别是:
另外历史不如上面悠久,但是依然重要的进程,分别是:
6. 可管理性监视器进程(Manageability Monitor,MMON)
7. 内存管理进程(Memory Manager,MMAN)
8. 归档进程(Archiver,ARCn)
9. 恢复进程(Recoverer,RECO)
以上是学习进程结构必须要理解和掌握的9个进程。
另外, Oracle数据库在各个平台上对于进程的展现形式不同。Linux和Unix平台上,各个进程都是独立的操作系统进程。但是在Windows平台上,只会存在一个名为“ORACLE.EXE”的进程,各个进程作为此ORACLE.EXE的独立线程运行。
SMON,System Monitor,系统监视器进程,负责打开数据库时候的恢复、整理数据库表(段)空间的碎片等。它通过验证所有数据文件和联机重做日志文件来打开数据库。数据库状态置为open之后,SMON的主要工作内容就放在各种内部任务上,如合并空闲空间,处理表(段)空间碎片。
PMON,Process Monitor,进程监视器进程,负责监视所有服务器进程,并且检查连接会话中的问题。如果会话异常中止,PMON会及时销毁对应的服务器进程,将PGA内存返回给系统空闲内存池,并回滚所有未提交的事务。
DBWn,数据库写进程,这个n没有实际的含义只是标识了数据库写进程的编号而已,只要你愿意,叫它DBWx也行,x <= 100。DBWn的名称可以是DBW0到DBW9,然后是DBWa到DBWz,再往后是BW36到BW99,默认每8个CPU一个数据库写进程。它主要负责将Database Buffer Cache中的脏缓冲区写入数据文件,做持久化。这里需要再次声明,数据库写进程DBWn是不受我们commit影响的,我们commit影响的是日志写进程LGWR。DBWn选择要写入的脏缓冲区的原则是:最近最少使用。也就是说,DBWn将最近最少使用的脏缓冲区写入数据文件。
以下四种情况,DBWn将执行写操作:
首先,第一种情况。当数据被读取到Database Buffer Cache时,需要先查找空闲的缓冲区,也就是说既不脏也没被占用的缓冲区。如果长时间找不到空闲缓冲区,那么DBWn就会将某些脏缓冲区写入磁盘。完成之后,就有可用的空闲缓冲区了。
第二种情况是脏缓冲区过多,这个多是由Oracle一个内部值决定的。
第三种情况,三秒钟超时。DBWn每三秒钟会对一些缓冲区进行写操作。前面两种情况是强制写,而三秒钟超时意味着即使没有脏缓冲区,也要DBWn也要执行一次清理。
第四种情况是遇到检查点。前面三种情况是部分写入(称为增量检查点或提高增量检查点位置),最后这种情况是全部写入,把所有的脏缓冲区全部写入数据文件。
前三种情况是在Oracle运行过程中自动执行的,不会给系统的I/O造成比较大的压力。但是在执行检查点的情况下,可能同时有非常大量的脏缓冲区需要写入磁盘,所以当时的磁盘I/O会到达顶峰,CPU使用率很可能会爆高到100%。因此,一般在不得已的时候才使用检查点:
alter system checkpoint;
必须使用检查点的时候就是一致性关闭数据库的时候。拥有以上行为的检查点称为完全检查点。对应的有局部检查点,它强制写入若干数据文件(但不是数据库所有的数据文件)的块的脏缓冲区。局部检查点在以下情况强制自动执行:
当然,局部检查点相对于完全检查点对系统的压力要小。
LGWR,Log Writer,日志写进程,负责将日志缓冲区Log Buffer中的内容写入到磁盘的联机(重做)日志文件中,这个写入的过程称为“日志缓冲区转储”。
当我们对数据做任何更改时(包括增删改),这个更改会写入到两个缓冲区,一个是Database Buffer Cache ,用于写入到数据文件;另一个是Redo Log Buffer,用于写入联机重做日志文件。为了防止丢失更改,LGWR进程几乎实时地将Redo Log Buffer写入到联机重做日志文件中。当我们commit时,会话挂起,LGWR执行写入操作,写入完成,事务标记为不可callback的已提交返回给会话,会话重新可用。
三种情况下,LGWR必须执行(日志)写操作:
第一种情况,保证了已提交commit的事务中的所有变更都可以在联机重做日志中记录,这是数据库数据不丢失的保证。如果数据库损坏,可以在还原上一次备份的基础上,利用自上次备份以来的(归档)联机重做日志进行事务重做。当然,commit的事务会重新写入数据文件,未提交的事务不会持久化存储。
在第二种情况下,也就是日志缓冲区三分之一满的时候,也会使LGWR执行写操作。一般来说日志缓冲区只有MB级大小,应用程序(比如JAVA程序)会在不到一秒的时间生成足以充满1/3的重做内容(更改),所以说,LGWR会几乎实时地执行写操作。此后,在会话发出commit命令的时候,由于没有太多要一次性写入到日志中的内容,所以commit也几乎是实时完成的。
第三种情况,为了防止瞬间断电等突发情况的发生而导致数据的不一致,DBWn在写入数据文件之前要执行日志写操作,因为日志写操作能提供数据在没有写入数据文件情况下的数据可恢复性。另外由于DBWn的写操作是有三秒钟超时的,而日志写操作必须要在DBWn之前执行一次,所以LGWR也就有了三秒钟超时的触发条件。
CKPT,Checkpoint,检查点进程。执行CKPT进程会使得DBWn进行写操作。CKPT不再必须执行完全检查点,但是它必须跟踪重做日志中的增量检查点位置。在必要的时候,CKPT会执行增量检查点,以使得增量检查点的位置前移。增量检查点位置是发生故障时,重做开始的位置。CKPT使用当前检查点位置去刷新控制文件。
MMON,Manageability Monitor,可管理性监视器进程,以前也叫Memory Monitor,内存监视器进程用于支持Oracle数据库的自我管理和自我调整的进程,简单地理解为“监视器的监视器”。MMON从SGA定期收集统计数据(默认每小时一次),并写入到数据字典中,默认存储八天。
MMON每收集一组统计数据都会调用ADDM(Automatic Database Diagnostic Monitor),收集的数据一般称为快照(引用自《OCA/OCP_Oracle_Database_12c_ALL-IN-ONE_Exam_Guide》)。
除此之外,MMON还监控数据库和实例,决定是否发出警报。
MMNL,Manageability Monitor Light,我把它叫轻量级MMON,实际就是MMON的辅助进程。比如MMON要将数据写入数据字典的时候,(一般是SGA)内存缓冲区满了,此时MMNL就担任起MMON的职责转储数据了。
下面是Oracle官网给出的解释:
MMON,Manageability Monitor,它执行了与AWR(Automatic Workload Repository)相关的热工作任务。举个例子,MMON写发生的情况包括:比如在度量超过了它的阈值,产生快照,为最近更改的sql对象抓取统计信息值。The manageability monitor lite process (MMNL) ,类MMON进程。当ASH缓冲满的时候,MMNL从SGA的ASH缓冲中将统计信息写入到磁盘中。
MMAN,Memory Manager,内存管理进程,支持内存分配的自动管理。有了这个进程,我们DBA只需要去设置总的内存大小,SGA以及PGA等,MMAN会在DBA设置的总体大小范围内进行自动分配。
LREG,Listener Registration,侦听器注册进程^(来自Oracle官方文档,一说Listener Regulation)^。它注册了有关数据库实例和Oracle网络监听调度程序的信息。这样,用户就可以通过侦听器连接到数据库。同时LREG还能根据工作负载与性能信息更新侦听器,这在多实例环境下是比较智能的。之前这个功能是由PMON来实现的。
ARCn,Archiver,归档进程。它将联机重做日志文件的内容写入到归档日志文件中。由于联机重做日志文件只有那么几组,每组几个文件,每个文件就几兆,它们会频繁地被刷新,不可能保留长期且完整的重做条目,所以,为了保证可恢复性,必须在联机重做日志文件被刷新前将其归档。如果启用了归档模式,ARCn将会启动,一旦ARCn异常,数据库实例将会挂起。ARCn最多有30个,命名为ARC1~ARC30。
RECO,Recoverer,恢复进程。它是在分布式架构下,解决分布式事务失败问题的进程。
例如:
update employees
set salary=salary*1.1
where employee_id=1000;
update employees@remote
set salary=salary*1.1
where employee_id=1000;
commit;
以上commit命令在执行时要求本地数据库和远程数据库同时更新。如果远程数据库更新失败,那么将会出现数据不一致的情况,则整条事务失败,应该回滚两条update。整个过程分为两个阶段,第一阶段是LGWR将日志缓冲区写入磁盘,第二个阶段才是提交。任何位置发生错误,RECO进程将会介入,取消提交并且回滚事务。
以上。挚谢阅读。