当前位置: 代码迷 >> Oracle认证考试 >> 请问关于oracle数据库缓冲的有关问题
  详细解决方案

请问关于oracle数据库缓冲的有关问题

热度:6199   发布时间:2013-02-26 00:00:00.0
请教关于oracle数据库缓冲的问题。
在oracle中,sga主要包括共享池、数据库高速缓存区、日志缓冲区3部分。数据库高速缓存区尽可能少了进行磁盘的读写操作,因为磁盘的i/o会使性能急剧下降;而日志缓冲区则相反,它是尽可能的记录数据的变化并尽可能频繁的写入联机重做日志文件中。那么,日志缓冲区这样做(指尽可能频繁的进行日志的读写)就不降低效率了吗? 我想说应该降低了数据库的效率了吧?那为什么还是这么做呢?就是为了联机重做日志文件中在文件恢复中很重要?

------解决方案--------------------------------------------------------
参考关于日志缓冲写I/O重要性能问题:

1.缓冲日志I/O会经历局部块写。因为重做写随机的日志块号并且日志块相对于文件系统缓冲较小。通常重做写的最后一个日志块不会分配到文件系统缓冲结尾。因此,除非日志文件旧映像所在的目标文件块仍在缓存中,否则在重做拷贝到其文件系统缓冲的另一部分前必须将那个块从磁盘读取到内存。从日志文件预读主要用于缓冲重做写。 

如果磁盘阵列有很大的缓存并且在日志文件上具有高效的预推进算法,那么预读花费的时间可能非常小,并且不会推迟重做写。但是如果预读和重做写要求物理磁盘服务,则肯定会有额外的延迟,并且等于磁盘全旋转的延迟。 

2.缓冲日志I/O也会经历I/O碎片。当重做写到多个文件系统缓冲时,每个缓冲的物理写无法排队为并行的,因此不能被硬件流水线操作。相反,组件物理写串行执行,并且在每对写之间维持一个完全的旋转延迟。 

这些问题都可以通过使用文件系统直接I/O或者使用裸日志文件解决。裸I/O通常比直接I/O更好,因为其允许更有效的使用异步I/O。 


LGWR需要异步I/O并行化写多个日志文件成员以及在事务提交时迭代重做写。可以使用硬件镜像重做日志以避免串行写到多个日志文件成员,并且可以使用硬件镜像最小化重做写的CPU代价。但是异步I/O需要迭代随后的重做写,因为LGWR I/O slaves不会一致的做该工作。裸I/O使得异步I/O有可能实现,而其他的需要LGWR依赖线程异步I/O或LGWR I/O slaves。 

注:部分块写,I/O碎片和同步I/O写都会严重影响LGWR's I/O的性能及可扩展性。

------解决方案--------------------------------------------------------
安全是肯定是要保证的,很重要的
日志缓冲区应该只是保存变化过的数据块吧,它写入日志文件也是有一个机制,所以不会像你说的那样频繁进行日志的读写吧
当下列情况发生时,LGWR会将缓冲区的数据写入日志文件:
1、在COMMIT的时候
2、重做日志缓冲区1/3满的时候
3、重做日志缓冲区大于1M的时候
4、它写信息必须是在数据写进程前调用
5、一般CHECKPOINT在日志组切换的时候进行或者由初始化参数设定
在CHECKPOINT的时候需要调用数据写进程
  相关解决方案