[自制工具]简便易用的ADDM报告生成工具

简介: Oracle数据库自带的ADDM报告生成工具有一些依赖条件,使用比较繁琐,而且报告名字不易于区分、分发。所以一直想写一个简单、易用的ADDM报告工具,今天终于把这个工具编写、调试完毕,现正式发布,也同时发布在GitHub。

■■ Oracle ADDM简介

ADDM全称是Automatic Database Diagnostic Monitor,是Oracle实现性能自我诊断的最佳利器。它依赖于AWR,我们知道AWR会自动收集整个数据库在运行期间的性能统计数据。
更多关于ADDM的知识不是本文的重点,你完全可以网搜一大堆详细的介绍、报告解读资料。

■■ 自制ADDM报告生成工具

数据库自带的报告生成工具有一些依赖条件,使用比较繁琐,而且报告名字不易于区分、分发。
所以一直想写一个简单、易用的ADDM报告工具,今天终于把这个工具编写、调试完毕,现正式发布,也同时发布在GitHub。

■■ 工具亮点

1、客户端只要可以采用sqlplus连接数据库,无需登录数据库主机,即可运行本工具生成addm报告
2、报告名字醒目、易懂、易于报告分发,命名格式:checkdb_hostname_instance_service_addmrpt_YYYYMMDD_StartHour-EndHour.txt
如:checkdb_zzjk01_zzjk1_zzjk_addmrpt_20211210_9-10.txt
主机名、实例名、服务名、日期、报告起止时间,一目了然,大大方便了我们的运维工作。

■■ 工具代码同时在github开源

https://github.com/likingzi/addmrpt

-- NAME
--   addmrpt.sql
--
-- DESCRIPTION
--   This script generates oracle ADDM report.
--
-- SUPPORTED ORACLE VERSION
--   11g, 19c
--
-- USAGE
--   sqlplus连接数据库,运行脚本:
--   SQL> @addmrpt
--   在当前目录生成数据库ADDM报告[默认当天9:00-10:00,可修改]
--   参数定义:day=0-当天;1-昨天;2-前天;依此类推
--
--   报告名字:checkdb_hostname_instance_service_addmrpt_YYYYMMDD_StartHour-EndHour.txt
--   报告名字示例:checkdb_zzjk01_zzjk1_zzjk_addmrpt_20211210_9-10.txt
--   注,普通数据库用户需具备如下权限:
--   grant execute on DBMS_WORKLOAD_REPOSITORY to username;
--   grant select_catalog_role to username;
--   grant advisor to username;
--
-- MODIFIED (YYYY-MM-DD)
-- likingzi  2021-12-10 - Created

prompt +-----------------------------+
prompt + Oracle Database ADDM Report +
prompt +-----------------------------+

set echo off
set termout off
set trimout off
set feedback off
set heading on
set linesize 200
set pagesize 10000
set numwidth 20
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

-- Define rpt_name <
set termout on
prompt Specify day of report: '0' - today, '1' - yesterday, and so on [Default to '0']
set termout off
column day new_value day noprint;
-- define day=0
select nvl('&&day','0') day from dual;
select 0 day from dual where '&day' < 0 or '&day' > 7;
set termout on
prompt Using day: &day
set termout off
--
set termout on
prompt Specify startTime of report: '0 - 23' [Default to '9']
set termout off
column startTime new_value startTime;
-- define startTime=9
select nvl('&&startTime','9') startTime from dual;
select 9 startTime from dual where &startTime < 0 or &startTime > 23;
set termout on
prompt Using startTime: &startTime
set termout off
--
set termout on
prompt Specify endTime of report: '0 - 23' [Default to '10']
set termout off
column endTime new_value endTime;
-- define endTime=10
select nvl('&&endTime','10') endTime from dual;
select 10 endTime from dual where &endTime < 0 or &endTime > 23 or &endTime < &startTime + 1;
set termout on
prompt Using endTime: &endTime
set termout off
--
COLUMN min_id NEW_VALUE begin_snap NOPRINT
COLUMN max_id NEW_VALUE end_snap NOPRINT
SELECT to_char(min(snap_id)) min_id,to_char(max(snap_id)) max_id FROM dba_hist_snapshot b
WHERE b.end_interval_time BETWEEN trunc(sysdate) - &day + &startTime / 24 AND trunc(sysdate) - &day + ( &endTime + 1) / 24;
--
COLUMN service_names NEW_VALUE service_names NOPRINT
select value service_names from v$parameter where upper(name) like '%SERVICE_NAMES%';
COLUMN rpt_name NEW_VALUE rpt_name NOPRINT
SELECT 'checkdb_'||host_name||'_'||instance_name||'_'||'&service_names'||'_addmrpt_'||TO_CHAR(SYSDATE - &day,'YYYYMMDD_')||'&startTime'||'-'||'&endTime'||'.txt' rpt_name FROM v$instance;
-- Define rpt_name >

set pagesize 0;
set heading off echo off feedback off verify off;

