注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

金生丽水,雨润轩德

 
 
 

日志

 
 

log file sync 和 log file parallel write  

2011-06-08 12:02:34|  分类: 数据库优化 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://hi.baidu.com/abp0109/blog/item/bfa34ced3c4d6c00fdfa3cb2.html

dbsnak在微博里这样描述等待事件log file sync和log file parallel write的关系:

前台进程a通知LGWR要刷log buffer了,这时候a就开始等待log file sync,LGWR接到a的请求后开始等待OS把log buffer写回redo log,这时候LGWR就开始等待log file parallel write,OS写完了通知LGWR,中止log file parallel write等待,接着LGWR通知a,中止log file sync等待  --- 这就是上述两种等待的区别。

有上面这个形象的例子,可以明白等待事件log file sync和log file parallel write是同时存在的,均是等待LGWR进程将log buffer中的redo entries写入online redo log的完成。

当一个前台进程(或用户会话)进行提交(commit)或回滚(rollback)时,这个会话的redo信息就需要被刷入redo log file中。且该回话会通知LGWR将所有需要的redo entries写入redo log file。当LGWR写入完成后,又会返回用户会话一个确认信息,以表明redo entries已全部安全的写入到了磁盘。

log file sync的参数有:

P1 = buffer#

在log buffer中,所有变更到这个缓冲号的重做条目都必须被刷新到磁盘,且保证所有已提交的事务被确认写入,即使发生instance crash,也不会影响到已提交的事务,因此log file sync等待事件就是等待直到缓冲号为buffer#的redo entries均被写入到了磁盘。

P2 = Not used

P2 = Not used

通常发生log file sync等待事件是由于LGWR写入缓慢或者应用程序的提交操作过于频繁。可以通过如下措施帮助减少log file sync等待:

1、将online redo log file放在最快的磁盘上,例如该磁盘不允许配置RAID 5,因为RAID 5对于频繁写入操作性能较差。

2、采用批量提交的方式。

3、在Oracle 10gR2中,commit命令增加了WRITE子句来控制在commit操作期间,redo写入redo log file的方式和程度。WRITE子句的作用只是为了提高性能,安全方面会被降低,因为可能会造成提交的事务却没被写入redo log file而丢失数据。
Oracle文档中是这样描述commit语句的write子句的:
COMMIT;
COMMIT WRITE WAIT; --> The commit command is synchronous. It doesn't return until the relevant redo information is written to the online redo log.
COMMIT WRITE NOWAIT; --> The commit command is asynchronous. It can return before the relevant redo information is written to the online redo log.
COMMIT WRITE BATCH; --> The commit command is synchronous. It doesn't return until the relevant redo information is written to the online redo log.
COMMIT WRITE IMMEDIATE; --> The commit "prods" the LGWR process by sending a message, so that the redo is written immediately to the redo logs.

上面这种方式是要通过修改程序代码实现的,如果想避免修改程序代码,也可以在session级别或system级别通过参数COMMIT_WRITE实现,如:

SQL> alter [system | session] set COMMIT_WRITE=’IMMEDIATE,NOWAIT’;

也可以通过触发器来监视当某用户的应用程序运行时进行COMMIT_WRITE参数的设置:

SQL> CREATE OR REPLACE TRIGGER sys.global_commit_session_settings ALTER LOGON ON <your application_username>.SCHEMA
BEGIN
execute immediate ‘alter session set COMMIT_WRITE=”IMMEDIATE,NOWAIT”’
END;
/

需要注意的是:如果使用了此选项,一旦数据库实例失败(CRASH),尽管是已被提交的事务,也会丢失没有被写入到redo log file中的数据,请慎用。

4、使用NOLOGGING或UNRECOVERABLE选项。

  评论这张
 
阅读(1590)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018