Oracle中如何设置log buffer

对于日志缓冲区来说,设置过小,容易引起log buffer space等待事件。但也不是说设置得越大就越好的,设置过大,由于LGWR进程会不断启动刷新日志缓冲区从而释放内存,所以可能会根本用不上多余的内存,从而浪费内存。

设置合适的日志缓冲区大小,目的是为了能够让LGWR进程合理地触发。理想情况下是,一方面,在LGWR进程向联机日志文件中写重做记录时,日志缓冲区中还是有剩余的可用空间以供其他进程所使用;另一方面,当LGWR进程完成时,日志缓冲区中的剩余可用空间不要很多,因为这时由LGWR所写入日志文件的日志块就可以释放出来了,成为新的剩余可用空间。然后,LGWR可以再次启动刷新脏的日志块。如此良性循环,就能在满足性能的前提下,充分利用日志缓冲区。没必要盲目地把日志缓冲区设置得很大,完全可以把节省下来的内存交给比如数据块缓冲区(buffer cache)等这样更需要内存的组件。

我们已经知道,当重做记录达到日志缓冲区的1/3或1MB时,就会触发LGWR进程。也就是说,Oracle默认认为LGWR进程在写日志缓冲区大小的1/3或1MB的重做记录的过程中,剩下的日志缓冲区可以供新的重做记录的需要。当LGWR写完以后,那么这1/3或1MB的日志缓冲区就又可以成为可用的日志块以容纳新的重做记录了。由此,我们可以很容易推导出,当我们设置日志缓冲区达到3MB(3×1MB)以上时,这时多余出来的日志缓冲区实际上并不能用得上,换句话说,多余出来的内存就被我们浪费了。

在设置日志缓冲区时,可以参考下面这个建议的公式来计算:1.5×(平均每个事务所产生的重做记录大小×每秒提交的事务数量)。

首先先找到总事务量是多少:

select a.value as trancount from v$sysstat a,v$statname b

where a.statistic# = b.statistic# and b.name = 'user commits';

然后,找到系统总共的运行时间:

select trunc(sysdate - startup_time)*24*60*60 as

seconds from v$instance;

第三,找到产生的所有重做记录大小:

select value as redoblocks from v$sysstat where name =

'redo blocks written';

最后,我们可以分别计算公式中的值:平均每个事务所产生的重做记录大小= redoblocks/trancount;每秒提交的事务数量=trancount/seconds。这样,最后所建议的日志缓冲区的大小可以写为:1.5×(redoblocks/trancount)×(trancount/seconds)。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2024-11-01 02:07:29

Oracle中如何设置log buffer的相关文章

oracle中如何设置自增主键

 首先,你要有一张表! CREATE TABLE example( ID Number(4) NOT NULL PRIMARY KEY, NAME VARCHAR(25), PHONE VARCHAR(10), ADDRESS VARCHAR(50)); 如果对于以上的建表语句还有疑问的话,建议您不要继续了!有那么些时间您还不如去看看金庸读读琼瑶! 然后,你需要一个自定义的sequence CREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次加几个

oracle中如何设置buffer cache

buffer cache的设置随着Oracle版本的升级而不断变化.Oracle 8i下使用db_block_buffers来设置,该参数表示buffer cache中所能够包含的内存数据块的个数:Oracle 9i以后使用db_cache_size来设置,该参数表示buffer cache的总共的容量,可以用字节.KB.MB为单位来进行设置.而到了Oracle 10g以后则更加简单,甚至可以不用去单独设置buffer cache的大小.因为Oracle 10g引入了ASMM(Automatic

Oracle中如何设置shared pool

对于设置shared pool的大小来说,没有一个通用的.普遍适用的值,不同的系统负载需要不同大小的shared pool来管理.通常我们在设置shared pool时,应该遵循"不要太大.也不要太小"的原则,设置一个初始的值,然后让系统正常运行一段时间,在这段时间里,对shared pool的使用情况进行观察监控,最后根据系统的负载得出一个在当前负载下比较合理的值.注意,这里只是说明是在当前负载下,如果随着系统的不断升级,导致负载发生一个比较大的变化,这时又需要对shared poo

Oracle中如何设置EXCLUDE后STANDBY数据库只读表空间的恢复

在STANDBY数据库利用RMAN恢复主库上EXCLUDE的只读表空间,碰到了问题. 数据库恢复完成,但是恢复被主库EXCLUDE的只读表空间时,发现无法进行恢复: RMAN> restore tablespace clubstat2_bak; Starting restore at 14-FEB-11 allocated channel: ORA_DISK_1 channel ORA_DISK_1: sid=1094 devtype=DISK file 22 is excluded from

redo log buffer小结

整理自<OCA/OCP认证考试指南> 001     日志重做缓冲区是小型的.用于短期存储将写入到磁盘上的重做日志的变更向量的临时区域."变更向量"是应用于某些对象的修改,执行DML语句会生成应用于数据的变更向量.有了重做日志,数据库就可以确保数据永不丢失:每当数据块发生更改时,都会将应用于块的变更向量写到重做日志,如果需要还原数据文件,则通过重做日志,可以将变更向量提取并应用于数据文件备份. 002     会话服务器进程不将重做记录直接写入重做日志文件,否则,每当执行D

在Oracle中利用REDO实现故障恢复

在数据库中,Redo的功能主要通过3个组件来实现:Redo Log Buffer.LGWR后台进程和Redo Log File (在归档模式下,Redo Log File最终会写出为归档日志文件). 在Oracle的SGA中,存在一块共享内存,称为Redo Log Buffer,如图1所示. 图1 Oracle Instance Redo Log Buffer位于SGA之中,是一块循环使用的内存区域,其中保存数据库变更的相关信息.这些 信息以重做条目(Redo Entries)形式存储(Redo

Oracle Log Buffer详解

数据库在运行过程中,不可避免地要遇到各种能够导致数据库损坏的情况.比如突然断电.Oracle或者操作系统的程序bug导致数据库内部逻辑结构损坏.磁盘介质损坏等,都有可能造成数据库崩溃,从而导致数据丢失的现象发生. 为了避免,或者说为了修复这些状况所导致的数据丢失现象,Oracle引入了日志缓冲区和日志文件的概念.所谓日志,就是将数据库中所有改变数据块的操作,都原原本本地记录下来.这些改变数据块的操作不仅包括对数据表的DML命令或者引起数据字典内容变化的DDL命令,还包括对索引的改变.对回滚段数据

log buffer 中的组提交

 [本文根据itpub的帖子整理]    数据库中同时存在许多事务,LGWR进程在写入重做日志文件时可以采取"组提交"的方式.         一个用户提交事务时,LGWR进程开始将该进程的重做记录写入硬盘.如果在写入的过程中有其他多个用户也执行COMMIT语句提交事务,这时LGWR进程不能立即将这些事务的重做记录写入硬盘,而必须等待当前的写操作完成.当第一个事务的重做记录都被写入到硬盘中后,LGWR进程将被重做日志缓存中的数据一次性全部写入重做日志文件.        这两个comm

c# 从oracle中查询数据,设置时间参数问题,在线等

问题描述 c# 从oracle中查询数据,设置时间参数问题,在线等 各位大神,小弟刚接触c#时间不长,写了个程序,从界面上datatimepicker中取出时间,然后在c#代码的sql语句中设置时间参数,无论怎么设置要不就查不到数据,要不就是时间格式设置的不对,下面是代码 public DataTable QueryUsedMaterial(string classgroup, string beginTime, string endTime) { string sql_QueryMateria