log file sync(日志文件同步)等待事件具有一个参数:buffer#。在Oracle Database 10g中,
这种等待事件位于Commit等待下面。当处理log file sync等待事件时,注意下面的思想:
◎ log file sync 等待时间和事务中指(提交或回滚)相关
◎ 当进程在log file sync事件上花费大量时间时,这通常表明过多的提交或短事务。
常见的原因、诊断和动作
Oracle 在SGA中的日志缓冲区中记录事务和块的改变,这是成为生理日志(physiological
logging)的方法。通过以各种时间进度将内容写入到日志文件,LGWR进程负责在日志缓冲区
中留出空间,这些时间进度包括:
◎ 每隔3秒;
◎ 当日志缓冲区的1/3已满或具有1MB的重做条目时;
◎ 当用户提交或回滚事务时;
◎ 当DBWR进程发出信号时(在记录之前写入)。
由用户提交和回滚初始化的写入称为同步写入;其余的写入成为后台写入。log file sync
等待只和同步写入有关。换句话说,用户进程可能正在爱处理一个大型的事务并生成许多触发
LGWR以执行后台写入的大量重做条目,但用户会话从来不需要等待后台写入的完成。然而,一
旦用户会话提交或回滚它的事务且_WAIT_FOR_SYNC参数是TRUE时,进程提交LGWR并在
log file sync事件上等待LGWR将当前重做条目(包括提交标记)刷新到日志文件。在这种日志同
步期间,LGWR进程在log file parallel write事件上等待同步写入的完成,同时用户会话在
log file sync事件上等待同步进程的完成。
一旦进程进入log file sync等待,就有两种可能性。一种可能性是LGWR在日志同步完成时
提交前台进程时。另一种情况是在等待已超时的时候(一般在1秒内),在这个时刻,前台进程检
查当前日志SCN(System Change Number,系统改变号),确定它的提交是否已经传递到磁盘。如
果是的话,进程继续处理,否则进程就重新进入等待。
注意:
你必须绝对不将参数_WAIT_FOR_SYNC设置为FALSE,即使是在一个开发数据库或测试数据库
中,因为不能保证提交的事务在实例失败时可以恢复。人们使用这种特性来避开基准测试。
一般情况下,log file sync等待是非常频繁的时间。它非常简短,终端用户一般不会注意
到它。然而,许多这样的事件可能产生较长的响应时间并在v$system_event和v$session_wait
视图中获得显著的等待统计。使用下面的查询来找到当前的会话,这些会话从登陆开始就花费
大量的处理时间在log file sync事件上等待。使用user_commits和house_connected估算
time_waited。为了发现两个指定的时间点之间谁执行了大量的提交,可以使用第2章“如何使
用v$system_event视图”中的示例计算增量。
◆ 查询SQL见Oracle Wait Interface.chm〖输入log file sync搜索〗
SELECT a.Sid,
a.Event,
a.Time_Waited,
a.Time_Waited / c.Sum_Time_Waited * 100 Pct_Wait_Time,
d.VALUE User_Commits,
Round((SYSDATE - b.Logon_Time) * 24) Hours_Connected
FROM V$session_Event a,
V$session b,
V$sesstat d,
(SELECT Sid,
SUM(Time_Waited) Sum_Time_Waited
FROM V$session_Event
WHERE Event NOT IN
('Null event', 'client message',
'KXFX: Execution Message Dequeue - Slave',
'PX Deq: Execution Msg', 'KXFQ: kxfqdeq - normal deqeue',
'PX Deq: Table Q Normal', 'Wait for credit - send blocked',
'PX Deq Credit: send blkd',
'Wait for credit - need buffer to send',
'PX Deq Credit: need buffer', 'Wait for credit - free buffer',
'PX Deq Credit: free buffer', 'parallel query dequeue wait',
'PX Deque wait', 'Parallel Query Idle Wait - Slaves',
'PX Idle Wait', 'slave wait', 'dispatcher timer',
'virtual circuit status', 'pipe get', 'rdbms ipc message',
'rdbms ipc reply', 'pmon timer', 'smon timer',
'PL/SQL lock timer', 'SQL*Net message from client',
'WMON goes to sleep')
GROUP BY Sid
HAVING SUM(Time_Waited) > 0) c
WHERE a.Sid = b.Sid
AND a.Sid = c.Sid
AND a.Sid = d.Sid
AND d.Statistic# =
(SELECT Statistic# FROM V$statname WHERE NAME = 'user commits')
AND a.Time_Waited > 10000
AND a.Event = 'log file sync'
ORDER BY Pct_Wait_Time,
Hours_Connected;
下面的部分讨论了高log file sync等待事件的3个主要原因。
①.高提交频率
解决方法是简单的消除不必要的提交,事务是工作单元。工作单元应该是全部成功或
全部失败。
②.缓慢的I/O子系统
较高的IO吞吐良可以改善log file sync和log file parallel write事件的平均等待
时间。频繁的提交会弄乱数据库布局和IO子系统。解决办法是将日志文件放裸设备上或绑
定在RAID 0或RAID 0+1中,而不是绑定在RAID 5中。
③.过大的日志缓冲区
过大的日志缓冲区也可能延长log file sync等待。大型的日志缓冲区减少后台写入的
数量,允许LGWR变得懒惰,并导致更多的重做条目堆积在日志缓冲区中。同时可以调整参数
_LOG_IO_SIZE参数,其默认值是LOG_BUFFER的1/3或1MB,取两者之中较小的值。换句话说,
你可以具有较大的日志缓冲区,但较小的_LOG_IO_SIZE将增加后台写入,从而减少log file
sync的等待时间。