(原创)如何在性能测试中自动生成并获取Oracle AWR报告
版权声明:本文为原创文章,转载请先联系并标明出处
由于日常使用最多的数据库为Oracle,因此,最近又打起了Oracle的AWR报告的主意。
过去我们执行测试,都是执行开始和结束分别手动建立一个快照,然后需要这部分数据的时候再去获取AWR报告查看。
但是有的时候忙乱起来或者一个任务项交给别人来做就经常会有忘记建立快照的情况,这时候就只能通过Oracle自己默认建立的快照来获取了。但是我们知道 Oracle默认是一个小时才建立一个快照,且建立快照的时间点很难跟我们的测试过程能匹配到一起,这样我们获取的测试报告就有了很多的干扰项。
而且,有很多新来的小朋友做性能测试的时候也并不知道该怎么取报告。每次都要去教的话,不是我的风格,懒癌晚期当然是能偷懒就偷懒了。于是开始动起了歪脑经:能不能使用软件测试工具同步把AWR报告也收集过来呢,如果可以集成到脚本中,那么获取AWR报告的时候使用的始末快照就能跟我们的测试过程完全匹配了,也防止了因为疏忽忘记建立快照的情况。
可以选择的测试工具有很多,比如Loadrunner、Jmeter、HyperPacer等,仔细研究了HyperPacer提供的JDBC采样器,发现HyperPacer完全可以胜任这个需求。
对如何在性能测试中手工生成AWR报告完成数据库性能分析还不了解的同学猛戳这里了解!
于是大概梳理了一下思路:
首先:
在初始化场景内:添加JDBC采样器,分别进行两个操作:一个是通过dbms_workload_repository这个包提供的create_snapshot()建立快照,然后查询当前最大的快照号,也就是我们刚刚建立的快照,作为测试的起始快照号;
在收尾场景内:添加JDBC采样器,同样建立快照,并查询当前最大快照号,作为测试的终止快照号;再多添加一个JDBC采样器,通过包dbms_workload_repository提供的方法AWR_report_html获取两个快照间的AWR报告。
理想很美好,但是实际实现起来却发现没有那么简单。原来想当然的是在初始化场景里先获取测试开始的快照号,然后作为变量传给收尾场景的JDBC采样器。但是执行的时候一直报变量无效。
想了好久不知道是什么原因,最后忽然想明白原因了,没想到学习使用了这么长时间的HyperPacer,最后在小--(阴)--(沟)---(里)翻了船。
获取初始快照号的采样器建在初始化场景下,这也就决定了这个采样器的作用域只能在初始化场景下,我把它输出的变量传给收尾场景的采样器,超出了作用域自然就无法识别了。
汗~~~~~~~~~~
于是只好调整思路,既然无法完美实现,那么只好退而求其次,初始化场景只建立快照,获取这个快照号的采样器移到收尾场景内。于是最终实现后就是如图下面的样子:

可以看到在快照浏览器里已经取到对应本次执行过程的AWR报告。
下面给童鞋们说一下具体的实现步骤:
依赖于HyperPacer强大的功能,要实现这个自动获取AWR报告的需求,脚本里面其实只用到了两个元件来实现,配置元件里的JDBC连接配置和取样器里的JDBC请求取样器。
第一步:我们需要在工程Demo下面增加一个配置元件,JDBC连接配置,配置界面如下:

配置界面很简单,首先需要自定义一个数据源名称,因为在后面我们的JDBC取样器都会用到这个变量里定义的名称,所以尽量用识别度高且有实际含义的名称。
然后下面是选择数据库类型和填写数据源的连接信息,截图已经给出了各个图形界面输入框的含义。小伙伴们还可以选择勾上URL的复选框,然后自己把TNS文件里配置的连接信息直接简单粗暴的Copy进来。
第二步:在初始化场景里添加JDBC取样器,如下图配置:

Oracle提供的包以及包里包括的方法,可以查看Oracle官网文档,有很详细的解释
第三步:在收尾场景里添加5个JDBC取样器,分别如下:
建立结束快照号

获取DBID

获取实例NUMBER

获取开始和结束快照号

获取AWR报告正文
齐活,以调试模式运行,然后就可以在快照浏览器里,选中我们定义的获取AWR报告正文的取样器“获取AWR报告数据”,在右侧的渲染里就可以看到AWR报告了。
好了,相信大家按照这个步骤做下来应该已经学会如何使用HyperPacer自动获取AWR报告了。然—并—卵,因为我要告诉大家的是:一个好消息一个坏消息。
坏消息是:即便你取到了AWR报告,你可能根本不知道该看哪里而且也看不懂;好消息是:HyperPacer运营组后续可能会因为小伙伴们要求传授此类知识的呼声太高而不得不组织此类培训哦。
最后,作为一个有情怀的人,我必须直面HyperPacer的不完美,所以我必须要告诉大家,这个实现方案并不完美。这样的实现为什么我说不完美呢?因为,就如我们前面所说,Oracle默认情况下自己也会隔一个小时做一个快照,假设我们的测试过程耗时较长,超过了一个小时,那么,我们再去取最大的两个快照号时,实际上取到的是下图所示的红框内的统计数据。

