您的位置:首页 > 其它

Script - Check Current Undo Configuration and Advise Recommended Setup

2013-12-17 19:05 447 查看
This document is intended to check the current undo configuration and provides recommendation based on the previous workload.AUTION

For database version 10g and above, use the following script. Ensure to execute the same as SYSDBA.

10g and 10g+:

SET SERVEROUTPUT ON

SET LINES 600

ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';

DECLARE

v_analyse_start_time DATE := SYSDATE - 7;

v_analyse_end_time DATE := SYSDATE;

v_cur_dt DATE;

v_undo_info_ret BOOLEAN;

v_cur_undo_mb NUMBER;

v_undo_tbs_name VARCHAR2(100);

v_undo_tbs_size NUMBER;

v_undo_autoext BOOLEAN;

v_undo_retention NUMBER(5);

v_undo_guarantee BOOLEAN;

v_instance_number NUMBER;

v_undo_advisor_advice VARCHAR2(100);

v_undo_health_ret NUMBER;

v_problem VARCHAR2(1000);

v_recommendation VARCHAR2(1000);

v_rationale VARCHAR2(1000);

v_retention NUMBER;

v_utbsize NUMBER;

v_best_retention NUMBER;

v_longest_query NUMBER;

v_required_retention NUMBER;

BEGIN

select sysdate into v_cur_dt from dual;

DBMS_OUTPUT.PUT_LINE(CHR(9));

DBMS_OUTPUT.PUT_LINE('- Undo Analysis started at : ' || v_cur_dt || ' -');

DBMS_OUTPUT.PUT_LINE('--------------------------------------------------');

v_undo_info_ret := DBMS_UNDO_ADV.UNDO_INFO(v_undo_tbs_name, v_undo_tbs_size, v_undo_autoext, v_undo_retention, v_undo_guarantee);

select sum(bytes)/1024/1024 into v_cur_undo_mb from dba_data_files where tablespace_name = v_undo_tbs_name;

DBMS_OUTPUT.PUT_LINE('NOTE:The following analysis is based upon the database workload during the period -');

DBMS_OUTPUT.PUT_LINE('Begin Time : ' || v_analyse_start_time);

DBMS_OUTPUT.PUT_LINE('End Time : ' || v_analyse_end_time);

DBMS_OUTPUT.PUT_LINE(CHR(9));

DBMS_OUTPUT.PUT_LINE('Current Undo Configuration');

DBMS_OUTPUT.PUT_LINE('--------------------------');

DBMS_OUTPUT.PUT_LINE(RPAD('Current undo tablespace',55) || ' : ' || v_undo_tbs_name);

DBMS_OUTPUT.PUT_LINE(RPAD('Current undo tablespace size (datafile size now) ',55) || ' : ' || v_cur_undo_mb || 'M');

DBMS_OUTPUT.PUT_LINE(RPAD('Current undo tablespace size (consider autoextend) ',55) || ' : ' || v_undo_tbs_size || 'M');

IF V_UNDO_AUTOEXT THEN

DBMS_OUTPUT.PUT_LINE(RPAD('AUTOEXTEND for undo tablespace is',55) || ' : ON');

ELSE

DBMS_OUTPUT.PUT_LINE(RPAD('AUTOEXTEND for undo tablespace is',55) || ' : OFF');

END IF;

DBMS_OUTPUT.PUT_LINE(RPAD('Current undo retention',55) || ' : ' || v_undo_retention);

IF v_undo_guarantee THEN

DBMS_OUTPUT.PUT_LINE(RPAD('UNDO GUARANTEE is set to',55) || ' : TRUE');

ELSE

dbms_output.put_line(RPAD('UNDO GUARANTEE is set to',55) || ' : FALSE');

END IF;

DBMS_OUTPUT.PUT_LINE(CHR(9));

SELECT instance_number INTO v_instance_number FROM V$INSTANCE;

DBMS_OUTPUT.PUT_LINE('Undo Advisor Summary');

DBMS_OUTPUT.PUT_LINE('---------------------------');

v_undo_advisor_advice := dbms_undo_adv.undo_advisor(v_analyse_start_time, v_analyse_end_time, v_instance_number);

