`
mikixiyou
  • 浏览: 1099276 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353246
社区版块
存档分类
最新评论

log file sync致数据库性能摇摆

阅读更多

数据库在某些时间点突然出现性能峰值,使得前端应用程序有停滞感。分析出为log file sync 事件突然发生导致了该问题。

该事件是表示用户在LWGR 进程将redo 日志信息写入的redo logfile 。在普通的数据库配置中,能优化这个问题的方法只能减低日志写入量,提升日志写入速度,就是将redo logfile 放到更快的磁盘组上。

我们这里的数据库环境是LGWR 既要将REDO 日志信息写入到REDO 日志文件中,也要通过网络写入到远程的STANDBY 数据库中。

我们的问题出现在写入到standby 时发生了堵塞,导致了log file sync 等待事件的大量发生,从而使得数据库性能峰值频繁出现,有时候都影响到应用。

因此我们将LGWR 写入到standby 的操作方式从lgwr sync affirm 修改为lgwr async 方式,就是从实时同步修改为非实时同步。

这样就解决了这个性能问题。

 

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1570147 )

 

1.  问题

环境交代一下,数据库版本10.2.0.4ASM 存储,单实例,归档模式,多路径用于异地的data guard 逻辑备库和物理备库,最大可用模式。

Oracle EM GRID CONTROL 管理平台中,看到数据库性能页面上平均活动会话瞬间提升到数倍,如正常时一直是2-3 个,到某个时间点到达18-19 个之多。

log file sync 02

突然增加的等待事件归类为configurationconcurrency 。在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'

 

 

所以,问题在LGWRredo 信息到磁盘上还是网络上发生了堵塞导致了性能峰值,需要我们去判断一下。

如果是发生在写入磁盘上导致了性能峰值问题,那我们也没办法了。更快的磁盘真的没有了。

如果是发生在网络上,我们需要检查网络状况。

但这里还有一种可能,就是redo 信息的量在那个时间点真的突然增大了。这种情况也是有可能导致这种性能峰值问题。

但这个可能很快被否决掉,在awrrptload 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 处理事件。

log file sync 02

 

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 数据库里了。数据的安全有一些损失,但在性能、可用性、数据安全方面,是必须有取舍的。

分享到:
评论
1 楼 szkktom 2012-08-02  
觉得 oracle牛人好多,对oracle 理解好深刻啊,
身边高手好少

相关推荐

    LOG FILE SYNC概述

    【LOG FILE SYNC】是Oracle数据库中常见的等待事件,主要涉及事务提交、回滚、DDL操作以及数据字典的修改。当事务执行完一系列操作后,需要将redo日志记录写入磁盘,以保证数据的一致性和持久性,此时就会发生LOG ...

    Oracle log file sync等待事件优化浅析.pdf

    Oracle log file sync等待事件优化浅析.pdf

    用sql语句dbcclog查看SQLServer数据库的事务日志[定义].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 ...

    log4net写入数据库

    此外,考虑到性能和可扩展性,还可以使用缓冲策略,如BulkInsert,来批量处理日志记录,减少对数据库的频繁访问。 总之,log4net写入数据库的能力使得日志管理更加规范且易于分析。无论是B/S还是C/S应用,通过合理...

    ApexSQllog2014,SQL数据库日志查询软件

    ApexSQL Log 2014是一款专业的SQL数据库日志查询工具,专为数据库管理员和开发人员设计,用于深入分析和审计SQL Server数据库中的事务历史记录。它提供了强大的功能,帮助用户追踪数据库中的更改,包括插入、更新和...

    Tanel_Poder_log_file_sync

    图文并茂,非常详细的介绍Log File Sync机制,对oracle调优很有帮助

    log4j写入数据库配置

    总结来说,Log4j写入数据库的配置涉及到创建适应的数据库表结构、配置`log4j.properties`文件以指定数据库连接信息和日志格式,并通过`JDBCAppender`将日志数据持久化到数据库中。这样的配置有助于收集和分析大量...

    C# 利用log4net 把日志写入到数据库

    在IT行业中,日志记录是系统监控、故障排查和性能分析的重要工具。C#作为.NET框架的主要编程语言,提供了多种方式来实现日志管理。在本篇内容中,我们将深入探讨如何利用开源日志框架log4net将应用程序的日志信息...

    LogParser导入log数据至数据库

    在“LogParser导入log数据至数据库”这个主题中,我们将重点讨论如何使用LogParser将日志数据高效地导入到数据库中,以便进行长期存储、进一步分析或构建报表。首先,你需要理解LogParser的基本用法和语法,包括如何...

    NDC8将EventLog存入SqlServer数据库

    NDC8将EventLog存入SqlServer数据库 在本篇文章中,我们将详细介绍如何将EventLog存入SqlServer数据库,以便更好地管理和分析事件日志。该过程主要包括三步:创建EventLog表、创建插入EventLog数据的存储过程,以及...

    log4net 数据库日志

    **标题:“log4net 数据库日志”** **描述**: 在软件开发中,日志记录是一项关键任务,它能够帮助开发者追踪系统运行时的问题,分析性能瓶颈,并进行故障排查。`log4net`是Apache的一个开源项目,是.NET平台上一个...

    .Net 使用Log4Net 获取系统日志并写入数据库

    在上述配置中,我们设置了AdoNetAppender,它将日志信息存储到SQL Server数据库的ErrorLog表中。如果需要,可以自定义表结构,以便包含更多相关信息,如机器名、用户名等。此外,Log4Net还支持其他类型的Appender,...

    net6 控制台+ log4net+写数据库+自定义字段

    在.NET 6框架下,构建一个控制台应用并结合log4net进行日志记录,同时将日志数据存储到数据库并支持自定义字段,是一项常见的系统监控和故障排查任务。以下将详细介绍如何实现这一功能。 首先,log4net是Apache的一...

    数据库LOG文件收缩

    数据库LOG收缩 数据库LOG收缩 数据库LOG收缩 数据库LOG收缩 数据库LOG收缩 数据库LOG收缩

    log4net_数据库方式记录

    asp.net4.0中使用log4net记录日志到sqlerver数据库中

    log explorer数据库日志恢复

    选择数据库->attach->左面对话框中browse->view log->就可以看到log记录了 点击“View DDL Commands”里面就有很多drop table 命令 点击下面的“undo”按钮是生成表结构的语句(create table ....) 点击下面的...

    log4net写入sql server数据库实例

    8. **性能考虑**: 虽然日志记录对调试和问题排查非常重要,但大量日志可能会对数据库性能产生影响。因此,需要合理设置日志级别,避免在非必要时记录过多信息。 9. **安全性**: 存储在数据库的日志可能包含敏感信息...

    数据库性能指标,其中包括sql数据库和oracle数据库的性能指标介绍

    数据库性能指标是衡量数据库系统运行效率的关键因素,它涉及到数据查询速度、系统响应时间、并发处理能力等多个方面。SQL(Structured Query Language)数据库和Oracle数据库作为两种广泛应用的关系型数据库管理系统...

Global site tag (gtag.js) - Google Analytics