目前在规划, 开发性能自动化执行框架, 其中有个环节很有意思, 就是如何通过框架自动获得场景执行期间的 Oracle awr 报告. 虽然 Oracle 客户端提供的 awrrpt.sql 脚本可以提供交互方式生成 awr 报告, 但并不能直接使用在自动化框架中, 至少需要做一些改造, 将交互的模式变成可以静默执行.
一 问题分析
经过对问题的分析, 有两种基本的解决思路:
A. 在 oracle 服务器上部署 shell 脚本, 使用 shell 命令启动 oracle 的 sqlplus 执行 autoawr.sql, 其中 autoawr.sql 主要用于获取必须入参值, 然后调用 oracle 包的 DBMS_WORKLOAD_REPOSITORY.awr_report_html 实现 awr 报告的自动生成;
B. 直接在性能框架里通过本地的 sqlplus 调用 oracle 包的 DBMS_WORKLOAD_REPOSITORY.awr_report_html 实现 awr 报告的生成;
二 方案比较
两种思路的比较:
对于 A, 需要提前将改造的 shell 脚本和 sql 脚本部署到 oracle 服务器, 该步骤是脱离框架的, 且生成的报告是在 oracle 服务器上, 需要框架提供方法将远程 oracle 上的 awr 获取到本地, 用于后续分析和报告输出;
对于 B, 在框架实现了该功能, 使用框架前无需额外部署, 使框架更独立, 使用更方便, 且可以直接将报告生成在本地指定的位置;
本质上, 两种思路是相同的, 只是对于性能框架而言, 该功能应该在哪端实现, 是性能框架还是 oracle 服务器.
三 实现思路
通过对实现端的比较, 决定将该功能在性能框架实现, 简要描述一下实现思路.
实现分为三步:
第一: 获取 awr_report_html 函数的 4 参数, 即 dbid,inst_num,l_bid,l_eid;
第二: 拼接调用 awr_report_html 且使用 spool 将结果写入 html 的 sql 语句;
第三: 调用 sqlplus 执行 sql 文件, 生成 awr;
四 awr_report_html 函数
Awr_report_html 函数如下:
函数使用方法一般为:
SELECT output FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(dbid, inst_num,l_bid,l_eid,0));
需要注意的是:
1. 虽然通过调用 AWR_REPORT_HTML 可以 select 到 html 格式的 text, 在 python 实现时我并没有将返回结果放到迭代器里, 通过 readlines 的方法写入 html 文件, 因 output 里包含了一些额外信息, 生成的 html 并不能顺利打开, 原因与 sqlplus 的参数配置有关, 因为采用 spool 直接写入文件的方法;
2. 使用 spool 时, 在 sql 脚本里设置以下 sqlplus 配置, 避免输出中包含无关信息或格式问题, 设置如下:
- set heading off
- set trimout on
- set trimspool on
- set linesize 2500
五 python 源码
根据上述思路, 实现源码如下:
Linux 公社的 RSS 地址: https://www.linuxidc.com/rssFeed.aspx
来源: http://www.linuxidc.com/Linux/2018-08/153350.htm