DBMS_OUTPUT.PUT_LINE(v_undo_advisor_advice);

DBMS_OUTPUT.PUT_LINE(CHR(9));

DBMS_OUTPUT.PUT_LINE('Undo Space Recommendation');

DBMS_OUTPUT.PUT_LINE('-------------------------');

v_undo_health_ret := dbms_undo_adv.undo_health(v_analyse_start_time, v_analyse_end_time, v_problem, v_recommendation, v_rationale, v_retention, v_utbsize);

IF v_undo_health_ret > 0 THEN

DBMS_OUTPUT.PUT_LINE('Minimum Recommendation : ' || v_recommendation);

DBMS_OUTPUT.PUT_LINE('Rationale : ' || v_rationale);

DBMS_OUTPUT.PUT_LINE('Recommended Undo Tablespace Size : ' || v_utbsize || 'M');

ELSE

DBMS_OUTPUT.PUT_LINE('Allocated undo space is sufficient for the current workload.');

END IF;

SELECT dbms_undo_adv.best_possible_retention(v_analyse_start_time, v_analyse_end_time) into v_best_retention FROM dual;

SELECT dbms_undo_adv.longest_query(v_analyse_start_time, v_analyse_end_time) into v_longest_query FROM dual;

SELECT dbms_undo_adv.required_retention(v_analyse_start_time, v_analyse_end_time) into v_required_retention FROM dual;

DBMS_OUTPUT.PUT_LINE(CHR(9));

DBMS_OUTPUT.PUT_LINE('Retention Recommendation');

DBMS_OUTPUT.PUT_LINE('------------------------');

DBMS_OUTPUT.PUT_LINE(RPAD('The best possible retention with current configuration is ',60) || ' : ' || v_best_retention || ' Seconds');

DBMS_OUTPUT.PUT_LINE(RPAD('The longest running query ran for ',60) || ' : ' || v_longest_query || ' Seconds');

DBMS_OUTPUT.PUT_LINE(RPAD('The undo retention required to avoid errors is ',60) || ' : ' || v_required_retention || ' Seconds');

END;

/

Sample Output
- Undo Analysis started at : 30/08/2013 11:08:40 -

--------------------------------------------------

NOTE:The following analysis is based upon the database workload during the period -

Begin Time : 23/08/2013 11:08:40

End Time : 30/08/2013 11:08:40

Current Undo Configuration

--------------------------

Current undo tablespace : UNDOTBS2

Current undo tablespace size (datafile size now) : 20M

Current undo tablespace size (consider autoextend) : 20M

AUTOEXTEND for undo tablespace is : ON

Current undo retention : 900

UNDO GUARANTEE is set to : FALSE

Undo Advisor Summary

---------------------------

Finding 1:Undo Tablespace is under pressure. Recommendation 1:Size undo tablespace to 26 MB

Undo Space Recommendation

-------------------------

Minimum Recommendation : Size undo tablespace to 26 MB

Rationale : Increase undo tablespace size so that long running queries will not fail

Recommended Undo Tablespace Size : 26M

Retention Recommendation

------------------------

The best possible retention with current configuration is : 9171 Seconds

The longest running query ran for : 2543 Seconds

The undo retention required to avoid errors is : 2543 Seconds

PL/SQL procedure successfully completed.

9i and below:

SET SERVEROUTPUT ON

SET LINES 600

ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';

DECLARE

v_begin_time varchar2(30);

v_end_time varchar2(30);

v_max_qry_len number;

v_unto_tbs varchar2(100);

v_cur_undo_ret number;

v_cur_undo_mb number;

v_undo_autoext varchar2(5);

v_cur_dt date;

v_recommended_undo_mb number;

v_analyse_start_time date;

v_analyse_end_time date;

BEGIN

select sysdate

into v_cur_dt

from dual;

select sysdate into v_cur_dt from dual;

DBMS_OUTPUT.PUT_LINE(CHR(10));

DBMS_OUTPUT.PUT_LINE('--------------------------------------------------');

DBMS_OUTPUT.PUT_LINE('- Undo Analysis started at : ' || v_cur_dt || ' -');

