הרצת לולאה של דוחות AWR (שימוש בסקריפט המקורי, לא ידנית)

בעבר כבר כתבתי על איך להוציא דוחות של AWR בלולאה באמצעות שימוש בפרוצדורה של awr_workload_repository. הפעם נתקוף את העניין מכיוון אחר.

מצורף סקריפט שימושי שמקבל נקודת התחלה, נקודת סיום (שניהם בפורמט של תאריך) ומייצר שני סקריפטים:

  1. הראשון הוא gen_awr_reports.sql המייצר קבצי awr (פורמט HTML למרות שאפשר לשנות את זה גם לפורמט טקסט) בפרקי זמן של שעה כל פעם, מה שמקל מאוד על הניתוח של הדוחות.
  2. השני הוא gen_awr_extract.sql המייצר גיבוי של פרק הזמן המדובר לתוך קובץ dump כדי שנוכל לטעון אותו מחדש לבסיס הנתונים למקרה שנרצה לנתח את התקופה הזו מאוחר יותר.

את הסקריפט יש להריץ מתחנה עם Oracle Home של Admin (כלומר, שיש שם ספריית rdbms/admin) או מהשרת.

הסקריפט תומך ב-RAC ומריץ דוח על כל אחד מה-Node-ים באופן אוטומטי. הסקריפט נבדק בסביבת Linux אבל אין סיבה שהוא לא יעבוד גם בסביבות אחרות.

הסקריפט, לשימושכם:

set serveroutput on size unl
set ver off feed off

accept bsnap date for 'mm/dd/yyyy hh24:mi' prompt 'Enter begin time (mm/dd/yyyy hh24:mi): '
accept esnap date for 'mm/dd/yyyy hh24:mi' prompt 'Enter end   time (mm/dd/yyyy hh24:mi): '

spool gen_awr_reports.sql
BEGIN
  FOR c IN (SELECT DISTINCT d.dbid            dbid,
                            d.name            db_name,
                            i.instance_number inst_num,
                            i.instance_name   inst_name
              FROM gv$database d, gv$instance i
             ORDER BY 1, 2) LOOP
    dbms_output.put_line('-- -- --');
    FOR s IN (SELECT perv_snap_id, snap_id
                FROM (SELECT TO_CHAR(s.startup_time, 'dd Mon "at" HH24:mi:ss') instart_fmt,
                             di.instance_name inst_name,
                             di.db_name db_name,
                             s.end_interval_time,
                             lag(s.snap_id) over(order by snap_id) perv_snap_id,
                             s.snap_id snap_id,
                             TO_CHAR(s.end_interval_time,
                                     'dd Mon YYYY HH24:mi') snapdat,
                             s.snap_level lvl
                        FROM dba_hist_snapshot          s,
                             dba_hist_database_instance di
                       WHERE s.dbid = c.dbid
                         AND di.dbid = c.dbid
                         AND s.instance_number = c.inst_num
                         AND di.instance_number = c.inst_num
                         AND di.dbid = s.dbid
                         AND di.instance_number = s.instance_number
                         AND di.startup_time = s.startup_time
                       ORDER BY db_name, instance_name, snap_id) s
               WHERE s.end_interval_time >
                     to_date('&bsnap', 'mm/dd/yyyy hh24:mi')
                 AND s.end_interval_time <=
                     to_date('&esnap', 'mm/dd/yyyy hh24:mi') + 1 / 24) LOOP
      dbms_output.put_line('define report_type=''html''');
      dbms_output.put_line('define num_days = 0');
      dbms_output.put_line('define dbid=' || c.dbid);
      dbms_output.put_line('define inst_num=' || c.inst_num);
      dbms_output.put_line('define begin_snap=' || s.perv_snap_id);
      dbms_output.put_line('define end_snap=' || s.snap_id);
      dbms_output.put_line('define report_name=awrrpt_' || c.inst_num || '_' ||
                           s.perv_snap_id || '_' || s.snap_id || '.html');
      dbms_output.put_line('@?/rdbms/admin/awrrpti.sql');
    END LOOP;
    dbms_output.put_line(NULL);
  END LOOP;
END;
/
spool off 

spool gen_awr_extract.sql 
BEGIN
  FOR c IN (SELECT DISTINCT d.dbid            dbid,
                            d.name            db_name,
                            i.instance_number inst_num,
                            i.instance_name   inst_name
              FROM v$database d, v$instance i
             ORDER BY 1, 2) LOOP
    dbms_output.put_line('-- -- --');
    FOR s IN (SELECT min(perv_snap_id) perv_snap_id, max(snap_id) snap_id
                FROM (SELECT TO_CHAR(s.startup_time, 'dd Mon "at" HH24:mi:ss') instart_fmt,
                             di.instance_name inst_name,
                             di.db_name db_name,
                             s.end_interval_time,
                             lag(s.snap_id) over(order by snap_id) perv_snap_id,
                             s.snap_id snap_id,
                             TO_CHAR(s.end_interval_time,
                                     'dd Mon YYYY HH24:mi') snapdat,
                             s.snap_level lvl
                        FROM dba_hist_snapshot          s,
                             dba_hist_database_instance di
                       WHERE s.dbid = c.dbid
                         AND di.dbid = c.dbid
                         AND s.instance_number = c.inst_num
                         AND di.instance_number = c.inst_num
                         AND di.dbid = s.dbid
                         AND di.instance_number = s.instance_number
                         AND di.startup_time = s.startup_time
                       ORDER BY db_name, instance_name, snap_id) s
               WHERE s.end_interval_time >
                     to_date('&bsnap', 'mm/dd/yyyy hh24:mi')
                 AND s.end_interval_time <=
                     to_date('&esnap', 'mm/dd/yyyy hh24:mi') + 1 / 24) LOOP
      dbms_output.put_line('define num_days = 0');
      dbms_output.put_line('define dbid=' || c.dbid);
      dbms_output.put_line('define begin_snap=' || s.perv_snap_id);
      dbms_output.put_line('define end_snap=' || s.snap_id);
    
      dbms_output.put_line('@?/rdbms/admin/awrextr.sql');
    END LOOP;
    dbms_output.put_line(NULL);
  END LOOP;
END;
/

spool off

prompt run @gen_awr_reports.sql to generate reports to current directory
prompt run @gen_awr_extract.sql to generate awr extract of snaps
0 תגובות

השאירו תגובה

Want to join the discussion?
Feel free to contribute!

השאר תגובה

אתר זה עושה שימוש באקיזמט למניעת הודעות זבל. לחצו כאן כדי ללמוד איך נתוני התגובה שלכם מעובדים.