当前位置:文档之家› oracle性能调优-管理oracle日志之Oracle日志运行机制

oracle性能调优-管理oracle日志之Oracle日志运行机制

理解Oracle的日志机制
• Oracle的日志是用来记录用户对数据库的改变,这样,当出现服务器硬件故障或者用户错误而丢失数据时,可以通过重做这些日志来恢复已提交的事务,Oracle日志机制包含以下组件:
Ø日志缓存SGA的一部分,用于缓存服务器进程产生的日志,包括DML和DDL;
Ø LGWR进程这个后台进程负责将日志缓存的数据写到联机日志文件,每个实例只有一个;
Ø数据库检查点检查点用于同步数据文件和日志文件,一个检查点事件的完成,代表在这个事件开始之前发生的所有对数据文件的改变都已实际记录到了数据文件,数据库在这个时间点是一致的,在实例恢复的时候,只有在最后一个检查点之后的日志才需要重做;
Ø联机日志文件用于存放从日志缓存中写出的日志数据,每个数据库最少需要两个日志文件,当前日志文件填满以后,发生日志切换,然后才可以继续写下一个日志文件;
Ø日志归档LGWR写满所有组的联机日志文件以后,会回头再写第一个组的日志文件,在非归档模式下,被重用的日志文件中的日志会被丢弃,在归档模式下,日志文件被重用前会被ARC0进程复制到归档日志文件;
• 一些可选的日志机制,如归档和Standby,因为附加的I/O会降低系统的性能,同时提供了可靠的灾难恢复能力,不建议因这些性能的下降而关闭生产系统的归档功能。

调整日志缓存
• 日志缓存的管理机制可以类似理解成一个漏斗,日志数据不断地从漏斗上方加入,然后偶尔打开漏斗下方的开关将加入的数据清空,这个开关就是LGWR进程,为了日志缓存有空间容纳不断加进来的日志数据,LGWR在下面列出的任何一个条件下都会执行写出日志缓存的操作:
Ø应用程序发出Commit命令时;
Ø三秒间隔已到时;
Ø日志缓存三分之一满时;
Ø日志缓存达到1M时;
Ø数据库检查点发生时;
• 测量日志缓存的性能通过服务器进程放置日志条到日志缓存时发生等待的次数和时间来测量;
Select Name, Value
From V$sysstat
Where Name In ('redo entries', 'redo buffer allocation retries','redo log space requests');
redo entries 服务器进程放进日志缓存的日志条的总数量;
redo buffer allocation retries 服务器放置日志条时必须等待然后再重试的次数;
redo log space requests LGWR进程写出日志缓存时等待日志切换的次数;
这个查询用于计算日志缓存重试率,这个比率应该小于百分之一;
Select Retries.Value / Entries.Value "Redo log Buffer Retry Ratio"
From V$sysstat Entries, V$sysstat Retries
Where = 'redo entries' And = 'redo buffer allocation retries';
这个查询用来显示哪些会话的LGWR正在进行写等待;
Select ername, Sw.Wait_Time, Sw.Seconds_In_Wait, Sw.State
From V$session_Wait Sw, V$session s
Where Sw.Sid = s.Sid And Sw.Event Like '%log buffer space%';
State有四个取值:
WAITING(会话正在等待),WAITED UNKNOWN TIME(等待时间未知),WAITED SHORT TIME(等待时间小于百分之一秒),WAITED KNOWN TIME(等待时间已知,为wait_time栏位所示的时间);
Ø Statspack中有两个地方存有与日志缓存性能相关的数据:
实例命中率(Instance Efficiency Percentages)中的Redo NoWait%,这个值与日志缓存重试率之和等于1;
实例活动统计(Instance Activity Stats)中的redo entries, redo buffer allocation retries, redo log space requests;
• 改进日志缓存的性能
改进日志缓存的性能就是减少或者消除服务器进程读取日志缓存及放置日志条到日志缓存时发生的等待,可以从下面两个方面入手:
Ø增大日志缓存
ü 日志缓存由初始参数LOG_BUFFER指定,最小值是64K,默认值是greatest(512k , 128k * CPU数); ü 当你指定的日志缓存小于最小值时,会以默认值来生效;
ü 日志缓存的最大值由操作系统来指定,考虑到LGWR写出日志缓存的特点,大于3M的日志缓存已没有多大实际意义;
Ø减少日志的产生:UNRECOVERABLE,NOLOGGING
ü UNRECOVERABLE 这个关键字用在下面的语法中:create table table_a as select * from table_b unrecoverable; 在表创建的过程可以尽可能少地产生日志,但对该表的后续DML操作没有影响,也不能用于分区表,索引组织表,含有大对象的表的创建,这个关键字的功能已被nologging取代;
ü NOLOGGING是表的一个属性,可以在表创建时指定,也可以在表创建以后用alter命令进行更改,这个属性可以从许多字典表(DBA_TABLESPACES,DBA_TABLES,DBA_INDEXES,DBA_LOBS等)的logging 字段查到;
ü 启用该属性,可以在表创建,表上的索引创建及重建时产生较少的日志(DDL);
ü 启用该属性,针对表上的数据插入,在以下两种情形下可以产生较少的日志(DML):用SQL*Loader 进行Direct Path Loads ,用append提示进行的Direct Load Inserts;
ü 启用该属性后,用direct path方法装入的数据将会在媒体恢复的过程中丢失,如果这些数据装载发生在最近一次备份操作之后的话。

相关主题