如果我们能预先知道测试运行多长时间,我们还可以手动修改一下提取快照号的SQL(如何修改,来HyperPacer的交流群来问我啊),但是如果没办法预知测试耗时,那就没办法支持了。
还有一个不完美的地方,那就是只能在调试模式下才能看到取到的AWR报告,虽然说,我们需要AWR报告的时候大多都是在排查问题的时候,使用调试模式也无可厚非,但是,有着强迫症的我,总觉得脚本调试模式的性能损耗会把本来可以漂亮的结果拖累成一个Ugly things。以前的快照浏览器明明是一个配置元件,为什么它长大了就变成了一个功能页签。
于是,怀着无比郁闷的心情,我给HyperPacer技术组的小伙伴们又提了两个需求:
1、真心希望HyperPacer能够再增加一个全局变量配置的地方,通过对该变量读写进行跨域的参数传递。
2、运行模式也能支持特定的取样器结果输出。
提完需求,技术组的小伙伴哭着去加班去解决了,而我,美美的坐上了班车回家了。

参考文章: Oracle AWR报告指标全解析 原文出处
(原创)如何在性能测试中自动生成并获取Oracle AWR报告的更多相关文章
- 【原创】有关Silverlight中自动生成的类中 没有WCF层edmx模型新加入的对象 原因分析。
前端页面层: 编译老是不通过,报如下如所示错误: -- 然后下意识的查了下 生成的cs文件,没有搜到根据edmx 生成的 对应的类. 结果整理: 1.尽管在 edmx 模 ...
- 在 Linux 中自动生成 Cordova/Phonegap for Android 的 APK 安装程序
在 Linux 中自动生成 Cordova/Phonegap for Android 的 APK 安装程序 本贴首发于: http://xuekaiyuan.com/forum.php?mod=vie ...
- IntelliJ IDEA 中自动生成 serialVersionUID 的方法
as, idea plugin中搜如下关键字,并安装该插件: GenerateSerialVersionUID 如上图所示,创建一个类并实现Serializable接口,然后按alt+Enter键,即 ...
- 在PowerDesigner中自动生成sqlserver字段备注
在PowerDesigner中自动生成sqlserver字段备注 PowerDesigner是数据库设计人员常用的设计工具,但其自生默认生成的代码并不会生成sqlserver数据库的字段备注说明.在生 ...
- 二十四、详述 IntelliJ IDEA 中自动生成 serialVersionUID 的方法
当我们用 IntelliJ IDEA 编写类并实现 Serializable(序列化)接口的时候,可能会遇到这样一个问题,那就是: 无法自动生成serialVersionUID. 而serialVer ...
- eclipse中自动生成注释
eclipse中自动生成注释 包前缀设置的地方 注释模板设置的地方 Eclipse自动生成方法注释 快捷键 自动生成方法的注释格式,例如 /*** @param str* @return* @thro ...
- Eclipse中自动生成get/set时携带注释给get/set
Eclipse中自动生成get/set时携带注释给get/set 编码的时候通常要用到 JavaBean ,而在我们经常把注释写在字段上面,但生成的Get/Set方法不会生成,通过修改Eclips ...
- 从JSON中自动生成对应的对象模型
编程的乐趣和挑战之一,就是将体力活自动化,使效率成十倍百倍的增长. 需求 做一个项目,需要返回一个很大的 JSON 串,有很多很多很多字段,有好几层嵌套.前端同学给了一个 JSON 串,需要从这个 J ...
- Oracle Awr报告_生成
AWR的概念 Oracle数据库是一个使用量很多的数据库,关于Oracle数据库的性能.Oracle10g以后,Oracle提供了一个性能检测的工具:AWR(Automatic Workload Re ...
随机推荐
- iOS开发优秀博客和软件推荐
iOSBlogAndTools iOS开发优秀博客和软件推荐 本博客和工具列表由广大iOS开发者收集和推荐,如果大家有好的博客或者工具想要分享请点击:我要提交. 收到大家的提交后会及时收录与更新.Gi ...
- spring(一) IOC讲解
spring基本就两个核心内容,IOC和AOP.把这两个学会了基本上就会用了. --WH 一.什么是IOC? IOC:控制反转,通俗点讲,将对象的创建权交给spring,我们需要new对象,则由spr ...
- NIO(四、Selector)
目录 NIO(一.概述) NIO(二.Buffer) NIO(三.Channel) NIO(四.Selector) Selector 前面两个章节都描述了Buffer和Channel,那这个章节就描述 ...
- 深入理解Spring中bean的生命周期
[Spring中bean的生命周期] bean的生命周期 1.以ApplocationContext上下文单例模式装配bean为例,深入探讨bean的生命周期: (1).生命周期图: (2).具体事例 ...
- Modbus通信协议详解
附:http://www.360doc.com/content/14/0214/13/15800361_352436989.shtml 一.Modbus 协议简介 Modbus 协议是应用于电子控制器 ...
- java初学第二章
这两天学习了基本的数据类型还有运算符. 分享一下学习过程还有写作~ 数据类型分为基本数据类型还有引用数据类型,基本数据类型有4类8种: 整型: byte,short,int,long 浮点型:floa ...
- unity3d屏蔽Windows10输入法
在win10上,如果安装了某些输入法(比如QQ输入法),会造成unity的键盘事件被输入法捕获而不能触发的情况.只有将输入法切换到英文状态下才能响应键盘事件. 解决办法有, 1:用户主动切换输入法,甚 ...
- 性能测试分享: Jmeter的源码分析main函数参数
性能测试分享: Jmeter的源码分析main函数参数 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大 ...
- MVC特性路由的提供机制
回顾:传统路由是如何提供的? 我们知道最终匹配的路由数据是保存在RouteData中的,而RouteData通常又是封装在RequestContext中的,他们是在哪里被创建的呢?没错,回到了UrlR ...
- Java基础学习(三)—面向对象(上)
一.理解面向对象 面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是 ...