• 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 Entries.Name = 'redo entries'
And Retries.Name = 'redo buffer allocation retries'
这个查询用于计算日志缓存重试率,这个比率应该小于百分之一;
Ø Select s.Username, 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%';
这个查询用来显示哪些会话的LGWR正在进行写等待;
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;
• 改进日志缓存的性能
改进日志缓存的性能就是减少或者消除服务器进程读取日志缓存及放置日志条到日志缓存时发生的等待,可以从下面两个方面入手:
Ø 增大日志缓存