首页 > 代码库 > oracle 体系结构(一)
oracle 体系结构(一)
1)服务器进程
参考资料:http://blog.csdn.net/sunansheng/article/details/51281605?locationNum=4&fps=1
:http://www.cnblogs.com/lamiyiyi/p/lamiyiyi_oracle.html
oracle db创建服务器进程以处理连接到实例的用户进程的请求。在某些情况下,当应用程序和oracle db在同一台计算机上操作时,可以将用户进程和相应的服务器进程合并为一个进程,以减少系统开销。但是,当应用程序和oracle db在不同计算机上运行时,用户进程总是通过单独的服务器进程与oracle db通信。
代表每个用户的应用程序创建的服务器进程可以执行以下一项或多项操作:
①对通过应用程序发出的sql语句进行语法分析和运行。
②从磁盘上的数据文件中将必要的数据块读取到SGA的共享数据库缓冲区中(如果相应的数据块目前尚未在SGA中)。
③返回结果,使应用程序可以处理信息。
2)后台进程
1.database write--数据写入 DBWn
作用:把SGA中被修改的数据同步到磁盘文件中。保证Buffer Cache中有足够的空闲数据块数量。
PS:如果LGWR出现故障,DBWR不会听从CKPT命令罢工,因为Oracle在将数据缓存区数据写到磁盘前,会先进行日志缓冲区写进日志文件的操作,并耐心的等待其先完成,才会去完成这个内存刷到磁盘的动作,这就是所谓的凡事有记录。
触发条件:1、检查点CKPT 触发DBWn进程
2、一个服务进程在设定的时间内没有找到空闲块
3、每三秒自动唤醒一次
对于一个大型数据库或者修改非常频繁的系统而言,仅靠一个DBWn 进程为所有数据文件的写 操作提供服务,可能会力不从心。因此,Oracle 允许同时运行多个 DBWn 进程,以分担繁重的写负 载。这就是 DBWn 中n 的来历。数据库中最多可以使用 20 个DBWn 进程(n 从0~9 ,a~i)。数据库 初始化参数DB_WRITER_PROCESSES 就是用来定义DBWn 进程数量。如果没有定义这个参数, Oracle 缺省时按照 CPU 的数量来决定需要的进程个数。每8 个CPU 分配一个进程。
Oracle 推荐在增加 DBWn 进程数量之前,要先考虑使用异步 IO,有可能异步 IO就能够解决问 题,不需要增加进程数量。
2.log write:--日志文件写入 LGWR
作用:LGWR 进程的作用是吧Log Buffer中的日志内容写到联机日志文件中,从而释放 Log 用户Buffer 空间。数据库的所有修改操作(增、删、改)都会生成日志,这些日志最初先保存在 Redo Log Buffer 中,然后在某个时刻由LGWR 进程写入到磁盘的联机日志文件中。
触发条件:1、用户发出commit命令。(在oracle中称为快速提交机制(fast commit)):把redo log buffer中的记录写入日志文件,写入一条提交的记录
2、每三秒定时唤醒;
3、如果使用的 Log Buffer 超过了配置的 1/3 时,即 1/3 满会触发 LGWR 的写操作;
4、Log Buffer 中的日志数量超过 1MB 时,即 1MB 限制也会触发 LGWR 的写操作;
5、联机日志文件切换也将触发LGWR;
6、DBWR进程触发:DBWn视图将脏数据块写入磁盘先检测他的相关redo记录是否写入联机日志文件,如果没有就通知LGWR进程。在oracle中成为提前写机制(write ahead):redo记录先于数据记录被写入磁盘。
(1)提前写。
Oracle 使用的是提前写(Write-Ahead)机制,即和一个数据块相关联的的 Redo记录必须先于 数据块本身被记录到磁盘中。这就意味着,当DBWn 进程试图把一个脏数据块写到磁盘上之前, DBWn 进程会先确定和这个数据块相关联的所有Redo记录都已经被写到联机日志文件中了,如果 没有满足这个前提条件,那么 DBWn 进程就会通知 LGWR 进程,等待 LGWR 进程把相关日志都写 完后,DBWn 进程再把数据块内容写到磁盘文件中。
(2)快速提交。
每当用户发出Commit命令时,Oracle 只是会把Redo Log Buffer 中的记录写到日志文件中,同 时会在日志中写入一条代表事务已经提交的记录(Commit Record)。但是这个事务所修改到的数据 块并不会被写到数据文件中。或者说Oracle 对Commit操作成功的定义是这样的:只要这个事务的 Redo Record被写到日志文件中,这个事务就算是 Commit成功了,至于事务修改的数据是否记录到 数据文件没有任何关系。这也就是Oracle 的快速提交(Fast Commit)机制。
提前写(Write Ahead)和快速提交(Fast Commit)是 Oracle 两个很重要的运行机制,这两个机 制保证了事务提交不必等待数据写到磁盘,而之所以采用这种机制,也是平衡性能和可用性的结果。
对于一个繁忙的OLTP 系统来说,同时会有大量的事务发生,因此同时会有大量的Commit请 求,这时LGWR 进程就可以把许多的 Commit请求批量的写入日志文件,而不是针对每个Commit 请求立即处理,这种机制也叫做Group Commit。
3.checkpoint:--检查点事件 CKPT
作用:“检查点”是一种数据结构,用于定义数据库的重做线程中的系统更改号(SCN(system change number或者system commit number))。检查点被记录在控制文件和每个数据文件头中,它们是恢复操作的关键元素。出现检测点时刻数据文件的内容与SGA中的内容一致,这不是一个单独的进程,要和前两个进程一起工作呦。DBWR写入脏数据,同时触发LGWR进程,而 CKPT 进程只负责更 新控制文件中的检查点记录,它的任务量并不像 DBWn 进程和 LGWR 进程那么繁重.
注意:检查点所代表的数据一致和事务隔离级别所说的读一致性不是一个概念,后者是从数据完整性角度 来说的。而检查点的数据一致仅指内存和磁盘的数据一样,是从恢复的角度来说的,二者一定不能 混淆。虽然在检查点时刻,系统中会有很多未提交事务,修改后的脏数据最终可能被提交,永久生 效,也有可能回滚,还原成修改前的样子,但这不是检查点所关心的。检查点只关心恢复操作是否 可以从这一时刻开始。
如果遭遇数据库异常关闭,SGA 中还没有来得及写到磁盘的信息就丢失了,数据库再次启动时,就先要进行恢复工作,这种恢复叫做实例恢复(Instance Recovery )。SMON 进程负责实例恢复,实例恢复分成3 个阶段。
前滚(Roll Forward):这一阶段是读取联机日志,找到最后一次检查点之后的日志内容, 并重做这些日志,把数据库恢复到上次实例关闭时的状态,这时系统包含着提交和未提交的 事务。
打开数据库:为了减少用户等待时间,Oracle 选择尽可能早地打开数据库,打开数据库以 后,再继续进行恢复工作。现在用户就可以使用数据库。
回滚(Roll Back) :SMON 进程回滚未提交的事务,Server Process 也可以进行部分回滚工作。
除了实例恢复,SMON 进程还负责部分空间管理工作,包括:
如果使用字典管理表空间(DMT) ,SMON 进程需要合并空闲 Extents,以避免磁盘碎片, 这个功能叫做 Coalesce,这个任务每 3 秒执行一次;
SMON 进程负责清理临时段,以释放空间;
触发条件:SMON 进程也是定期被唤醒或者被其他进程主动唤醒
5.process monitor:--维护用户进程 进程监控器 PMON
作用:1、发现用户进程异常终止,并进行清理。释放占用资源。(清理异常终止用户使用的锁)
触发条件:定时被唤醒,其它进程也会主动唤醒它。
6.Distributed Database Recovery :-- 用于分布式数据库的恢复 RECO
作用:某个应用跨越多个数据库,需要都提交成功,事务才会成功,否则全部回滚
7.archive:--归档操作 ARCn
作用:归档(Archiver)进程负责归档模式的数据库的归档操作。我们知道每个数据库都必须要创建 至少两组联机日志,这些日志是循环使用的,也就是一组日志写满后,LGWR 就切换到另一组日志 继续写入,周而复始。因此稍早产生日志终将被新的日志覆盖掉,这是非归档模式。而归档模式比 非归档模式多出的处理就是,在发生日志切换时,ARCn 进程被唤醒,把之前写满的日志做一个文 件拷贝,这个拷贝被保存到一个特殊的目录下——归档目录,这个拷贝就叫做归档日志。每个联机 日志能够被覆盖的前提条件也相应地多了一个,除了要完成检查点,还必须完成归档操作。
归档模式就是确保数据库所有操作日志都被保留下来,这样能够最大程度的保证数据库的可恢 复性。
ARCn进程就是完成这个拷贝动作,和DBWn进程一样,ARCn进程可以有多个,最多是10个(n取值范围为0~9)。数据库的初始化参数LOG_ARCHIVE_MAX_PROCESSES 就是定义数据库启动时运行的ARCn的个数。
触发条件:日志切换时被LGWR唤醒。
8.LCKn 仅适用于RAC数据库,最多可有10个进程(LCK0,LCK1,...,LCK9),用于实例间的封锁。
oracle 体系结构(一)