二、Oracle 写入数据过程
1、System Change Numbers (SCNs)
系统改变号(system change number (SCN))是一个合乎逻辑的,内部的Oracle数据库所用的时间戳记。
在所有数据库数据改变写入磁盘前,Oracle数据库使用SCN号标志这一时刻,
以便数据库恢复时应用不必要的Redo操作。
数据库也会标志位于redo重做的数据集时点以便恢复停止。
SCN号产生一个单调递增序列。Oracle数据库向使用使用时钟一样使用SCN。
如果一个事件比另一个事件的SCN号低,那么它相对于数据库发生在一个较早的时间 。
如果几个事件可以共享相同的SCN,这意味着他们在数据库同一时间发生。
每个事务都有一个SCN。例如,
如果一个事务更新一行, 那么事务在发生更新时数据库记录SCN号。
Oracle数据库的增量SCN号在system global area (SGA)中。
当事务修改数据,数据库中写入一个新的SCN到分配给这个事务的undo数据段。
日志写进程写入提交的事务 记录,立即向联机重做日志。
这时数据库日志写入进程立即将事务的提交记录写入到在线联机重做日志online redo log上。
提交记录的交易具有独特的SCN。Oracle数据库使用的SCN是 实例恢复和介质恢复机制的一部分。
2、各种后台进程的作用:
Ckpt、lgwr、dbwn之间的协作。
(1)Ckpt:检查点进程 Checkpoint Process
检查点进程(CKPT)更新控制文件和数据文件头,这个数据文件头包含检查点信息和DBWN进程写块到磁盘的信号的。
检查点信息包括检查点位置,SCN号,联机重做日志开始恢复的位置,等等。
CKPT不写入数据块到数据文件或不写入重做块到联机重做日志文件。
检查点是在数据库关闭,实例恢复,和Oracle数据库的一般操作时保证数据库一致性的一个重要的机制。
检查点术语拥有如下的相关的含义:
这是一个表示检查点位置的数据结构,也是从重做流必须开始实例恢复时位于重做流中的SCN号。
检查点的位置是由位于database buffer cache(数据库缓冲区)中最早的脏数据区(dirty buffer)。
检查点的位置作为重做流的指针,存储在控制文件和每个数据文件头中。
每隔3秒或更频繁写一次,写入控制文件,记录DBWN从SGA写入磁盘的块的位置。
(2)LGWR:Log Writer即日志写入进程,每3秒,1/3满buffer,commit,DBWN写之前。将buffer中数据写入物理文件。
(3)DBWN:database writer即数据库写入进程将SGA中脏块写入datafile。
3、Oracle 写入数据过程:
Oracle写数据过程:
DML 操作一执行,首先在redo buffer中记录语句,在buffer cache中执行更改,修改数据块。
然后LGWR进程根据上述规则,将redo buffer中的信息写入到Redo Log文件。此过程比较快(redo log为连续写)。
完成后,DBWN会将buffer cache中脏数据块对应的原始数据,复制到undo表空间,然后更新数据。(随机写,比较慢)。|
期间ckpt进程根据3秒的原则,作检查点,记录哪些脏数据库写到了data file中
(这里的检查点为增量检查点,并不是完全将脏数据写完,只是在控制文件中记录写到哪里了)。
将需要的信息记录在控制文件中。
若实例崩溃或需要错误恢复,从检查点位置以后的redo需要重新应用到datafile(常说的redo过程,前滚)。
此时根据事务是否提交了,未提交的事务,根据undo表空间的数据进行恢复(常说的undo,回滚操作)