(原创)如何在性能测试中自动生成并获取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 ...
随机推荐
- Delphi的Hint介绍以及用其重写气泡提示以达到好看的效果
Delphi中使用提示是如此简单,只需将欲使用Hint的控件作如下设置: ShowHint := True; Hint := ‘提示信息’; 不必写一行代码,相当方便. 但有时我们又想自己定制提示的效 ...
- java程序包不存在
当把classpath和path设置好之后. 自己写了个类的,然后放在test_package\mypackage路径下.主函数要用到.但是却出错了. 我一开始怀疑自己的classpath配置错了,在 ...
- 《Django By Example》第十一章 中文 翻译 (个人学习,渣翻)
第十一章 缓存内容 (译者 @ucag 注:这是倒数第二章,最后一个项目即将完成. @夜夜月 将会接过翻译的最后一棒.这本书的翻译即将完成.这也是我翻译的最后一章,作为英语专业的学生,我对于翻译有了更 ...
- Java 异常处理 try catch finally throws throw 的使用和解读(一)
//最近的一个内部表决系统开发过程中,//发现对异常处理还存在一些模棱两可的地方,//所以想着整理一下//主要涉及到://1.try catch finally throws throw 的使用和解读 ...
- Jenkins集成Docker
大概过程如下图: 由于需要用到docker打包镜像,jenkins宿主机上需要安装docker,原先的jenkins server安装在centos6上无法运行docker,所以这里单独用一台cent ...
- python学习随笔(二)
今天主要是用户输入输出,字符拼接. 在python中,多行注释是3个单引号或双引号 单行注释是#号开头,如下. ''' name = "xiaoming" print(name) ...
- Lvs+keepalived+mysql主从热备
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...
- 老李分享:大数据框架Hadoop和Spark的异同 1
老李分享:大数据框架Hadoop和Spark的异同 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...
- 震荡信号Simulink仿真
1. simulink仿真设计 震荡信号本质是调制信号,可以表示为: u(t)=A*(1+m*cos(Ωt+θ))*cos(ωt+φ)=A*cos (ωt+φ)+ A*m*cos(Ωt+θ)*cos( ...
- 博客搬到CSDN了
新博客地址: http://blog.csdn.net/enlangs