COLUMN dbid NEW_VALUE dbid NOPRINT
SELECT dbid FROM v$database;
COLUMN instance_number NEW_VALUE instance_number NOPRINT
SELECT instance_number FROM v$instance;

define view_loc_def = 'AWR_PDB';
define view_loc     = '&view_loc_def';

variable dbid       number;
variable inst_num   number;
begin
  :dbid      :=  &dbid;
  :inst_num  :=  &instance_number;
end;
/

variable bid        number;
variable eid        number;
begin
  :bid       :=  &begin_snap;
  :eid       :=  &end_snap;
end;
/

variable task_name  varchar2(40);

set termout on
prompt
prompt Running the ADDM analysis on the specified pair of snapshots ...
set termout off

begin
  declare
    id number;
    name varchar2(100);
    descr varchar2(500);
  BEGIN
     name := '';
     descr := 'ADDM run: snapshots [' || :bid || ', '
              || :eid || '], instance ' || :inst_num
              || ', database id ' || :dbid;

     dbms_advisor.create_task('ADDM',id,name,descr,null);

     :task_name := name;

     -- set time window
     dbms_advisor.set_task_parameter(name, 'START_SNAPSHOT', :bid);
     dbms_advisor.set_task_parameter(name, 'END_SNAPSHOT', :eid);

     -- set instance number
     dbms_advisor.set_task_parameter(name, 'INSTANCE', :inst_num);

     -- set dbid
     dbms_advisor.set_task_parameter(name, 'DB_ID', :dbid);

     -- execute task
     dbms_advisor.execute_task(name);

  end;
end;
/

set termout on
prompt
prompt Generating the ADDM report for this analysis ...
set termout off

spool &rpt_name;

set long 1000000 pagesize 0 longchunksize 1000
column get_clob format a80

select dbms_advisor.get_task_report(:task_name, 'TEXT', 'TYPICAL')
from   sys.dual;

spool off;
set termout on
prompt
prompt End of Report
prompt Report written to &rpt_name.
目录
相关文章
|
2月前
|
敏捷开发 开发框架 数据可视化
有哪些任务管理跟踪系统值得推荐?高效工具一览
在快节奏的工作环境中,任务管理跟踪系统成为提升生产力的关键。本文介绍了五款优秀工具:板栗看板企业版、Jira、Trello、Monday.com 和 Asana,分别从多项目管理、敏捷开发支持、操作简便性、可视化工作流及跨部门协作等方面进行分析,帮助你根据团队需求选择最合适的工具。
62 3
|
4月前
|
安全 搜索推荐 数据安全/隐私保护
分享5款功能强悍,简洁干净的软件
电脑上的各类软件有很多,除了那些常见的大众化软件,还有很多不为人知的小众软件,专注于实用功能,简洁干净、功能强悍。今天分享5个实用的软件,简单实用,效果拉满,堪称工作生活必备!
65 1
|
5月前
|
数据安全/隐私保护 Sentinel Windows
5款简洁干净,功能强悍,专注实用的软件
电脑上的各类软件有很多,除了那些常见的大众化软件,还有很多不为人知的小众软件,专注于实用功能,简洁干净、功能强悍。
53 0
|
7月前
|
监控 数据可视化 时序数据库
打造高逼格、可视化的监控系统平台
打造高逼格、可视化的监控系统平台
57 1
|
7月前
|
数据采集 监控 网络协议
利用Perl编写局域网监控软件的数据分析与报告生成模块
使用Perl编写局域网监控软件,包括数据采集(如获取主机列表)、数据分析(统计主机在线时长)和报告生成。代码示例展示了如何利用Net::ARP模块收集信息、定时统计在线时间并生成报告。此外,通过LWP::UserAgent模块,可将监控数据自动提交至网站,便于管理员远程监控网络状态,保障网络安全。
104 0
|
7月前
|
Shell API 开发者
Python 自动化指南(繁琐工作自动化)第二版:十四、使用谷歌表格
Python 自动化指南(繁琐工作自动化)第二版:十四、使用谷歌表格
73 1
|
7月前
|
并行计算 搜索推荐 图形学
推荐五款简洁而实用的工具,值得你尝试
分享快乐是生活中美好的瞬间,而分享简单巧妙的工具也能令我愉悦。这五款工具简洁而实用,值得你尝试。
81 0
|
安全 Windows
每天分享五款工具,让大家工作生活更顺心
快乐不是在于拥有什么,而在于我们和别人分享什么。每天分享五款工具,让大家工作办公更顺心就是我最大的快乐。
79 0
|
数据库连接 测试技术 开发工具
猿创征文|工具百宝箱-编辑器-笔记工具-日常小工具-原型设计工具
猿创征文|工具百宝箱-编辑器-笔记工具-日常小工具-原型设计工具
|
XML 运维 JavaScript
【运维杂谈】方便好用的代码补全工具在哪里?
【运维杂谈】方便好用的代码补全工具在哪里?
104 0