脚本:自动生成精准的Oracle AWR报告

2024年 8月 1日 71.9k 0

很多朋友把AWR报告发过来让我帮忙分析Oracle数据库的性能,但很多报告都有一个共同的缺陷:就是这些报告覆盖的时间范围太广,导致性能问题的数据被严重稀释。

为了解决这个问题,我开发了下面的脚本。如果您没有明确需求指定特定的诊断时间段,可以使用此脚本从两个维度缩小诊断时间范围:

  • 只覆盖高峰时段: 该脚本自动识别出工作负载最高的快照ID,并生成覆盖这个快照的AWR报告。通过聚焦于负载最高的时间段,可以更清晰地查看潜在的性能问题。

  • 单实例报告: 在多实例环境中,该脚本为每个实例单独生成AWR报告,而不是生成覆盖所有实例的单个数据库范围报告。这种方法有助于定位特定于每个实例的问题,这些问题在查看聚合报告时可能会被掩盖。

这个脚本自动生成的AWR报告会保存在/tmp目录下,文件名中包括实例名和生成时间便于识别。

    -- This script generates AWR reports for the peak time over the past back_days (defaulted to 7 days).
    -- Dated July 2024
    -- Author: Yuan Yao
    CREATE OR REPLACE DIRECTORY tmp AS '/tmp/';


    DECLARE
    back_days NUMBER := 7; -- Customize the number of back days here
    peak_id NUMBER;
    my_dbid NUMBER;
    today VARCHAR2(30);
    awr_dir VARCHAR2(40) := 'TMP';
    awr_file UTL_FILE.FILE_TYPE;
    awr_file_name VARCHAR2(60);
    BEGIN
    -- Get the peak snap_id
    SELECT snap_id
    INTO peak_id
    FROM (
    SELECT snap_id, average, end_time
    FROM dba_hist_sysmetric_summary
    WHERE average = (SELECT MAX(average)
    FROM dba_hist_sysmetric_summary
    WHERE metric_name = 'Average Active Sessions'
    AND end_time > SYSDATE - back_days)
    )
    WHERE ROWNUM = 1;


    -- Get the DBID
    SELECT dbid
    INTO my_dbid
    FROM v$database;


    -- Get the current date and time
    SELECT TO_CHAR(SYSDATE, 'YYYY_MON_DD_HH24_MI')
    INTO today
    FROM dual;


    -- Loop through each instance in the RAC environment
    FOR instance_rec IN (SELECT instance_number, instance_name FROM gv$instance) LOOP
    awr_file_name := 'awr_' || today || '_' || instance_rec.instance_name || '.html';
    awr_file := UTL_FILE.FOPEN(awr_dir, awr_file_name, 'w');


    -- Generate the AWR report in HTML format for each instance
    FOR curr_awr IN (
    SELECT output
    FROM TABLE(dbms_workload_repository.awr_report_html(
    my_dbid,
    instance_rec.instance_number,
    peak_id - 1, peak_id,
    0))
    )
    LOOP
    UTL_FILE.PUT_LINE(awr_file, curr_awr.output);
    END LOOP;


    UTL_FILE.FCLOSE(awr_file);
    END LOOP;


    EXCEPTION
    WHEN OTHERS THEN
    IF UTL_FILE.IS_OPEN(awr_file) THEN
    UTL_FILE.FCLOSE(awr_file);
    END IF;
    RAISE;
    END;
    /

    下面的例子是为两个实例的数据库生成的AWR报告:

      [oracle@rac19c1 tmp]$ ls -lrt
      ...
      -rw-r--r-- 1 oracle asmadmin 1084024 Jul 31 10:43 awr_2024_JUL_31_10_42_orcl2.html
      -rw-r--r-- 1 oracle asmadmin 1117641 Jul 31 10:43 awr_2024_JUL_31_10_42_orcl1.html

      我在certview.oracle.com网站上的证书截图:

      脚本:自动生成精准的Oracle AWR报告-1

      欢迎关注我的公众号,一起学习数据库技术

      欢迎加我的微信,拉你进数据库微信群

      脚本:自动生成精准的Oracle AWR报告-2

      推荐文章👇

      国外的程序员没有35岁魔咒吗?

      试看号主的拙作《MySQL 8.0运维与优化》(清华大学出版社)

      托业890分的Oracle ACE为您翻译国际大佬的雄文(合集)

      又考了一个Oracle优化的OCP,交一下作业

      一个计算机工程师如何达到英语专业八级的水平

      学好Oracle只需要看一本书就够了?

      相关文章

      Oracle如何使用授予和撤销权限的语法和示例
      Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
      下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
      社区版oceanbase安装
      Oracle 导出CSV工具-sqluldr2
      ETL数据集成丨快速将MySQL数据迁移至Doris数据库

      发布评论