Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1618367
  • 博文数量: 292
  • 博客积分: 10791
  • 博客等级: 上将
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-20 21:06
文章分类

全部博文(292)

文章存档

2011年(31)

2010年(261)

分类: Oracle

2010-07-05 17:43:09


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的等待时间。

阅读(4176) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~