oracle 体系结构初步认识(一)

刚开始学习oracle,记录一下自己的学习笔记,如有错误,还望各位大牛多多指教。

首先先上一张oracle体系结构中相对比较重要的图,如下wKiom1ZlZOGAw9XOAAK_Uw3mxg0089.jpg当我们输入一条简单的命令时候,例如第一次输入update table_name t set t.a=30;当我们执行这一条sql的时候,我们这一条sql现在share pool(共享池)中的Data Dictionary cache(数据字典缓冲区)中进行语义语法分析,语法解析就是分析sql语句是否有问题,语义解析就是分析是否存在语句中相对应的表以及列,分析完之后将在Library Cache(库高速缓存)产生相对应得执行计划,这一个操作记录也会缓存到Redo Log Buffer中,相对于更新的数据也会更新到Datebase Buffer Cache的脏块中,当我们点击commit的时候,将会触发LGWR,将日志缓冲区写到日志文件中,但是commit时并不会触发DBWn,不会把相对应更新的数据写到DBWn中,而这个时候数据库down了,Data Dictionary cache更新的数据也会丢失,这时候我们是通过Redo Log files通过SMON恢复Redo Log Buffer中缓存的操作记录,Date files以及Control files还原Database Buffer Cache的相关内容。下面稍微详细的介绍下后台几个进程相关的功能以及相对应的触发机制:

LGWR 日志写入进程( Log Writer)
LGWR
日志写入进程负责将重做日志缓冲区的日志条目写入磁盘上的联机重做日志文件。
当运行 DML或 DDL语句时, 服务器进程首先要将事务的变化记载到重做日志缓冲区, 然后才会写入数据高速缓冲
区, 并且重做日志缓冲区的内容将会被写入联机重做日志文件, 以避免系统出现意外带来的数据损失( 如果操作系统断
电, 内存中的重做日志缓冲区的内容会丢失, 而存在磁盘上的联机日志文件则不会丢失) , 这项任务由 LGWR 来完成。
重做日志缓冲区是一个循环结构, LGWR 将重做日志缓冲区中的重做记录写入联机重 做日志文件后, 相应的缓冲区内
容将被清空, 保证 Oracle 有空闲的重做日志缓冲区可以写入。
在出现以下情况时 LGWR 会开始工作:
●在 DWBR 进程将脏缓冲区写入数据文件之前。
//预写协议
●在重做日志记录达到缓冲区的三分之一。
●日志缓冲区记录的日志多于 1M
●每隔 秒钟。
//重做日志缓冲区是循环使用的, 要腾出足够的空间给新的记录使用
●提交事务( 执行 Commit) 。
//提交事务相当于确定保存修改, 不存入日志文件就有丢失的可能
官方文档中LGWR开始工作的情况:
■ A user commits a transaction (see "Committing Transactions"on page 10-10).
用户提交了事务
■ An online redo log switch occurs.
发生联机重做日志切换
■ Three seconds have passed since LGWR last wrote.
LGWR最后一次写入已经过了3/每隔3
■ The redo log buffer is one-third full or contains 1 MB of buffered data.
重做日志缓冲区达到1/3满或者已缓存了1MB的数据
■ DBWn must write modified buffers to disk.
DBWn必须将修改的缓冲区写到磁盘
Oracle 总是先记载数据变化到重做日志缓冲区, 然后才修改数据高速缓存。 与之类似, 在后台进程 DBWn将脏缓冲区
写入到数据文件之前, 首先要由后台进程 LGWR 将重做日志缓冲区写入到重做日志中。 与数据高速缓存相比, 重做日志
缓冲区相对要小得多, 但写入频率高的多, Oracle 必须要确保重做日志缓冲区总有足够的空间容纳新事务, 因此每隔 3
秒钟或重做日志缓冲区已有三分之一填满时 LGWR 会自动工作。
另外, Oracle 采用了快速提交机制, 当执行 COMMIT操作时, 并不是将“脏缓冲区”数 据写入到数据文件中, 而是将重
做日志缓冲区的内容写入到重做日志文件中, 以确保数据库完整性。 此时即使系统出现意外情况( 如掉电、 系统崩溃
等) , 因为被提交事务已经记载到了存放在磁盘上的联机重做日志文件中, 将来在重新启动数据库时系统会自动进行实
例恢复, 并将事务所修改数据写入到数据文件中, 从而避免了数据丢失。


