SMON
是系统监视器(System Monitor)的缩写。如果Oracle实例失败,则在SGA中的任何没有写到磁盘中的数据都会丢失。有许多情况可能引起Oracle实例失败,例如,操作系统的崩溃就会引起Oracle实例的失败。当实例失败之后,如果重新打开该数据库,则背景进程SMON自动执行实例的复原操作。
PMON
是进程监视器(Process Monitor)的缩写。当取消当前的事务,或释放进程占用的锁以及释放其它资源之后,PMON进程清空那些失败的进程。
DBWR
是数据库书写器(Database Write)的缩写.该服务器进程在缓冲存储区中记录所有的变化和数据,DBWR把来自数据库的缓冲存储区中的脏数据写到数据文件中,以便确保数据库缓冲存储区中有足够的空闲的缓冲存储区。脏数据就是正在使用但是没有写到数据文件中的数据 , 数据缓冲区中的脏数据指的是更新后的数据。
触发DBWR进程的条件:
1. DBWR超时,大约3秒
2. 系统中没有多余的空缓冲区来存放数据
3. CKPT 进程触发DBWR
LGWR
是日志书写器(Log Write)的缩写。LGWR负责把重做日志缓冲存储区中的数据写入到重做日志文件中。
Redo Log Buffer是 SGA中一段保存数据库修改信息的缓存。这些信息被存储在重做条目(Redo Entry)中.重做条目中包含了由于INSERT、UPDATE、DELETE、CREATE、ALTER或DROP所做的修改操作而需要对数据库重新组织或重做的必须信息。在必要时,重做条目还可以用于数据库恢复。
触发LGWR进程的条件:
1. 用户提交
2. 有1/3重做日志缓冲区未被写入磁盘
3. 有大于1M的重做日志缓冲区未被写入磁盘
4. 3秒超时
5. DBWR 需要写入的数据的SCN大于LGWR记录的SCN,DBWR 触发LGWR写入。
Redo record 包含4个数据块:
回滚段的段头块:相应的事务表上标注事务信息,其中包括了xid,uba等;并且分配回滚块
数据块的块头块:分配事务槽,标注事务信息,其中包含了xid,uba等
回滚块:记录前镜像
数据块:修改
重做条目是Oracle数据库进程从用户内存中拷贝到Redo Log Buffer中去的。重做条目在内存中是连续相连的。后台进程LGWR负责将Redo Log Buffer中的信息写入到磁盘上活动的重做日志文件(Redo Log File)或文件组中去的。
参数LOG_BUFFER决定了Redo Log Buffer的大小。它的默认值是512K(一般这个大小都是足够的),最大可以到4G。当系统中存在很多的大事务或者事务数量非常多时,可能会导致日志文件IO增加,降低性能。这时就可以考虑增加LOG_BUFFER。
CKPT
进程是检查点(Checkpoint)的缩写。该进程可以用来同步化数据库的文件,它可以把日志中的文件写入到数据库中。
一个checkpoint操作可以分成三个不同的阶段:
第一阶段,checkpoint进程开始一个checkpoint事件,并记录下checkpoint RBA,这个通常是当前的RBA。
第二阶段,checkpoint进程通知DBWn进程将所有checkpoint RBA之前的buffer cache里面的脏块写入磁盘。
确定脏块都被写入磁盘以后进入到第三阶段,checkpoint进程将checkpoint信息(SCN)写入/更新数据文件和控制文件中。
触发CHECKPOINT的条件
1. 自动日志切换,或通过ALTER SYSTEM SWITCH LOGFILE。
2. DBA发出checkpoint命令,通过ALTER SYSTEM checkpoint。
3. 对数据文件进行热备时,针对该数据文件的checkpoint也会进行,ALTER TABLESPACE TS_NAME BEGIN BACKUP/END BACKUP。
4. 当运行ALTER TABLESPACE/DATAFILE READ ONLY的时候。
5. SHUTDOWN命令发出时。
--------------------------------------------------------------------
UNDO
通常对undo 有一个误解,认为undo 用于数据库物理地恢复到执行语句或事务之前的样子,但实际
上并非如此。数据库只是逻辑地恢复到原来的样子,所有修改都被逻辑地取消,但是数据结构以及数据库块本身在回滚后可能大不相同。原因在于:在所有多用户系统中,可能会有数十、数百甚至数千个并发事务。
数据库的主要功能之一就是协调对数据的并发访问。也许我们的事务在修改一些块,而一般来讲往往会有
许多其他的事务也在修改这些块。因此,不能简单地将一个块放回到我们的事务开始前的样子,这样会撤
销其他人(其他事务)的工作!例如,假设我们的事务执行了一个INSERT 语句,这条语句导致分配一个新区段(也就是说,导致表的空间增大)。通过执行这个INSET,我们将得到一个新的块,格式化这个块以便使用,并在其中放上一些数据。此时,可能出现另外某个事务,它也向这个块中插入数据。如果要回滚我们的事务,显然不能取消对这个块的格式化和空间分配。因此,Oracle 回滚时,它实际上会做与先前逻辑上相反的工作。对于每个INSERT,Oracle 会完成一个DELETE。对于每个DELETE,Oracle 会执行一个INSERT。对于每个UPDATE,Oracle则会执行一个“反UPDATE“,或者执行另一个UPDATE 将修改前的行放回去。