DBMS_OUTPUT.PUT_LINE('--------------------------------------------------');

SELECT begin_time,end_time into v_analyse_start_time, v_analyse_end_time

FROM v$undostat WHERE undoblks = (SELECT MAX(undoblks) FROM v$undostat);

DBMS_OUTPUT.PUT_LINE('NOTE:The following analysis is based upon the peak database workload during the period -');

DBMS_OUTPUT.PUT_LINE('Begin Time : ' || v_analyse_start_time);

DBMS_OUTPUT.PUT_LINE('End Time : ' || v_analyse_end_time);

select min(BEGIN_TIME), max(end_time) into v_begin_time, v_end_time from v$undostat;

select max(MAXQUERYLEN) into v_max_qry_len from v$undostat;

select value into v_cur_undo_ret from v$parameter where name = 'undo_retention';

select value into v_unto_tbs from v$parameter where name = 'undo_tablespace';

SELECT ROUND((UR * (UPS * DBS))/1024/1024)

INTO v_recommended_undo_mb

FROM

( select max(MAXQUERYLEN) UR

from v$undostat) ,

(SELECT undoblks/((end_time-begin_time)*86400) AS UPS

FROM v$undostat

WHERE undoblks =

(SELECT MAX(undoblks)

FROM v$undostat)),

(SELECT block_size AS DBS

FROM dba_tablespaces

WHERE tablespace_name =

(SELECT UPPER(value)

FROM v$parameter

WHERE name = 'undo_tablespace'));

select sum(bytes)/1024/1024 into v_cur_undo_mb from dba_data_files where tablespace_name = v_unto_tbs;

SELECT CASE(select count(*) from dba_data_files

where tablespace_name = v_unto_tbs

and autoextensible = 'YES')

WHEN 0 THEN 'OFF'

ELSE 'ON' END

into v_undo_autoext

from dual;

DBMS_OUTPUT.PUT_LINE(CHR(10));

DBMS_OUTPUT.PUT_LINE('----');

DBMS_OUTPUT.PUT_LINE(RPAD('Longest running query ran for : ',40) || ' : ' || v_max_qry_len || ' Seconds');

DBMS_OUTPUT.PUT_LINE(RPAD('Current undo retention is ',40) || ' : ' || v_cur_undo_ret || ' Seconds');

DBMS_OUTPUT.PUT_LINE(RPAD('Current undo tablespace size is ',40) || ' : ' || v_cur_undo_mb || 'M');

DBMS_OUTPUT.PUT_LINE(RPAD('AUTOEXTEND for undo tablespace size is ',40) || ' : ' || v_undo_autoext);

DBMS_OUTPUT.PUT_LINE('----');

DBMS_OUTPUT.PUT_LINE(RPAD('Recommended undo retention is ',40) || ' : ' || TO_CHAR(v_max_qry_len+1) || ' Seconds');

DBMS_OUTPUT.PUT_LINE(RPAD('Recommended undo tablespace size is ',40) || ' : ' || v_recommended_undo_mb || 'M');

select sysdate into v_cur_dt from dual;

DBMS_OUTPUT.PUT_LINE(CHR(10));

DBMS_OUTPUT.PUT_LINE('----------------------------------------------------');

DBMS_OUTPUT.PUT_LINE('- Undo Analysis completed at : ' || v_cur_dt || ' -');

DBMS_OUTPUT.PUT_LINE('----------------------------------------------------');

END;

/

--------------------------------------------------

- Undo Analysis started at : 28/08/2013 11:03:23 -

--------------------------------------------------

NOTE:The following analysis is based upon the peak database workload during the period -

Begin Time : 27/08/2013 21:56:36

End Time : 27/08/2013 22:06:36

----

Longest running query ran for : : 1368 Seconds

Current undo retention is : 900 Seconds

Current undo tablespace size is : 10M

AUTOEXTEND for undo tablespace size is : ON

----

Recommended undo retention is : 1369 Seconds

Recommended undo tablespace size is : 43M

----------------------------------------------------

- Undo Analysis completed at : 28/08/2013 11:03:23 -

----------------------------------------------------

PL/SQL procedure successfully completed.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: