- 浏览: 1084742 次
- 性别:
- 来自: 南京
博客专栏
-
Oracle管理和开发
浏览量:348970
最新评论
-
Simon.Ezer:
请问对于“如果非主键字段值发生改变,则不会同步过去”这种情况, ...
创建增量同步Oracle物化视图问题 -
dahai639:
挺好的,支持一下
Oracle的pipelined函数实现高性能大数据处理 -
zealotpz:
不错,原来是用户oracle 的所属组的问题
以sysdba身份登录oracle报ORA-1031权限不足错误之完美分析 -
mikixiyou:
zhangyuslam 写道如果担心全局索引失效,可以使用如下 ...
Oracle分区表的分区交互技术实现数据快速转移 -
sea0108:
...
Oracle sql loader使用速成
数据库在某些时间点突然出现性能峰值,使得前端应用程序有停滞感。分析出为log file sync 事件突然发生导致了该问题。
该事件是表示用户在LWGR 进程将redo 日志信息写入的redo logfile 。在普通的数据库配置中,能优化这个问题的方法只能减低日志写入量,提升日志写入速度,就是将redo logfile 放到更快的磁盘组上。
我们这里的数据库环境是LGWR 既要将REDO 日志信息写入到REDO 日志文件中,也要通过网络写入到远程的STANDBY 数据库中。
我们的问题出现在写入到standby 时发生了堵塞,导致了log file sync 等待事件的大量发生,从而使得数据库性能峰值频繁出现,有时候都影响到应用。
因此我们将LGWR 写入到standby 的操作方式从lgwr sync affirm 修改为lgwr async 方式,就是从实时同步修改为非实时同步。
这样就解决了这个性能问题。
1. 问题
环境交代一下,数据库版本10.2.0.4 ,ASM 存储,单实例,归档模式,多路径用于异地的data guard 逻辑备库和物理备库,最大可用模式。
在Oracle EM GRID CONTROL 管理平台中,看到数据库性能页面上平均活动会话瞬间提升到数倍,如正常时一直是2-3 个,到某个时间点到达18-19 个之多。
突然增加的等待事件归类为configuration 和concurrency 。在configuration 类中,等待事件为log file sync 。
这个等待事件的发生导致很多会话出现堵塞,反映到应用端就是应用停滞。
我们再到awrrpt 报告中,也能看到top 5 等待事件以log file sync 居首。
Top 5 Timed Events
Event |
Waits |
Time(s) |
Avg Wait(ms) |
% Total Call Time |
Wait Class |
log file sync |
256,569 |
66,039 |
257 |
86.4 |
Commit |
CPU time |
|
4,308 |
|
5.6 |
|
enq: TX - row lock contention |
4,894 |
4,140 |
846 |
5.4 |
Application |
log file switch completion |
1,817 |
1,485 |
817 |
1.9 |
Configuration |
LNS wait on SENDREQ |
350,286 |
464 |
1 |
.6 |
Network |
这个更具体,以数字形式直接展现出来,等待事件log file sync 的问题何其严重。
统计时间30 分钟,等待事件log file sync 使用66039 秒,整个86.4% 的时间都是log file sync 消耗的。
性能问题很明显,在log file sync 等待事件上。解决掉它,就能解决这个应用摇摆问题。
2. 分析
等待事件log file sync 是这样产生的。
当一个用户提交(commits) 或者回滚(rollback), 会话的redo 信息需要写出到redo logfile 中。用户进程将通知LGWR 执行写出操作,LGWR 完成任务以后会通知用户进程。等待事件log file sync 就是指用户进程等待LGWR 的写完成通知。
但是,这只是正常的配置下的生成过程。在我们的环境中,LGWR 还需要将redo 信息写入到网络上其他的数据库服务器中。
这是因为这台服务器配置了两台standby database 服务器:一台用于查询库实时同步数据;一台用于数据灾备镜像库,也是要实时同步。
因为实时同步需要,所以写redo 信息的参数项是lgwr sync 。具体参数配置如下所示:
*.log_archive_dest_2='service=mikidb_reader lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=mikidg'
*.log_archive_dest_3='service=mikidb_standby2 lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=mikidg2'
所以,问题在LGWR 写redo 信息到磁盘上还是网络上发生了堵塞导致了性能峰值,需要我们去判断一下。
如果是发生在写入磁盘上导致了性能峰值问题,那我们也没办法了。更快的磁盘真的没有了。
如果是发生在网络上,我们需要检查网络状况。
但这里还有一种可能,就是redo 信息的量在那个时间点真的突然增大了。这种情况也是有可能导致这种性能峰值问题。
但这个可能很快被否决掉,在awrrpt 中load profile 项看到, 每秒生成的redo 日志并没有多大变化,一直维持在200KB 略多点。
3. 解决
问题分析到这里,解决方法其实很简单了。
检查网络情况,在网络情况不确定之前,我们可以先将这两个写入standby 的操作关闭掉。
这个有点武断,哈哈。
在10.2 中,LGWR 写入redo 信息到standby 数据库中有两个方式:一种是lgwr sync ,另一种lgwr async 。
前者是保证数据必须同步过去,LNS 进程传redo 信息到standby 数据库时必须给回复,不给则不显示提交成功。
这点可以参考一下eygle 的文档中描述, http://www.eygle.com/archives/2004/10/statspack14-logfilesync.html
后者是先保证写入到本地redo logfile 中,剩下的交给LNS 进程,它接着做下面的事情。这样LNS 能否能redo 信息及时写入到standby 数据库就只有看天意了。
第二种方法虽然不好,但还是比没有强。因此,我们选择它先来解决这个问题。
数据库初始化参数设置如下所示:
*.log_archive_dest_2='service=mikidb_reader lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=mikidg'
*.log_archive_dest_3='service=mikidb_standby2 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=mikidg2'
如果网络检查有问题,那么修复后我们可以再改回为lgwr sync ,不行再改回lgwr async 。
4. 总结
我们将参数修改后观察了一下,发现活动会话很稳定,等待事件也都是CPU 处理事件。
在awrrpt 中,可以看到具体的数字。
Top 5 Timed Events
Event |
Waits |
Time(s) |
Avg Wait(ms) |
% Total Call Time |
Wait Class |
CPU time |
|
4,192 |
|
98.0 |
|
log file sync |
153,941 |
23 |
0 |
.5 |
Commit |
LNS wait on SENDREQ |
289 |
14 |
48 |
.3 |
Network |
enq: TX - row lock contention |
1,031 |
11 |
11 |
.3 |
Application |
log file parallel write |
157,352 |
9 |
0 |
.2 |
System I/O |
我们对比一下。
这是修改之前的等待事件log file sync 统计信息:
Event |
Waits |
Time(s) |
Avg Wait(ms) |
% Total Call Time |
Wait Class |
log file sync |
256,569 |
66,039 |
257 |
86.4 |
Commit |
这是修改之后的等待事件log file sync 统计信息:
Event |
Waits |
Time(s) |
Avg Wait(ms) |
% Total Call Time |
Wait Class |
log file sync |
153,941 |
23 |
0 |
.5 |
Commit |
等待次数下降的不大,等待时间下降了3000 倍啊。
因此,在碰到这台硬的等待事件时,不能光看一些官文中描述,还要结合环境具体看待。
但它也有局限,主数据库的数据不会真的实时同步到standby 数据库里了。数据的安全有一些损失,但在性能、可用性、数据安全方面,是必须有取舍的。
发表评论
-
Oracle分区表的分区交互技术实现数据快速转移
2013-01-22 11:48 14647有一个需求,将某业务表的某个时间点之前的记录转移到它的历史 ... -
等待事件enq TX row lock contention分析
2013-01-17 17:16 33193在Oracle数据库性能报告AWRRPT分析时,发现top ... -
Oracle的UNDO表空间管理总结
2013-01-14 15:06 12867UNDO是Oracle中的一个很 ... -
Oracle在不同windows系统中的迁移
2013-01-09 15:41 3687在Windows操作系统环境下 ... -
Oracle 10.2.0.1在windows 2008上安装失败经历
2013-01-07 10:29 8614这两天遇到这个一个项目上的数据库迁移的问题。原来的环境是数据库 ... -
所有的物化视图刷新脚本
2012-12-28 13:59 0select 'execute dbms_mview.refr ... -
Oracle数据库的SQL性能问题分析
2012-12-27 15:31 5213在Oracle 10.2.0.4数据库中,有一个SQL执行缓慢 ... -
db block gets和consistent gets的分析
2012-12-26 18:09 0在Oracle的文档中有这样一段解释: db block g ... -
创建增量同步Oracle物化视图问题
2012-12-25 14:07 15164我们采用Oracle的物化视图增量刷新机制定时将数据库A上的某 ... -
查归档日志文件每小时生成量
2012-12-18 16:13 10712在O racle数据库中,通过v$archived_lo ... -
如何删掉临时表空间的文件
2012-12-18 15:40 0Unlike Oracle datafiles which m ... -
Oracle sql性能诊断暨event 10046和10053使用
2012-12-17 10:24 0早上em grid control监控显示数据库的负载增加,其 ... -
查LOB字段占用的空间大小
2012-12-13 16:00 4474查询Oracle表中LOB字段的占用空间大小。表中每一个LOB ... -
Oracle Data Guard的重做日志传输和应用状况监控
2012-12-04 14:05 4015这是一个用来监控Oracle Data Guard环境下从主库 ... -
Oracle sql loader使用速成
2012-11-30 14:14 4817Oracle SQL LOADER是Oracle的 ... -
Oracle 11g2的监听器配置
2012-11-29 14:34 4296Oracle的监听器服务注册 ... -
Deleting archivelog on physical standby with RMAN in Oracle 10g
2012-11-28 13:25 0Turns out to be quite easy ... -
to_char将number转成string的小技巧
2012-11-27 14:14 10549很多数据转换处理操作时,会遇到将0.007007040000转 ... -
to_date转成字符串时ORA-01843 not a valid month 问题分析
2012-11-26 16:38 29115(注,本文三度易稿) 在开发Oracle SQL或PL/SQL ... -
Data Guard 10g 的保护级别为RESYNCHRONIZATION问题
2012-11-25 11:01 1868Oracle的data guard创建完成 ...
相关推荐
log file sycn是ORACLE里最普遍的等待事件之一,一般log file sycn的等待时间都非常短 1-5ms,不会有什么问题,但是一旦出问题,往往都比较难解决。什么时候会产生log file sync等待?
Tuning 'log file sync' event waits In this blog entry, we will discuss strategies and techniques to resolve 'log file sync' waits. This entry is intended to show an approach based upon scientific ...
Oracle log file sync等待事件优化浅析.pdf
ib_logfile0ib_logfile0ib_logfile0
log file sync(ms) db file scattered read(ms) #IO WorkLoad Oracle IOPS Oracle MBPS db file sequential read db file scattered read log file parallel write log file sync physical reads physical writes ...
图文并茂,非常详细的介绍Log File Sync机制,对oracle调优很有帮助
关于log4net写入数据库,b/s版和c/s版,数据库及log4net应用说明
log4j写入数据库配置
配置log4j配置数据库连接池(以dbcp连接池为例),并将log信息存储在数据库中(以mysql为例)
用sql语句dbcclog查看SQLServer数据库的事务日志[定义].pdf
LogParser导入log数据至数据库
C# 利用log4net 把日志写入到数据库
查看对数据库的插入、更新、删除的操作。也可对误删的数据进行恢复。
NDC8将EventLog存入SqlServer数据库
数据库LOG收缩 数据库LOG收缩 数据库LOG收缩 数据库LOG收缩 数据库LOG收缩 数据库LOG收缩
asp.net4.0中使用log4net记录日志到sqlerver数据库中
net6 控制台+ log4net+写数据库+自定义字段
选择数据库->attach->左面对话框中browse->view log->就可以看到log记录了 点击“View DDL Commands”里面就有很多drop table 命令 点击下面的“undo”按钮是生成表结构的语句(create table ....) 点击下面的...
LogToFile ↓支持一下 Android a simple and practical to print to local phone logs Log files open source The log file is written to the tools, the priority SD card -> external memory -> internal ...
异常对于程序来说是非常重要的,方便我们程序员发现异常、并能够快速的找到异常;本文介绍使用Log4net实现获取程序的错误信息,并将错误信息写入Sql Server数据库。