DBWn数据库写入进程( Database Writer)
数据库写入进程负责将数据库高速缓冲区( 脏缓冲区) 的内容写入到数据文件。
尽管有一个数据库写进程(DBW0 ) 适用于大多数系统, 但数据库管理员可以配置额外的进程( DBW0-DBW9, 最多
10 个进程) , 以提高写入性能, 通过设置初始化参数DB_WRITER_PROCESSES 来完成。 如果你的系统修改数据严重,
这些额外的 DBWn进程在单处理器系统不是非常有用。
当数据库高速缓冲区的块被修改, 它被标记为脏缓冲区并添加到以 SCN( SystemChange Number, 系统更改号, 这里可
以看做“时间”) 为顺序的 LRUW( LRUWriter) 列表。
同时, 这个顺序与重做日志缓冲区的顺序一致。
在出现以下情况时 DBWn进程会开始工作:
●系统发出检查点指令。
//同步数据, 详见检查点进程( CKPT) 。
●脏缓冲区个数达到指定阈值。
●服务进程搜索一定数目的数据块后, 不能找到自由缓冲区。
●数据写入计时时间到。
//客户端执行 SELECT\INSERT\UPDATE\DELETE语句时, 都需要访问数据库高速缓冲区。 如果是第一次访问, 必须
要将数据由数据文件读取到数据库高速缓冲区, 所以 Oracle 必须要确保数据高速缓存总是存在足够的“自由缓冲区”以容
纳新数据。 当 DBWn进程将脏缓冲区的数据块写入到数据文件后, Oracle 将把“脏缓冲区”标记为“自由缓冲区”。 因此, 为
了保证有足够“自由缓冲区”来存放新的数据块, 需要 DBWn进程工作。
●表空间脱机或进入只读状态。
●执行删除或截断表操作。
●执行 ALTER TABLESPACE … BEGIN BACKUP命令 alter systemflush buffer_cache/checkpoint
//需要同步数据, 原理同检查点。


CKPT检查点进程( Checkpoint)
CKPT检查点进程的作用是执行一个检查点, 同步数据库的所有数据文件、 控制文件和重做日志文件。 当执行检
查点时, 系统促使 DBWn将数据缓冲区中数据的变化写入数据文件, 同时完成对数据文件和控制文件的更新, 记录下当
前数据库的结构和状态。 在执行一个检查点之后, 数据库处于一个完整状态。 在数据库发生崩溃后, 可以将数据库恢复
到上一个检查点。
Oracle 数据库在执行涉及数据变化的语句时, 会针对任何修改生成一个顺序递增 SCN( SystemChange Number) 值, 并
且会将 SCN 值连同事务的变化一起记载到重做日志缓冲区。 在数据文件、 控制文件头部以及重做日志文件中都记载有该
值。 Oracle 通过比较各种文件的 SCN 值, 确定文件是否损坏、 系统是否异常, 最终确定系统是需要进行实例恢复还是介
质恢复。 在发出检查点时, 数据文件、 控制文件和重做日志的 SCN 值完全一致。
进程 CKPT在以下情况下会开始工作:
●发生日志切换。
●关闭实例(SHUTDOWN ABORT除外)
●手工执行检查点操作。
●由初始化参数 LOG_CHECKPOINT_INTERVALLOG_CHECKPOINT_TIMEOUT强制发出。


SMON 系统监控进程( SystemMonitor)
SMON 系统监控进程主要作用是强制对数据库进行恢复操作。 在实例启动时, 如果上一次数据库是非正常关闭, 并且重
做日志文件和控制文件的 SCN 值是不同的, Oracle 将自动在重新打开数据库之前, 通过执行重做日志文件的记录, 来同
步所有数据文件、 控制文件和重做日志文件, 确保所有数据库文件的一致性, 然后才打开数据库。
如果检查点进程一例中, 第四步完成后发生系统掉电、 崩溃, 那么数据会不会丢失呢?
当然不会。 我们知道, 系统掉电, 导致内存中的数据( 数据库高速缓冲区) 的数据丢失。 那么自然上例中的第五步无法
完成( 无法从数据库高速缓冲区写入数据文件) , 但是由于此时已写入联机日志文件。 因此, 此时数据将从联机日志文
件中更新, 而更新的数据量是多少, 自然就是由 SCN 决定。 这一过程我们成为“实例恢复”。 该过程不需要数据库管理员
手工干预, 由 SMON 进程自动完成。
该进程还负责在启动实例时清理临时段和合并区( Extent) 碎片等工作。 所以 SMON进程的工作归纳如下:
● 进行实例恢复
● 合并数据文件的自由空间
● 释放数据文件的临时段


PMON 进程监控进程( Process Monitor)
PMON 进程监控进程负责对失败的用户进程或服务进程进行恢复。 当用户进程连接到Oracle 服务器时, Oracle 将在服务器
端分配相应的服务进程。 这时由 PMON 进程来监视用户进程的执行情况。 当由于种种原因, 用户对 Oracle 数据库的连
接, 发生崩溃、 挂起或异常终止现象时, 该进程负责清除服务进程所占用的资源, 回滚没有完成的事务。
当 PMON 检测到用户进程失败时, 进行的工作归纳如下:
● 回滚当前用户的事务
● 释放当前用户加的表或行级锁
● 释放用户的其他资源
● 重新启动死掉的调度进程
假定我们在客户端运行 SQL*Plus 并通过网络访问 Oracle 服务器, 那么 Oracle 将在服务器端分配相应的服务进程。 假如用
户异常终止 SQL*Plus, 或出现网络断开或客户端死机的情况, PMON 就必须检测到这种情况, 并释放掉服务进程所占用
的资源。


spacer.gif

你可能感兴趣的:(oracle)