AWR报告获取脚本
在实际的使用过程中发现,当捞取较长时间的AWR报告时,例如过去24小时的AWR报告(通常以1小时或者半小时为单位获取),则需要执行24次获取AWR报告的操作(获取AWR报告的相关操作可以参见:https://blog.csdn.net/yingdovezuo/article/details/84772125)
于是针对此批量获取AWR报告有编写如下脚本
首先以sysdba的方式进入数据库
su - oracle
sqlplus / as sysdba
由于获取的AWR报告数量较多,建议新建一个文件夹
先创建一个文件夹
mkdir /home/oracle/awr_dir
创建完成后,制定新创建的路径为存放AWR报告的路径
CREATE OR REPLACE DIRECTORY awr_reports_dir AS '/home/oracle/awr_dir';(其中引号内的为对应的新建的文件夹的路径)
首先按照常规获取AWR报告的方式,获取所需时间区间的Snap ID
之后,执行如下脚本(在第三行与第四行分别输入开始与结束时间点的Snap ID)
DECLARE
-- Adjust before use.
l_snap_start NUMBER := 13373(此栏位输入开始时间的Snap ID);
l_snap_end NUMBER := 13397(此栏位输入结束时间的Snap ID);
l_dir VARCHAR2(50) := 'AWR_REPORTS_DIR';
l_last_snap NUMBER := NULL;
l_dbid v$database.dbid%TYPE;
l_instance_number v$instance.instance_number%TYPE;
l_file UTL_FILE.file_type;
l_file_name VARCHAR(50);
BEGIN
SELECT dbid
INTO l_dbid
FROM v$database;
SELECT instance_number
INTO l_instance_number
FROM v$instance;
FOR cur_snap IN (SELECT snap_id
FROM dba_hist_snapshot
WHERE instance_number = l_instance_number
AND snap_id BETWEEN l_snap_start AND l_snap_end
ORDER BY snap_id)
LOOP
IF l_last_snap IS NOT NULL THEN
l_file := UTL_FILE.fopen(l_dir, 'awr_' || l_last_snap || '_' || cur_snap.snap_id || '.htm', 'w', 32767);
FOR cur_rep IN (SELECT output
FROM TABLE(DBMS_WORKLOAD_REPOSITORY.awr_report_html(l_dbid, l_instance_number, l_last_snap, cur_snap.snap_id)))
LOOP
UTL_FILE.put_line(l_file, cur_rep.output);
END LOOP;
UTL_FILE.fclose(l_file);
END IF;
l_last_snap := cur_snap.snap_id;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.is_open(l_file) THEN
UTL_FILE.fclose(l_file);
END IF;
RAISE;
END;
上述Script也可直接通过PL/SQL 、SQL Developer等工具直接执行,相比较在putty中执行,可以更显著的看到脚本运行的状态
执行完上述语句后需要稍等片刻,当系统提示
PL/SQL procedure successfully completed.
即代表已生成所需的AWR报告
至对应的路径下’/home/oracle/awr_dir获取相关报告即可
建议通过winscp界面可以直接获取相关的AWR报告