- 浏览: 1099276 次
- 性别:
- 来自: 南京
博客专栏
-
Oracle管理和开发
浏览量:353246
最新评论
-
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 14814有一个需求,将某业务表的某个时间点之前的记录转移到它的历史 ... -
等待事件enq TX row lock contention分析
2013-01-17 17:16 33300在Oracle数据库性能报告AWRRPT分析时,发现top ... -
Oracle的UNDO表空间管理总结
2013-01-14 15:06 12992UNDO是Oracle中的一个很 ... -
Oracle在不同windows系统中的迁移
2013-01-09 15:41 3807在Windows操作系统环境下 ... -
Oracle 10.2.0.1在windows 2008上安装失败经历
2013-01-07 10:29 8706这两天遇到这个一个项目上的数据库迁移的问题。原来的环境是数据库 ... -
所有的物化视图刷新脚本
2012-12-28 13:59 0select 'execute dbms_mview.refr ... -
Oracle数据库的SQL性能问题分析
2012-12-27 15:31 5290在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 15317我们采用Oracle的物化视图增量刷新机制定时将数据库A上的某 ... -
查归档日志文件每小时生成量
2012-12-18 16:13 10794在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 4584查询Oracle表中LOB字段的占用空间大小。表中每一个LOB ... -
Oracle Data Guard的重做日志传输和应用状况监控
2012-12-04 14:05 4081这是一个用来监控Oracle Data Guard环境下从主库 ... -
Oracle sql loader使用速成
2012-11-30 14:14 4960Oracle SQL LOADER是Oracle的 ... -
Oracle 11g2的监听器配置
2012-11-29 14:34 4393Oracle的监听器服务注册 ... -
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 10640很多数据转换处理操作时,会遇到将0.007007040000转 ... -
to_date转成字符串时ORA-01843 not a valid month 问题分析
2012-11-26 16:38 29319(注,本文三度易稿) 在开发Oracle SQL或PL/SQL ... -
Data Guard 10g 的保护级别为RESYNCHRONIZATION问题
2012-11-25 11:01 1923Oracle的data guard创建完成 ...
相关推荐
【LOG FILE SYNC】是Oracle数据库中常见的等待事件,主要涉及事务提交、回滚、DDL操作以及数据字典的修改。当事务执行完一系列操作后,需要将redo日志记录写入磁盘,以保证数据的一致性和持久性,此时就会发生LOG ...
Oracle log file sync等待事件优化浅析.pdf
"用sql语句dbcclog查看SQLServer数据库的事务日志" SQL Server 数据库的事务日志是对数据库中的所有操作进行跟踪和记录的机制,它记录了数据库中的每一个操作,包括INSERT、UPDATE、DELETE等。通过查看事务日志,...
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 ...
此外,考虑到性能和可扩展性,还可以使用缓冲策略,如BulkInsert,来批量处理日志记录,减少对数据库的频繁访问。 总之,log4net写入数据库的能力使得日志管理更加规范且易于分析。无论是B/S还是C/S应用,通过合理...
ApexSQL Log 2014是一款专业的SQL数据库日志查询工具,专为数据库管理员和开发人员设计,用于深入分析和审计SQL Server数据库中的事务历史记录。它提供了强大的功能,帮助用户追踪数据库中的更改,包括插入、更新和...
图文并茂,非常详细的介绍Log File Sync机制,对oracle调优很有帮助
总结来说,Log4j写入数据库的配置涉及到创建适应的数据库表结构、配置`log4j.properties`文件以指定数据库连接信息和日志格式,并通过`JDBCAppender`将日志数据持久化到数据库中。这样的配置有助于收集和分析大量...
在IT行业中,日志记录是系统监控、故障排查和性能分析的重要工具。C#作为.NET框架的主要编程语言,提供了多种方式来实现日志管理。在本篇内容中,我们将深入探讨如何利用开源日志框架log4net将应用程序的日志信息...
在“LogParser导入log数据至数据库”这个主题中,我们将重点讨论如何使用LogParser将日志数据高效地导入到数据库中,以便进行长期存储、进一步分析或构建报表。首先,你需要理解LogParser的基本用法和语法,包括如何...
NDC8将EventLog存入SqlServer数据库 在本篇文章中,我们将详细介绍如何将EventLog存入SqlServer数据库,以便更好地管理和分析事件日志。该过程主要包括三步:创建EventLog表、创建插入EventLog数据的存储过程,以及...
**标题:“log4net 数据库日志”** **描述**: 在软件开发中,日志记录是一项关键任务,它能够帮助开发者追踪系统运行时的问题,分析性能瓶颈,并进行故障排查。`log4net`是Apache的一个开源项目,是.NET平台上一个...
在上述配置中,我们设置了AdoNetAppender,它将日志信息存储到SQL Server数据库的ErrorLog表中。如果需要,可以自定义表结构,以便包含更多相关信息,如机器名、用户名等。此外,Log4Net还支持其他类型的Appender,...
在.NET 6框架下,构建一个控制台应用并结合log4net进行日志记录,同时将日志数据存储到数据库并支持自定义字段,是一项常见的系统监控和故障排查任务。以下将详细介绍如何实现这一功能。 首先,log4net是Apache的一...
数据库LOG收缩 数据库LOG收缩 数据库LOG收缩 数据库LOG收缩 数据库LOG收缩 数据库LOG收缩
asp.net4.0中使用log4net记录日志到sqlerver数据库中
选择数据库->attach->左面对话框中browse->view log->就可以看到log记录了 点击“View DDL Commands”里面就有很多drop table 命令 点击下面的“undo”按钮是生成表结构的语句(create table ....) 点击下面的...
8. **性能考虑**: 虽然日志记录对调试和问题排查非常重要,但大量日志可能会对数据库性能产生影响。因此,需要合理设置日志级别,避免在非必要时记录过多信息。 9. **安全性**: 存储在数据库的日志可能包含敏感信息...
数据库性能指标是衡量数据库系统运行效率的关键因素,它涉及到数据查询速度、系统响应时间、并发处理能力等多个方面。SQL(Structured Query Language)数据库和Oracle数据库作为两种广泛应用的关系型数据库管理系统...