Listers,

Ever been asked how much free space you have in the
tablespaces over time? I wrote a tool that tracks and
reports on free space per tablespace over time and
thought I would share it.

It consists of a simple stored procedure that stores
values in a holding table and a report that will tell
you how much each tablespace had over the past week
(you can change the coverage of this report.)

1) Here is the stored procedure:

CREATE OR REPLACE PROCEDURE 
tablespace_proc AS

        v_errmsg varchar2(100);
        v_errcode varchar2(100);
       
BEGIN

        delete dbmon.dbmon_tablespace_stats
        where trunc(record_date) = trunc(sysdate);


INSERT INTO dbmon.dbmon_tablespace_stats
        
        (tablespace_name, 
        total_space, 
        megs_free, 
        max_extent, 
        autoextend,
        record_date)

SELECT
        fs.tablespace_name,
        round(df.total_bytes/1024/1024,0),
        round(fs.bytes_free/1024/1024,0),
        round(fs.max_bytes/1024/1024,0),
        decode(a.tablespace_name,null,'No','Yes'),
        sysdate
FROM
        (SELECT
                tablespace_name,
                SUM(bytes) bytes_free,
                max(bytes) max_bytes
        FROM
                dba_free_space fs
        GROUP BY
                tablespace_name) fs,
        (SELECT
                tablespace_name,
                sum(bytes) total_bytes
        FROM
                dba_data_files
        GROUP BY 
                tablespace_name) df,
        (SELECT DISTINCT
                tablespace_name
        FROM
                dba_data_files
        WHERE
                autoextensible = 'YES') a,
        (select tablespace_name
        from dba_tablespaces) ts
WHERE
        df.tablespace_name = fs.tablespace_name(+)
AND
        df.tablespace_name = a.tablespace_name(+)
AND     
        df.tablespace_name = ts.tablespace_name;

commit;

exception

        when others then
        
        v_errmsg := substr(SQLERRM,1,100);
        v_errcode := SQLCODE;

        insert into dbmon_activity_log
                (activity_date,
                activity_desc,
                procedure_name,
                error_code,
                error_msg,
                error_date)
        values
                (sysdate,
                'tablespace_proc',
                'tablespace_proc',
                v_errcode,
                v_errmsg,
                sysdate);
commit;

end;
/



2) Here is the code to submit it to the job scheduler
(every day at 5AM):

variable jobno number

exec sys.dbms_job.submit(job=>:jobno, what=>'begin
dbmon.dbmon_tablespace_proc;end;',
next_date=>trunc(sysdate+1)+5/24,interval=>'trunc(sysdate+1)+5/24');

3)  and here is the report:


@save_sqlplus_settings

set term off

set head off

spool temp.sql 

select 'col c'||rownum ||' for 999,999,990 head "'|| 
to_char(sysdate+1-rownum,'dd-mon')||'"' 
from dba_tablespaces where rownum<8; 

select 'compute sum of c'||rownum ||' on report'
from dba_tablespaces where rownum<8; 

select 'break on report' from dual; 

spool off 

@temp.sql 

exec dbmon.dbmon_tablespace_proc;

set term on
set lines 135


prompt
prompt Free space per tablespace:
prompt


select tablespace_name, 
        sum(decode(old,7,value)) c7,
        sum(decode(old,6,value)) c6,
        sum(decode(old,5,value)) c5,
        sum(decode(old,4,value)) c4,
        sum(decode(old,3,value)) c3,
        sum(decode(old,2,value)) c2,
        sum(decode(old,1,value)) c1
from
        (select tablespace_name, 
                megs_free value, 
                decode 
                (trunc(record_date),
                trunc(sysdate),1,
                trunc(sysdate)-1,2,
                trunc(sysdate)-2,3,
                trunc(sysdate)-3,4,
                trunc(sysdate)-4,5,
                trunc(sysdate)-5,6,
                trunc(sysdate)-6,7) old
        from 
                dbmon.dbmon_tablespace_stats)
group by tablespace_name
order by 1
/ 

good luck,

Jack


__________________________________________________
Do You Yahoo!?
Yahoo! - Official partner of 2002 FIFA World Cup
http://fifaworldcup.yahoo.com
-- 
Please see the official ORACLE-L FAQ: http://www.orafaq.com
-- 
Author: Jack Silvey
  INET: [EMAIL PROTECTED]

Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
San Diego, California        -- Public Internet access / Mailing Lists
--------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).

Reply via email to