Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Mailing Lists -> Oracle-L -> RE: Monitoring script

RE: Monitoring script

From: Afanassiev, Alex <Alex.Afanassiev_at_team.telstra.com>
Date: Wed, 18 Oct 2000 11:52:50 +1100
Message-Id: <10652.119572@fatcity.com>


This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible.

------_=_NextPart_000_01C0389D.C204F6A0
Content-Type: text/plain

Hi David

Here are couple examples

 <<db_monit.sql>> <<dbreport.sh>> <<sendmail.sh>>

With regards
Alex Afanassiev
Oracle DBA, TOC OPS/Internet.Operations

Tel:	(03) 8 661 20 61
Fax:	(03) 9 650 36 74



> -----Original Message-----
> From: David Turner [SMTP:turner_at_tellme.com]
> Sent: Wednesday, October 18, 2000 10:36 AM
> To: Multiple recipients of list ORACLE-L
> Subject: Monitoring script
>
> Anyone have a good general purpose monitoring script? I am in quite
> a hurry and need a database monitoring script that will send me email
> on various problems related to the DB. I'm only interested in a script
> for unix.
>
> Thanks, Dave Turner
>
> --
> Please see the official ORACLE-L FAQ: http://www.orafaq.com
> --
> Author: David Turner
> INET: turner_at_tellme.com
>
> 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: ListGuru_at_fatcity.com (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).

------_=_NextPart_000_01C0389D.C204F6A0
Content-Type: application/octet-stream;

        name="db_monit.sql"
Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment;

        filename="db_monit.sql"

reM * db_monit.sql  package=20
REM *
REM *

REM =
************************************************************************=
**
REM *                                                                   =
     *
REM *                    MAINTENANCE LOG                                =
     *
REM *                    ---------------                                =
     *
REM *   DATE    WHO             DESCRIPTION                             =
     *

REM * ------- -------------- =
-------------------------------------------  *
REM *   12OCT98 Afanassiev      Created                                 =
     *

REM =
************************************************************************=
**

CREATE OR REPLACE PACKAGE db_monit =20
AS

	PROCEDURE ts_space ( gp_ts_name VARCHAR2,
					gp_next_extent NUMBER,
					gp_measure VARCHAR2);=20
  	PROCEDURE ts_space ( gp_ts_name IN VARCHAR2,
						gp_next_extent NUMBER);
  	PROCEDURE ts_space ( gp_ts_name IN VARCHAR2 );
	PROCEDURE ts_space;
  	PROCEDURE free_space ( gp_ts_name IN VARCHAR2,
							gp_next_extent NUMBER,
							gp_measure VARCHAR2);
  	PROCEDURE free_space ( gp_ts_name IN VARCHAR2,
							gp_next_extent NUMBER);
  	PROCEDURE free_space ( gp_ts_name IN VARCHAR2 );
	PROCEDURE free_space;
  	PROCEDURE get_session;
  	PROCEDURE get_session ( gp_user_name IN VARCHAR2 );
  	PROCEDURE get_lock;
  	PROCEDURE get_lock ( gp_obj_name IN VARCHAR2 );
  	PROCEDURE get_rollback;
	PROCEDURE db_growth;
  	PROCEDURE tab_space ( gp_owner IN VARCHAR2 );
  	PROCEDURE tab_space ( gp_owner IN VARCHAR2, gp_name IN VARCHAR2 );
  	PROCEDURE tab_space ( gp_owner IN VARCHAR2, gp_name IN VARCHAR2 , =
gp_ts_name IN VARCHAR2 );
  	PROCEDURE tabspace ( gp_owner IN VARCHAR2 );
  	PROCEDURE tabspace ( gp_owner IN VARCHAR2, gp_name IN VARCHAR2 );
  	PROCEDURE tabspace ( gp_owner IN VARCHAR2, gp_name IN VARCHAR2 , =
gp_ts_name IN VARCHAR2 );
	PROCEDURE print_head;=20
	PROCEDURE print_tail;

END db_monit;
/
CREATE OR REPLACE PACKAGE BODY db_monit =20 AS=20

GBT NUMBER DEFAULT 1073741824;=20
MBT NUMBER DEFAULT 1048576;=20
KBT NUMBER DEFAULT 1024;=20 PROCEDURE ts_space=20
IS
BEGIN
        ts_space(NULL, NULL, NULL);
END; -- end of ts_space

PROCEDURE ts_space (gp_ts_name VARCHAR2)=20 IS
BEGIN
        ts_space(gp_ts_name, NULL, NULL);
END; -- end of ts_space

PROCEDURE ts_space ( gp_ts_name VARCHAR2,

                gp_next_extent NUMBER )
IS
BEGIN
        ts_space(gp_ts_name, gp_next_extent, NULL); END; -- end of ts_space

PROCEDURE ts_space ( gp_ts_name VARCHAR2,

		gp_next_extent NUMBER,
		gp_measure VARCHAR2)=20

IS
	CURSOR cur_used (p_ts_name VARCHAR2) IS
	select	t.tablespace_name tsname,
		t.next_extent next_ext,
		NVL(SUM(sg.bytes),0) used_bytes,
		NVL(SUM(sg.extents),0) used_extents
	from sys.dba_segments sg,
        sys.dba_tablespaces t
    where t.tablespace_name =3D sg.tablespace_name (+)
	and   t.tablespace_name LIKE DECODE(p_ts_name,
			   NULL, t.tablespace_name ,UPPER(p_ts_name)||'%')
	group by t.tablespace_name, t.next_extent;

	CURSOR cur_total (p_ts_name VARCHAR2) IS
	select SUM(f.bytes) tot_bytes
	from sys.dba_data_files f
	, sys.dba_tablespaces t
	where t.tablespace_name =3D f.tablespace_name
	and   t.tablespace_name =3D p_ts_name
	group by f.tablespace_name;

	CURSOR cur_free (p_ts_name VARCHAR2, p_next_extent NUMBER) IS
	select NVL(SUM(f.bytes),0) tot_bytes,
         --SUM(FLOOR(NVL(SUM(f.bytes),0)/p_next_extent)) tot_ext
         -- the above is valid only when the neigbor. extents are =
coalesed
         SUM(FLOOR(NVL(f.bytes,0)/p_next_extent)) tot_ext
    from sys.dba_free_space f,
        sys.dba_tablespaces t

    where t.tablespace_name =3D f.tablespace_name (+)     and t.tablespace_name =3D p_ts_name     group by f.tablespace_name;

p_next_extent NUMBER(12);
p_ts_next_extent NUMBER(12);

n_tot_ext	NUMBER(6);
n_tot_ext_t	NUMBER(6);
n_tot_gbt	NUMBER(7,3);
n_tot_gbt_t	NUMBER(7,3);
n_usd_ext	NUMBER(6);
n_usd_ext_t	NUMBER(6);
n_usd_bytes	NUMBER(15);
n_total_bytes	NUMBER(15);
n_usd_gbt	NUMBER(7,3);
n_usd_gbt_t	NUMBER(7,3);
n_fre_ext	NUMBER(6);
n_fre_ext_t	NUMBER(6);
n_fre_bytes	NUMBER(15);
n_aval_gbt	NUMBER(7,3);
n_aval_gbt_t	NUMBER(7,3);
n_lost_gbt	NUMBER(7,3);
n_lost_gbt_t	NUMBER(7,3);

p_col1		NUMBER;
p_col2		NUMBER;
p_col3		NUMBER;
p_col4		NUMBER;
p_col_del		VARCHAR2(2);
v_line		VARCHAR2(255);

BEGIN

	v_line :=3D '-';
	p_col_del :=3D ' ';

	n_tot_ext_t :=3D 0;
	n_tot_gbt_t :=3D 0;=20
	n_usd_ext_t :=3D 0;
	n_usd_gbt_t :=3D 0;=20
	n_fre_ext_t :=3D 0;
	n_aval_gbt_t :=3D 0;=20
	n_lost_gbt_t :=3D 0;=20

	p_col1 :=3D 12;
	p_col2 :=3D 6;
	p_col3 :=3D 7;
	p_col4 :=3D 6;

	dbms_output.enable (10000000);

    /* print heading */
	print_head;

	dbms_output.put_line(RPAD(v_line, p_col1 +  3 * p_col2=20
	+ 4 * p_col3 + 3 * p_col4 + 3 * LENGTH(p_col_del),'-'));

	dbms_output.put_line(RPAD('Tablespace', p_col1,' ')||p_col_del||
		RPAD(' Extents', 3 * p_col2 )||p_col_del||=20
		RPAD('  Gbt', 4 * p_col3 )||p_col_del||
		RPAD('  Percent', 3 * p_col4));
	dbms_output.put_line(RPAD('.', p_col1,' ')||p_col_del||
		LPAD('Total', p_col2)|| LPAD('Used', p_col2)||=20
		LPAD('Free', p_col2)|| p_col_del||
		LPAD('Total', p_col3)|| LPAD('Used', p_col3)||=20
		LPAD('Free', p_col3)||=20
		LPAD('Lost', p_col3)||p_col_del||
		LPAD('Used', p_col4)|| LPAD('Free', p_col4)|| =09
		LPAD('Lost', p_col4));
	dbms_output.put_line(RPAD(v_line, p_col1 + 3 * p_col2 +
	4 * p_col3 + 3 * p_col4 + 3 * LENGTH(p_col_del),'-'));

   FOR cur_used_rec IN cur_used (gp_ts_name) LOOP =20

		n_usd_gbt :=3D cur_used_rec.used_bytes / GBT ;
		n_usd_ext :=3D cur_used_rec.used_extents ;

		OPEN  cur_total(cur_used_rec.tsname);
 		FETCH cur_total INTO n_total_bytes;
  		CLOSE cur_total;
		-- set to Gbtytes
		n_tot_gbt :=3D n_total_bytes / GBT;
	                   =20
		IF gp_next_extent IS NULL THEN
			p_next_extent :=3D cur_used_rec.next_ext;=20
		ELSE
			-- already set as a parameter
			NULL;
		END IF;

		OPEN  cur_free(cur_used_rec.tsname, p_next_extent);
 		FETCH cur_free INTO n_fre_bytes, n_fre_ext;
  		CLOSE cur_free;

		n_aval_gbt :=3D (n_fre_ext * p_next_extent) / GBT;
		n_lost_gbt :=3D ( n_fre_bytes / GBT) - n_aval_gbt;

		n_tot_ext :=3D n_usd_ext + n_fre_ext;=20

		dbms_output.put_line(RPAD(cur_used_rec.tsname, p_col1,'.')||
			p_col_del||=20
			LPAD(TO_CHAR(n_tot_ext, '99999'), p_col2)||
			LPAD(TO_CHAR(n_usd_ext, '99999'), p_col2)||
		        LPAD(TO_CHAR(n_fre_ext, '99999'), p_col2)||p_col_del||
		        LPAD(TO_CHAR(n_tot_gbt, '999.99'),p_col3)||
		        LPAD(TO_CHAR(n_usd_gbt, '999.99'),p_col3)||
		        LPAD(TO_CHAR(n_aval_gbt, '999.99'),p_col3)||
		        LPAD(TO_CHAR(n_lost_gbt, '999.99'),p_col3)||p_col_del||
		        LPAD(TO_CHAR( (n_usd_gbt/n_tot_gbt) * 100,'999'),=20
			p_col4)|| =20
		        LPAD(TO_CHAR( (n_aval_gbt/n_tot_gbt) * 100,'999'),=20
			p_col4)||=20
		        LPAD(TO_CHAR( (n_lost_gbt/n_tot_gbt) * 100,'999'),=20
			p_col4)); =20

		n_tot_ext_t :=3D n_tot_ext_t + n_tot_ext;
		n_tot_gbt_t :=3D n_tot_gbt_t + n_tot_gbt;
		n_usd_ext_t :=3D n_usd_ext_t + n_usd_ext;
		n_usd_gbt_t :=3D n_usd_gbt_t + n_usd_gbt;
		n_fre_ext_t :=3D n_fre_ext_t + n_fre_ext;
		n_aval_gbt_t :=3D n_aval_gbt_t + n_aval_gbt;
		n_lost_gbt_t :=3D n_lost_gbt_t + n_lost_gbt;

   END LOOP;
	dbms_output.put_line(RPAD(v_line, p_col1 +  3 * p_col2 + 4 * p_col3 + =
3 * p_col4 + 3 * LENGTH(p_col_del)
								,'-'));
	dbms_output.put_line(RPAD('Total', p_col1,'.')||p_col_del||=20
		                     LPAD(TO_CHAR(n_tot_ext_t, '99999'), p_col2)||
		                     LPAD(TO_CHAR(n_usd_ext_t, '99999'), p_col2)||
		                     LPAD(TO_CHAR(n_fre_ext_t, '99999'), =
p_col2)||p_col_del||
		                     LPAD(TO_CHAR(n_tot_gbt_t, '999.99'),p_col3)||
		                     LPAD(TO_CHAR(n_usd_gbt_t, '999.99'),p_col3)||
		                     LPAD(TO_CHAR(n_aval_gbt_t, '999.99'),p_col3)||
		                     LPAD(TO_CHAR(n_lost_gbt_t, =
'999.99'),p_col3)||p_col_del||
		                     LPAD(TO_CHAR( (n_usd_gbt_t/n_tot_gbt_t) * =
100,'999'), p_col4)|| =20
		                     LPAD(TO_CHAR( (n_aval_gbt_t/n_tot_gbt_t) * =
100,'999'), p_col4)||=20
		                     LPAD(TO_CHAR( (n_lost_gbt_t/n_tot_gbt_t) * =
100,'999'), p_col4)); =20

        dbms_output.put_line(RPAD(v_line, p_col1 + 3 * p_col2 + 4 * p_col3 + = 3 * p_col4 + 3 * LENGTH(p_col_del)

								,'-'));
	dbms_output.put_line('The calculations of free extents, available and =
lost space are based');
	dbms_output.put_line('on the assumption that all existing in the =
database objects as well as');
	dbms_output.put_line('the objects created in the future have the same =
INITIAL and NEXT EXTENT');
	dbms_output.put_line('storage parameters and PCT INCREASE set to 0.');
--	  print_tail;

END; 		-- end ts_space procedure

PROCEDURE tab_space ( gp_owner IN VARCHAR2 ) IS
BEGIN
        tab_space(gp_owner, NULL, NULL);
END; -- end of tab_space

PROCEDURE tab_space ( gp_owner IN VARCHAR2, gp_name IN VARCHAR2 ) IS
BEGIN
        tab_space(gp_owner, gp_name, NULL);
END; -- end of tab_space

PROCEDURE tab_space ( gp_owner IN VARCHAR2, gp_name IN VARCHAR2 , = gp_ts_name IN VARCHAR2 )
IS

	CURSOR cur_tab_space (p_owner VARCHAR2,=20
			p_name VARCHAR2,=09
			p_ts_name VARCHAR2) IS
	SELECT tb.tablespace_name tsname
        , tb.owner towner
        , tb.table_name tname
		, tb.num_rows row_cnt
		, sg.extents ext
        , ((sg.blocks * blk.sz)/MBT) Mgb
        , ((tb.blocks * blk.sz)/MBT) b_mgb
        , ((tb.empty_blocks * blk.sz)/MBT) a_mgb
        , (tb.blocks/sg.blocks) * 100 used_perc
        , (tb.empty_blocks/sg.blocks) * 100 free_perc
	, (((sg.blocks - tb.empty_blocks - 1) * blk.sz)/MBT) hwm_mgb
	, ((sg.blocks - tb.empty_blocks - 1) / sg.blocks)  * 100 hwm_perc
--        , ((tb.avg_space * blk.sz)/MBT ) avg_mgb        =20
        , tb.chain_cnt chain
	FROM  sys.dba_tables tb
	  , sys.dba_segments sg,
	  (select value sz from v$parameter where name =3D 'db_block_size') =
blk
	WHERE tb.table_name =3D sg.segment_name
	AND	tb.owner =3D sg.owner
	AND tb.tablespace_name=20
	LIKE NVL(UPPER(p_ts_name), tb.tablespace_name)||'%'
	AND tb.table_name LIKE NVL(UPPER(p_name), tb.table_name)||'%'
	AND tb.owner LIKE NVL(UPPER(p_owner), tb.owner)||'%'
	ORDER BY b_mgb DESC , tsname, tname;

p_col1		NUMBER;
p_col11		NUMBER;
p_col12		NUMBER;
p_col13		NUMBER;
p_col14		NUMBER;
p_col15		NUMBER;
p_col2		NUMBER;
p_col21		NUMBER;
p_col22		NUMBER;
p_col23		NUMBER;
p_col3		NUMBER;
p_col31		NUMBER;
p_col32		NUMBER;
p_col4		NUMBER;
p_col41		NUMBER;
p_col42		NUMBER;
p_col_del	VARCHAR2(2);
v_line		VARCHAR2(512);

BEGIN

	v_line :=3D '-';
	p_col_del :=3D ' ';

	p_col1 :=3D 9;
	p_col11 :=3D 9;
	p_col12 :=3D 27;
	p_col13 :=3D 9;
	p_col14 :=3D 3;
	p_col15 :=3D 6;
	p_col2 :=3D 24;
	p_col21 :=3D 8;
	p_col22 :=3D 8;
	p_col23 :=3D 8;
	p_col3 :=3D 16;
	p_col31 :=3D 8;
	p_col32 :=3D 8;
	p_col4 :=3D 14;
	p_col41 :=3D 6;
	p_col42 :=3D 8;

	dbms_output.enable (10000000);

    /* print heading */
	print_head;

	dbms_output.put_line(RPAD(v_line, p_col1 + p_col11 + p_col12 + p_col13 =
+=20
		p_col14 + p_col15 +  3 * p_col2 +=20
		3 * p_col3 + 3 * LENGTH(p_col_del) ,'-'));

	dbms_output.put_line(RPAD('TS name', p_col1,' ')||p_col_del||
	                RPAD('Owner', p_col11,' ')||p_col_del||
	                RPAD('Table name', p_col12,' ')||p_col_del||
	                RPAD('Row count', p_col13,' ')||p_col_del||
	                RPAD('Ext', p_col14,' ')||p_col_del||
	                RPAD('Chain', p_col15,' ')||p_col_del||
			LPAD('Mbt', p_col2,' ')||p_col_del||
			LPAD('Perc', p_col3,' ')||p_col_del||
			LPAD('HWM', p_col4,' '));
	dbms_output.put_line(RPAD('.', p_col1,' ')||p_col_del||
        		RPAD('.', p_col11,' ')||p_col_del||
			RPAD('.', p_col12,' ')||p_col_del||
  			RPAD('.', p_col13,' ')||p_col_del||
  			RPAD('.', p_col14,' ')||p_col_del||
  			RPAD('.', p_col15,' ')||p_col_del||
			LPAD('Tot', p_col21,' ')||p_col_del|| =20
			LPAD('Used', p_col22,' ')||p_col_del||  =20
			LPAD('Free', p_col23,' ')||p_col_del|| =20
			LPAD('Used', p_col31,' ')||p_col_del|| =20
			LPAD('Free', p_col32,' ')||p_col_del|| =20
			LPAD('Mbt', p_col41,' ')||p_col_del|| =20
			LPAD('Perc', p_col42,' ')); =20

	dbms_output.put_line(RPAD(v_line, p_col1 + p_col11 + p_col12 + p_col13 =
+                p_col14 + p_col15 +  3 * p_col2 +=20
		p_col4 + p_col3 + 3 * LENGTH(p_col_del) ,'-'));

   FOR cur_tab_space_rec IN cur_tab_space (gp_owner, gp_name, = gp_ts_name) LOOP =20

	dbms_output.put_line(=20
		RPAD(cur_tab_space_rec.tsname, p_col1,'.')||p_col_del||
	        RPAD(cur_tab_space_rec.towner, p_col11,' ')||p_col_del||
	        RPAD(cur_tab_space_rec.tname, p_col12,' ')||p_col_del||
	        LPAD(cur_tab_space_rec.row_cnt, p_col13,' ')||p_col_del||
	        LPAD(cur_tab_space_rec.ext, p_col14,' ')||p_col_del||
	        LPAD(cur_tab_space_rec.chain, p_col15,' ')||p_col_del||
	LPAD(TO_CHAR(cur_tab_space_rec.Mgb, '9999.999'), p_col21)||
	LPAD(TO_CHAR(cur_tab_space_rec.b_mgb, '9999.999'), p_col22)||
        LPAD(TO_CHAR(cur_tab_space_rec.a_mgb, '9999.999'), p_col23)||
        LPAD(TO_CHAR(cur_tab_space_rec.used_perc, '999.99'), p_col31)||
       LPAD(TO_CHAR(cur_tab_space_rec.free_perc, '999.99'), p_col32)||
        LPAD(TO_CHAR(cur_tab_space_rec.hwm_mgb, '999.9999'),p_col41)||
        LPAD(TO_CHAR(cur_tab_space_rec.hwm_perc, '999.99'),p_col42)
--	p_col_del
--	-- || LPAD(TO_CHAR(cur_tab_space_rec.avg_mgb, '999.99'),p_col4)
		);

   END LOOP;

	dbms_output.put_line(RPAD(v_line, p_col1 + p_col11 + p_col12 + p_col13 =
+                p_col14 + p_col15 +  3 * p_col2 +=20
		p_col4 + p_col3 + 3 * LENGTH(p_col_del) ,'-'));


END; -- end of tab_space

PROCEDURE tabspace ( gp_owner IN VARCHAR2, gp_name IN VARCHAR2 ) IS
BEGIN
        tabspace(gp_owner, gp_name, NULL);
END; -- end of tab_space

PROCEDURE tabspace ( gp_owner IN VARCHAR2, gp_name IN VARCHAR2 , = gp_ts_name IN VARCHAR2 )
IS

        CURSOR cur_tab_space (p_owner VARCHAR2,=20
			p_name VARCHAR2,=09
			p_ts_name VARCHAR2) IS
	SELECT sg.tablespace_name tsname
        , sg.owner towner
        , sg.segment_name tname
        , sg.segment_type ttype
	, sg.extents ext
        , sg.blocks  blk
	, DECODE(sg.extents, 1, sg.initial_extent, sg.next_extent) ext_size
	FROM  sys.dba_segments sg
	WHERE sg.tablespace_name=20
	LIKE NVL(UPPER(p_ts_name), sg.tablespace_name)||'%'
	AND sg.segment_name LIKE NVL(UPPER(p_name), sg.segment_name)||'%'
	AND sg.owner LIKE NVL(UPPER(p_owner), sg.owner)||'%'
	ORDER BY tsname, tname;

p_col1		NUMBER:=3D20;
p_col11		NUMBER:=3D27;
p_col12		NUMBER:=3D27;
p_col13		NUMBER:=3D55;
p_col_del	VARCHAR2(2):=3D' ';
v_line		VARCHAR2(512):=3D'-';

v_block_size NUMBER:=3D0;
v_segment_type VARCHAR2(30):=3D'TABLE';
v_total_blocks NUMBER;
v_total_bytes NUMBER;
v_unused_blocks NUMBER;
v_unused_bytes NUMBER;
v_last_used_extent_file_id NUMBER;
v_last_used_extent_block_id NUMBER;

v_last_used_block NUMBER;
v_free_blks NUMBER;

BEGIN         dbms_output.enable (10000000);

    /* print heading */

        print_head;

	dbms_output.put_line(RPAD(v_line, p_col1 + p_col11 + p_col12 +
		+ 3 * LENGTH(p_col_del) ,'-'));

   FOR cur_tab_space_rec IN cur_tab_space (gp_owner, gp_name, = gp_ts_name) LOOP =20

       dbms_space.unused_space (
	       cur_tab_space_rec.towner,
	       cur_tab_space_rec.tname,=20
	       v_segment_type,
               v_total_blocks, v_total_bytes,
               v_unused_blocks, v_unused_bytes,
               v_last_used_extent_file_id, v_last_used_extent_block_id,
               v_last_used_block);

	-- block size
       IF v_block_size =3D 0 THEN=20
	  v_block_size :=3D v_total_bytes / v_total_blocks;=20
       END IF;

       dbms_space.free_blocks(
	       cur_tab_space_rec.towner,
	       cur_tab_space_rec.tname,=20
               v_segment_type,
               0,
               v_free_blks,
               null
               );
 =20
	dbms_output.put_line(=20
		RPAD('Tablespace', p_col13,' ')||' =3D '||cur_tab_space_rec.tsname);

	dbms_output.put_line(=20
	        RPAD('Owner', p_col13,' ')||' =3D '|| =
cur_tab_space_rec.towner);
	dbms_output.put_line(=20
	        RPAD('Segment name', p_col13,' ')||' =3D =
'||cur_tab_space_rec.tname);
	dbms_output.put_line(
		RPAD('Block size' , p_col13)||' =3D '||
             to_char ( v_block_size ));

	dbms_output.put_line(
		RPAD('Extents' , p_col13)||' =3D '||
             to_char ( cur_tab_space_rec.ext ));

        dbms_output.put_line(
		RPAD('Total number of blocks (bytes) in the extent', p_col13)
                    ||' =3D '||(cur_tab_space_rec.ext_size/v_block_size =
)
		    ||'('||cur_tab_space_rec.ext_size||')');

        dbms_output.put_line(
		RPAD('Total number of blocks (bytes) in the segment', p_col13)
                    ||' =3D =
'||v_total_blocks||'('||v_total_bytes||')');
        dbms_output.put_line(
		RPAD('Number of blocks (bytes) above high water mark', p_col13)
                    ||' =3D =
'||v_unused_blocks||'('||v_unused_bytes||')');
        dbms_output.put_line(
		RPAD('The file ID of the last extent which contains data', p_col13)
                    ||' =3D '||v_last_used_extent_file_id);
        dbms_output.put_line(
		RPAD('The block ID of the last extent which contains data', p_col13)  =
=20
                    ||' =3D '||v_last_used_extent_block_id);
	dbms_output.put_line(
		RPAD('The last block within this extent which contains data', =
p_col13)=20
                    ||' =3D '||v_last_used_block);
	dbms_output.put_line(
		RPAD('Number of free blocks under high water mark', p_col13)
                           ||' =3D '||v_free_blks);
	dbms_output.put_line(
		RPAD('Number of used blocks under high water mark', p_col13)=20
                   ||' =3D =
'||to_char(v_total_blocks-v_unused_blocks-v_free_blks));
	dbms_output.put_line(
		RPAD('Total used space (%)' , p_col13)||' =3D '||
             to_char ((v_free_blks/v_total_blocks) * 100 ));

	dbms_output.put_line(RPAD(v_line, p_col1 + p_col11 + p_col12 +
		+ 3 * LENGTH(p_col_del) ,'-'));

   END LOOP;    EXCEPTION

        WHEN NO_DATA_FOUND then
             dbms_output.put_line('No data found for specified =
criteria');
        WHEN OTHERS THEN
             dbms_output.put_line(SQLERRM||' found');

END; -- end of tab_space

PROCEDURE free_space=20
IS
BEGIN
        free_space(NULL, NULL, NULL);
END; =20 PROCEDURE free_space (gp_ts_name VARCHAR2)=20 IS
BEGIN
        free_space(gp_ts_name, NULL, NULL);
END; =20 PROCEDURE free_space (gp_ts_name VARCHAR2,

                                                gp_next_extent NUMBER)=20
IS
BEGIN
        free_space(gp_ts_name, gp_next_extent, NULL); END; =20 PROCEDURE free_space ( gp_ts_name VARCHAR2,

					gp_next_extent NUMBER,
					gp_measure VARCHAR2 )=20

IS
	CURSOR cur_free (p_ts_name VARCHAR2, p_next_extent NUMBER) IS
	select=20
		f.tablespace_name tsname
		, (NVL(p_next_extent, t.next_extent)/MBT) next_ext
		, f.file_id fl_id
		, f.block_id blk_id     =20
		, ( f.block_id + NVL(f.blocks,0) ) next_blk_id
		, (NVL(SUM(f.bytes),0))/MBT free  =20
		, ( FLOOR(NVL(SUM(f.bytes),0)/NVL(p_next_extent, t.next_extent))=20
			* NVL(p_next_extent, t.next_extent) / MBT ) aval          =20
		, FLOOR(NVL(SUM(f.bytes),0)/NVL(p_next_extent, t.next_extent))  =
aval_ext
	from sys.dba_free_space f,
	sys.dba_tablespaces t
	where t.tablespace_name =3D f.tablespace_name (+)
	and   t.tablespace_name =3D NVL(p_ts_name, t.tablespace_name)
	group by f.tablespace_name, f.file_id, f.block_id, f.blocks, =
t.next_extent;=20

p_next_extent NUMBER(12);

n_free_t		NUMBER(9,3);
n_aval_t		NUMBER(9,3);
n_aval_ext_t	NUMBER(7);
n_lost			NUMBER(9,3);
n_lost_t		NUMBER(9,3);

p_col1		NUMBER;
p_col2		NUMBER;
p_col3		NUMBER;
p_col4		NUMBER;
p_col5		NUMBER;
p_col6		NUMBER;
p_col7		NUMBER;
p_col8		NUMBER;
p_col9		NUMBER;
p_col_cnt		NUMBER;

p_col_del		VARCHAR2(2);
v_line		VARCHAR2(255);

BEGIN
	dbms_output.enable (10000000);

	-- print parameters
	dbms_output.put_line('Tablespace is '||NVL(gp_ts_name,'ALL'));         =
 =20

    dbms_output.put_line(NVL(TO_CHAR(gp_next_extent), 'tablespace = ')||gp_measure||

						' NEXT EXTENT size will be used to estimate available'||
						' and lost space ');

	v_line :=3D '-';
	p_col_del :=3D ' ';

	n_free_t :=3D 0;
	n_lost_t :=3D 0;
	n_aval_t :=3D 0;
	n_aval_ext_t :=3D 0;=09

	p_col1 :=3D 12;
	p_col2 :=3D 6;
	p_col3 :=3D 7;
	p_col4 :=3D 7;
	p_col5 :=3D 7;
	p_col6 :=3D 8;
	p_col7 :=3D 8;
	p_col8 :=3D 6;
	p_col9 :=3D 8;
	p_col_cnt :=3D 9;

    /* print heading */
	print_head;

	dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 + =
p_col5 + p_col6=20
			+ p_col7 + p_col8 + p_col9 + p_col_cnt * LENGTH(p_col_del) - =
1,'-'));
	dbms_output.put_line(RPAD('Tablespace', p_col1,' ')||p_col_del||
					RPAD('Next Ext', p_col2 )||p_col_del|| RPAD('File Id', p_col3 =
)||p_col_del||
					RPAD('Blk Id', p_col4 )||p_col_del|| RPAD('Nxt Blk Id', p_col5 =
)||p_col_del||
					RPAD('Free Mbt', p_col6 )||p_col_del|| RPAD('Avl Mbt', p_col7 =
)||p_col_del||
					RPAD('Avl Ext', p_col8 )|| p_col_del|| RPAD('Lost Mbt', p_col9));

   FOR cur_free_rec IN cur_free (gp_ts_name, p_next_extent ) LOOP =20

			n_free_t :=3D n_free_t + cur_free_rec.free;
			n_aval_t :=3D n_aval_t + cur_free_rec.aval;
			n_lost_t :=3D n_lost_t + n_lost;
			n_aval_ext_t :=3D n_aval_ext_t + cur_free_rec.aval_ext;

   END LOOP;         dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 + = p_col5 + p_col6=20

                        + p_col7 + p_col8 + p_col9 + p_col_cnt * LENGTH(p_col_del) - = 1,'-'));

		dbms_output.put_line( RPAD('Total',p_col1,'.')||p_col_del||=20
		                     LPAD(TO_CHAR(0, '99999'), p_col2)||p_col_del||=20
		                     LPAD(TO_CHAR(0,'99999'), p_col3)||p_col_del||=20
		                     LPAD(TO_CHAR(0,'99999'), p_col4)||p_col_del||=20
		                     LPAD(TO_CHAR(0,'99999'), p_col5)||p_col_del||=20
		                     LPAD(TO_CHAR(n_free_t,'99999.99'), =
p_col6)||p_col_del||=20
		                     LPAD(TO_CHAR(n_aval_t,'99999.99'), =
p_col7)||p_col_del||=20
		                     LPAD(TO_CHAR(n_aval_ext_t,'99999'), =
p_col8)||p_col_del||  =20
		                     LPAD(TO_CHAR(n_lost_t,'99999.99'), p_col9)); =20

	dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 + =
p_col5 + p_col6=20
			+ p_col7 + p_col8 + p_col9 + p_col_cnt * LENGTH(p_col_del) - =
1,'-'));

        dbms_output.put_line('The calculations of free extents, available and = lost space are based');

        dbms_output.put_line('on the assumption that all existing in the = database objects as ');

        dbms_output.put_line('well as the objects created in the future have = the same INITIAL and ');

        dbms_output.put_line('NEXT EXTENT storage parameters and PCT INCREASE = set to 0.');
-- print_tail;

	EXCEPTION
		WHEN NO_DATA_FOUND then
				dbms_output.put_line('No data found for specified criteria');
		WHEN OTHERS THEN
				dbms_output.put_line(SQLERRM||' found');

END;=20 PROCEDURE db_growth=20
IS

	CURSOR cur_growth IS
	SELECT 'date_recorded' recorded,=20
		12 tot
	FROM dual;
	--FROM segments_hist
	--GROUP BY date_recorded
	--UNION
	--SELECT SYSDATE recorded,=20
	--		SUM(bytes) tot
	--FROM sys.dba_segments;


n_bytes			NUMBER(15);
n_max			NUMBER(15);
n_ratio 		NUMBER(16,3);

p_col1		NUMBER;
p_col2		NUMBER;
p_col3		NUMBER;
p_col4		NUMBER;
p_col_cnt		NUMBER;

p_col_del		VARCHAR2(2);
v_line			VARCHAR2(255);
v_scale			VARCHAR2(255);

SCALE_SIZE NUMBER DEFAULT 100;=20
FILLER CHAR(1) DEFAULT '.';=20 BEGIN
        dbms_output.enable (10000000);

	v_line :=3D '-';
	v_scale :=3D FILLER;
	p_col_del :=3D ' ';

	n_bytes :=3D 0;
	n_max	:=3D 0;
	n_ratio :=3D 0;

	p_col1 :=3D 9;
	p_col2 :=3D 8;
	p_col3 :=3D 7;
	p_col4 :=3D 8;
	p_col_cnt :=3D 4;

    /* print heading */
	print_head;

	dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4=20
			 + p_col_cnt * LENGTH(p_col_del) - 1,'-'));

	dbms_output.put_line(RPAD('Recorded ', p_col1,' ')||p_col_del||
					RPAD(' Tot Mbt', p_col2 )||p_col_del|| RPAD('Tot Gbt', p_col3 =
)||p_col_del||
					RPAD('Incrs Gbt', p_col4 ));

   FOR cur_growth_rec IN cur_growth  LOOP =20
		dbms_output.put_line( RPAD(cur_growth_rec.recorded, =
p_col1,'.')||p_col_del||=20
		                     LPAD(TO_CHAR(cur_growth_rec.tot / MBT, =
'99999.99'), p_col2)||p_col_del||=20
		                     LPAD(TO_CHAR(cur_growth_rec.tot / =
GBT,'9999.99'), p_col3)||p_col_del||=20
		                     LPAD(TO_CHAR( (cur_growth_rec.tot  - n_bytes ) / =
GBT ,'99999.99'), p_col4) );
		IF cur_growth_rec.tot > n_max THEN=20
			n_max :=3D cur_growth_rec.tot;
		END IF;
		n_bytes  :=3D cur_growth_rec.tot;

   END LOOP;
	dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4=20
			 + p_col_cnt * LENGTH(p_col_del) ,'-'));

	--dbms_output.put_line ('n_max '||n_max);
	--dbms_output.put_line ('SCALE_SIZE'||SCALE_SIZE);
	n_ratio :=3D n_max / SCALE_SIZE;
	--dbms_output.put_line (n_ratio);

	dbms_output.put_line(RPAD('Recorded ', p_col1,' ')||p_col_del||
					RPAD(' Tot Gbt', p_col2 ));
   FOR cur_growth_rec IN cur_growth  LOOP =20
		dbms_output.put_line( RPAD(cur_growth_rec.recorded, =
p_col1,'.')||p_col_del||=20
		             RPAD(v_scale, (ROUND(cur_growth_rec.tot / n_ratio) - 1 =
), FILLER  )||
					 TO_CHAR(cur_growth_rec.tot / GBT, '999.99'));
   END LOOP;         dbms_output.put_line(RPAD(v_line, SCALE_SIZE + p_col1 + p_col3 ,'-'));
	EXCEPTION
		WHEN OTHERS THEN
				dbms_output.put_line(SQLERRM||' found');

END;=20 PROCEDURE get_session=20
IS
BEGIN
        get_session(NULL);
END; =20 PROCEDURE get_session ( gp_user_name IN VARCHAR2 ) IS

	CURSOR cur_session (p_user_name VARCHAR2 ) IS
	SELECT=20
		 s.sid  session_id=20
		, SUBSTR(s.username,1,12)  user_name
		, s.status
		, SUBSTR(s.schemaname,1,10) schema_name
		, s.osuser=20
		, s.process  os_pid =20
		, SUBSTR(s.machine,1,6)  machine
		, s.terminal
		, SUBSTR(LTRIM(s.program),1,28) image
	  	--, TO_CHAR(SYSDATE - (t.hsecs - ss.value)/(24*3600*100),
       		-- 'DD-MON') connect_date
	  	, TO_CHAR( s.logon_time,'DD-MON') connect_date
		--, TO_CHAR(SYSDATE - (t.hsecs - ss.value)/(24*3600*100),
       		 --'HH24:MI:SS') connect_time
		, TO_CHAR(s.logon_time, 'HH24:MI:SS') connect_time
		, s.lockwait=20
		, s.serial#=20
	FROM v$session s
     	-- , v$sesstat ss,
      	--v$sysstat st,
 	 -- 	v$timer t =20
	WHERE s.USERNAME like UPPER(NVL(p_user_name, s.USERNAME))||'%'
	--AND st.statistic# =3D ss.statistic#
	--AND   ss.sid =3D s.sid
	--AND   st.name =3D 'session connect time'
	ORDER BY user_name, connect_time;=20

p_col1		NUMBER;
p_col2		NUMBER;
p_col3		NUMBER;
p_col4		NUMBER;
p_col5		NUMBER;
p_col6		NUMBER;
p_col7		NUMBER;
p_col8		NUMBER;
p_col9		NUMBER;
p_col10		NUMBER;
p_col11		NUMBER;
p_col_cnt		NUMBER;

v_line		VARCHAR2(255) DEFAULT '-';
p_col_del	VARCHAR2(2) DEFAULT ' ';
v_connect_date	VARCHAR2(25);


BEGIN
	dbms_output.enable (10000000);

	p_col1 :=3D 12;
	p_col2 :=3D 3;
	p_col3  :=3D 17;
	p_col4 :=3D 8;
	p_col5 :=3D 10;
	p_col6 :=3D 7;
	p_col7 :=3D 9;
	p_col8 :=3D 8;
	p_col9 :=3D 11;
	p_col10 :=3D 28;
	p_col11 :=3D 8;

	p_col_cnt :=3D 11;

    /* print heading */
	print_head;

	dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 + =
p_col5 +=20
							p_col6 + p_col7 + p_col8 + p_col9 + p_col10 + p_col11=20
			 				+ p_col_cnt * LENGTH(p_col_del) - 1,'-'));

	dbms_output.put_line(LPAD('User Name  ', p_col1,' ')||p_col_del||
					LPAD('SID', p_col2 )||p_col_del||=20
					RPAD('Connected time', p_col3 )||p_col_del||
					RPAD('Status', p_col4 )||p_col_del||
					RPAD('Shema Name', p_col5 )||p_col_del||=20
					RPAD('OS user', p_col6 )||p_col_del||
					RPAD('OSpid', p_col7 )||p_col_del|| RPAD('Machine', p_col8 =
)||p_col_del||
					RPAD('Terminal', p_col9 )||p_col_del|| RPAD('Program', p_col10 =
)||p_col_del||
					RPAD('LockWait', p_col11 ));

	dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 + =
p_col5 +=20
							p_col6 + p_col7 + p_col8 + p_col9 + p_col10 + p_col11=20
			 				+ p_col_cnt * LENGTH(p_col_del) - 1,'-'));

   FOR cur_session_rec IN cur_session (gp_user_name)  LOOP =20
		IF cur_session_rec.connect_date =3D TO_CHAR(SYSDATE, 'DD-MON') THEN=20
   			v_connect_date :=3D NULL;
		ELSE
   			v_connect_date :=3D ' '||cur_session_rec.connect_date;
		END IF;
		dbms_output.put_line( RPAD(cur_session_rec.user_name, =
p_col1)||p_col_del||=20
		                      LPAD(TO_CHAR(cur_session_rec.session_id), =
p_col2)||p_col_del||=20
		                      RPAD(cur_session_rec.connect_time || ' =
'||v_connect_date
									, p_col3)||p_col_del||=20
		                      RPAD(NVL(cur_session_rec.status, 'UNKNOWN'), =
p_col4)||p_col_del||=20
		                      RPAD(NVL(cur_session_rec.schema_name, =
'UNKNOWN'), p_col5)||p_col_del||=20
		                      RPAD(NVL(cur_session_rec.osuser, 'UNKNOWN'),  =
p_col6)||p_col_del||=20
		                      RPAD(NVL(cur_session_rec.os_pid , 'UNKNOWN'), =
p_col7)||p_col_del||=20
		                      RPAD(NVL(cur_session_rec.machine, 'UNKNOWN'), =
p_col8)||p_col_del||=20
		                      RPAD(NVL(cur_session_rec.terminal, 'UNKNOWN'), =
p_col9)||p_col_del||=20
		                      RPAD(NVL(cur_session_rec.image , 'UNKNOWN'), =
p_col10)||p_col_del||=20
		                      RPAD(NVL(cur_session_rec.lockwait, 'UNKNOWN'), =
p_col11));

   END LOOP;    dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 = + p_col5 +=20

							p_col6 + p_col7 + p_col8 + p_col9 + p_col10 + p_col11=20
		 				+ p_col_cnt * LENGTH(p_col_del) - 1,'-'));

   FOR cur_session_rec IN cur_session (gp_user_name)  LOOP =20
		IF cur_session_rec.connect_date =3D TO_CHAR(SYSDATE, 'DD-MON') THEN=20
   			v_connect_date :=3D NULL;
		ELSE
   			v_connect_date :=3D ' '||cur_session_rec.connect_date;
		END IF;
		dbms_output.put_line('Execute --->   ALTER SYSTEM KILL SESSION =
'''||cur_session_rec.session_id||','||
					cur_session_rec.serial#||''';' ||
		               '     - to kill '||cur_session_rec.user_name||' =
(session id: '||=20
	                   TO_CHAR(cur_session_rec.session_id)||') connected =
at '||=20
		                      cur_session_rec.connect_time ||v_connect_date); =

   END LOOP;

	dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4=20
	                           + p_col5 + p_col6 + p_col7 + p_col8=20
	                           + p_col9 + p_col10 + p_col11=20
			 + p_col_cnt * LENGTH(p_col_del) - 1,'-'));

--	  print_tail;

	EXCEPTION
		WHEN OTHERS THEN
				dbms_output.put_line(SQLERRM||' found');

END; =20 PROCEDURE get_lock =20
IS
BEGIN
        get_lock(NULL);
END; =20 PROCEDURE get_lock ( gp_obj_name IN VARCHAR2 ) IS

	CURSOR cur_lock (p_obj_name VARCHAR2 ) IS
	SELECT	DISTINCT=20
			SUBSTR(s.username,1,12) user_name,=20
			--lc.sid ses_id, =09
			lc.session_id ses_id, =09
			SUBSTR(NVL(obj.object_name, rn.name), 1,25) obj_name,
			SUBSTR(LTRIM(s.program),1,30) image ,
 			--SUBSTR(lc.type,1,26) a_lock_type,
			--SUBSTR(lc.lmode,1,13) a_mode_held,
			--SUBSTR(lc.request,1,13) a_mode_requested
        	SUBSTR(lc.lock_type,1,26) a_lock_type,
            SUBSTR(lc.mode_held,1,13) a_mode_held,
            SUBSTR(lc.mode_requested,1,13) a_mode_requested
			FROM sys.dba_objects obj,=20
				dba_locks lc,
				--v$lock lc,
				v$rollname rn,
				v$session s
			--WHERE  obj.object_id (+)   =3D lc.id1=20
			WHERE  obj.object_id (+)   =3D lc.lock_id1=20
			--AND lc.sid =3D s.sid=20
			AND lc.session_id =3D s.sid=20
			--AND trunc(lc.id1 / 65536)=3D rn.usn
			AND trunc(lc.lock_id1 / 65536)=3D rn.usn
			AND ( (  obj.object_name LIKE UPPER(NVL(p_obj_name, =
obj.object_name))||'%'
			AND obj.owner not in ('SYS','SYSTEM') )=20
			OR obj.object_name is NULL )=20
			AND s.schemaname !=3D 'SYS'
			--ORDER BY lc.sid
			ORDER BY lc.session_id;

	CURSOR cur_waiters (p_obj_name VARCHAR2 ) IS
	SELECT	SUBSTR(s.username,1,12) user_name,=20
			lc.session_id ses_id, =09
			SUBSTR(NVL(obj.object_name, rn.usn), 1,25) obj_name,
			SUBSTR(LTRIM(s.program),1,30) image ,
 			SUBSTR(lc.lock_type,1,26) a_lock_type,
			SUBSTR(lc.mode_held,1,13) a_mode_held,
			SUBSTR(lc.mode_requested,1,13) a_mode_requested
			FROM sys.dba_objects obj,=20
				dba_locks lc,
				v$rollname rn,
				v$session s
			WHERE  obj.object_id (+)   =3D lc.lock_id1=20
			AND lc.session_id =3D s.sid=20
			AND trunc(obj.object_id / 65536)=3D rn.usn
			AND ( (  obj.object_name LIKE UPPER(NVL(p_obj_name, =
obj.object_name))||'%'
			AND obj.owner not in ('SYS','SYSTEM') )=20
			OR obj.object_name is NULL )=20
			AND s.schemaname !=3D 'SYS'
			--AND lc.mode_requested  !=3D NULL
			AND lc.mode_requested  !=3D 'None'=20
			ORDER BY lc.session_id;

p_col1		NUMBER;
p_col2		NUMBER;
p_col3		NUMBER;
p_col4		NUMBER;
p_col5		NUMBER;
p_col6		NUMBER;
p_col7		NUMBER;
p_col8		NUMBER;
p_col9		NUMBER;
p_col10		NUMBER;
p_col11		NUMBER;
p_col_cnt		NUMBER;

v_line		VARCHAR2(255) DEFAULT '-';
p_col_del	VARCHAR2(2) DEFAULT ' ';
v_connect_date	VARCHAR2(25);

b_found BOOLEAN;

BEGIN
        dbms_output.enable (10000000);

	p_col1 :=3D 12;
	p_col2 :=3D 3;
	p_col3  :=3D 25;
	p_col4 :=3D 30;
	p_col5 :=3D 26;
	p_col6 :=3D 13;
	p_col7 :=3D 13;

	p_col_cnt :=3D 8;

    /* print heading */
	print_head;

	b_found :=3D FALSE;


   FOR cur_lock_rec IN cur_lock (gp_obj_name)  LOOP =20
		IF b_found =3D FALSE THEN
			dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 =
+ p_col5 + p_col6 + p_col7=20
			 				+ p_col_cnt * LENGTH(p_col_del) - 1,'-'));

			dbms_output.put_line(LPAD('User Name  ', p_col1,' ')||p_col_del||' =
'||
					LPAD('SID', p_col2 )||p_col_del||=20
					RPAD('Object', p_col3 )||p_col_del||
					RPAD('Program', p_col4 )||p_col_del||
					RPAD('Type', p_col5 )||p_col_del||=20
					RPAD('Mode held', p_col6 )||p_col_del||
					RPAD('Mode reqs.', p_col7 ));

			dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 =
+ p_col5 + p_col6 + p_col7=20
			 				+ p_col_cnt * LENGTH(p_col_del) - 1,'-'));
			b_found :=3D TRUE;         =20
		END IF;
		dbms_output.put_line( RPAD(NVL(cur_lock_rec.user_name, 'UNKNOWN'), =
p_col1)||p_col_del||=20
		                      LPAD(TO_CHAR(cur_lock_rec.ses_id), =
p_col2)||p_col_del||=20
		                      RPAD(NVL(cur_lock_rec.obj_name,'UNKNOWN'), =
p_col3)||p_col_del||=20
		                      RPAD(NVL(cur_lock_rec.image, 'UNKNOWN'), =
p_col4)||p_col_del||=20
		                      RPAD(NVL(cur_lock_rec.a_lock_type, 'UNKNOWN'), =
p_col5)||p_col_del||=20
		                      RPAD(NVL(cur_lock_rec.a_mode_held, 'UNKNOWN'),  =
p_col6)||p_col_del||=20
		                      RPAD(NVL(cur_lock_rec.a_mode_requested, =
'UNKNOWN'), p_col7));

   END LOOP;

	IF b_found =3D TRUE THEN
		dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 + =
p_col5 + p_col6 + p_col7=20
			 				+ p_col_cnt * LENGTH(p_col_del) - 1,'-'));
	ELSE=20
   		dbms_output.put_line('No locks found');=20
	END IF;

	b_found :=3D FALSE;

   FOR cur_lock_rec IN cur_waiters (gp_obj_name) LOOP =20

		IF b_found =3D FALSE THEN
   			dbms_output.put_line('Session(s) waiting for lock');=20

			dbms_output.put_line(LPAD('User Name  ', p_col1,' ')||p_col_del||' =
'||
					LPAD('SID', p_col2 )||p_col_del||=20
					RPAD('Object', p_col3 )||p_col_del||
					RPAD('Program', p_col4 )||p_col_del||
					RPAD('Type', p_col5 )||p_col_del||=20
					RPAD('Mode held', p_col6 )||p_col_del||
					RPAD('Mode reqs.', p_col7 ));

			dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 =
+ p_col5=20
					+ p_col6 + p_col7 + p_col_cnt * LENGTH(p_col_del) - 1,'-'));
			b_found :=3D TRUE;
		END IF;

		dbms_output.put_line( RPAD(NVL(cur_lock_rec.user_name, 'UNKNOWN'), =
p_col1)||p_col_del||=20
		                      LPAD(TO_CHAR(cur_lock_rec.ses_id), =
p_col2)||p_col_del||=20
		                      RPAD(NVL(cur_lock_rec.obj_name,'UNKNOWN'), =
p_col3)||p_col_del||=20
		                      RPAD(NVL(cur_lock_rec.image, 'UNKNOWN'), =
p_col4)||p_col_del||=20
		                      RPAD(NVL(cur_lock_rec.a_lock_type, 'UNKNOWN'), =
p_col5)||p_col_del||=20
		                      RPAD(NVL(cur_lock_rec.a_mode_held, 'UNKNOWN'),  =
p_col6)||p_col_del||=20
		                      RPAD(NVL(cur_lock_rec.a_mode_requested, =
'UNKNOWN'), p_col7));

   END LOOP;

	IF b_found =3D FALSE THEN
		dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 + =
p_col5 + p_col6 + p_col7=20
			 				+ p_col_cnt * LENGTH(p_col_del) - 1,'-'));
	ELSE=20
   		dbms_output.put_line('No waiting for the lock tansatctios found'); =

	END IF;

--	  print_tail;

	EXCEPTION
		WHEN OTHERS THEN
				dbms_output.put_line(SQLERRM||' found');

END; =20 PROCEDURE get_rollback
IS

	CURSOR cur_rollback IS
	SELECT  SUBSTR(rs.tablespace_name,1,12) tspace,
        SUBSTR(name,1,12) rb_name,
        extents ext,
        rssize/(1024*1024) sizeMbt,
        optsize/(1024*1024) optMbt,
        shrinks,
        aveshrink/1024 avrKbt,
        wraps,
        extends
	FROM V$ROLLSTAT vs,
    	V$ROLLNAME vr,
   		 sys.dba_rollback_segs rs
	WHERE vs.usn =3D vr.usn
	AND   name =3D rs.segment_name
	AND   rs.tablespace_name !=3D 'SYSTEM'
	ORDER BY rs.tablespace_name, rb_name;


p_col1		NUMBER;
p_col2		NUMBER;
p_col3		NUMBER;
p_col4		NUMBER;
p_col5		NUMBER;
p_col6		NUMBER;
p_col7		NUMBER;
p_col8		NUMBER;
p_col9		NUMBER;
p_col10		NUMBER;
p_col11		NUMBER;
p_col_cnt		NUMBER;

v_line		VARCHAR2(255) DEFAULT '-';
p_col_del	VARCHAR2(2) DEFAULT ' ';
v_connect_date	VARCHAR2(25);

b_found BOOLEAN;

BEGIN
        dbms_output.enable (10000000);

	p_col1 :=3D 12;
	p_col2 :=3D 12;
	p_col3  :=3D 8;
	p_col4 :=3D 8;
	p_col5 :=3D 8;
	p_col6 :=3D 8;
	p_col7 :=3D 8;
	p_col8 :=3D 8;

	p_col_cnt :=3D 8;

    /* print heading */
	print_head;

	b_found :=3D FALSE;


   FOR cur_rollback_rec IN cur_rollback LOOP =20
		IF b_found =3D FALSE THEN
			dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 =
+ p_col5 + p_col6 + p_col7=20
			 + p_col8 + p_col_cnt * LENGTH(p_col_del) - 1,'-'));

			dbms_output.put_line(LPAD('Tablespace ', p_col1,' ')||p_col_del||' =
'||
					RPAD('Rollback', p_col2 , ' ')||p_col_del||=20
					LPAD('Extents', p_col3 )||p_col_del||
					LPAD('Size Mbt', p_col4 )||p_col_del||
					LPAD('Opt Mbt', p_col5 )||p_col_del||
					LPAD('Shrinks', p_col6 )||p_col_del||=20
					LPAD('Wraps', p_col7 )||p_col_del||
					LPAD('Extend', p_col8 ));

			dbms_output.put_line(RPAD(v_line, p_col1 + p_col2 + p_col3 + p_col4 =
+ p_col5 + p_col6 + p_col7=20
	 				+ p_col8 + p_col_cnt * LENGTH(p_col_del) - 1,'-'));
			b_found :=3D TRUE;         =20
		END IF;
		dbms_output.put_line( RPAD(cur_rollback_rec.tspace, =
p_col1)||p_col_del||=20
		                      RPAD(cur_rollback_rec.rb_name, =
p_col2)||p_col_del||=20
		                      LPAD(TO_CHAR(cur_rollback_rec.ext, '99999'), =
p_col3)||p_col_del||=20
		                      LPAD(TO_CHAR(cur_rollback_rec.sizeMbt, =
'99999.99'), p_col4)||p_col_del||=20
		                      LPAD(TO_CHAR(cur_rollback_rec.optMbt, =
'99999.99'), p_col5)||p_col_del||=20
		                      LPAD(TO_CHAR(cur_rollback_rec.shrinks), =
p_col6)||p_col_del||=20
		                      LPAD(TO_CHAR(cur_rollback_rec.wraps), =
p_col7)||p_col_del||=20
		                      LPAD(TO_CHAR(cur_rollback_rec.extends), =
p_col8));              =20

   END LOOP;

	EXCEPTION
		WHEN OTHERS THEN
				dbms_output.put_line(SQLERRM||' found');

END; =20 PROCEDURE print_head=20
IS

v_database VARCHAR2(15);=20

BEGIN         DBMS_OUTPUT.ENABLE (10000000);         SELECT name INTO v_database FROM V$DATABASE ;

	/* print heading */
	dbms_output.put_line(v_database||' database monitoring report');
	dbms_output.put_line('generated on '||
						TO_CHAR(SYSDATE,'DD/MM/YYYY HH24:MI:SS')||
						' by '||USER||' user');

END;		-- end of  get_head procedure

PROCEDURE print_tail
IS

BEGIN         DBMS_OUTPUT.ENABLE (10000000);
    dbms_output.put_line('end');

END; -- end of get_tail procedure

END db_monit; -- end of db_monit package body=20

/

------_=_NextPart_000_01C0389D.C204F6A0
Content-Type: application/octet-stream;

        name="dbreport.sh"
Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment;

        filename="dbreport.sh"

#! /bin/ksh
#
# name          dbreport.sh
#
# purpose       Run monitoring repoprts       =20
# usage         dbreport.sh <dbname>=20
#
# parameters $1=3Ddbname ( database name optional, if not passed=20
#                        all oratab databases  are checked)
#***********************************************************************=
******
#*                    MAINTENANCE LOG                                   =
     *
#*                    ---------------                                   =
     *
#*      DATE            WHO             DESCRIPTION                     =
     *
#*      -------         --------------  =
-----------------------------------  *
#*      09/03/99        AAfanassiev     Created                         =
     *
#***********************************************************************=


# boolean
TRUE=3D0
FALSE=3D1
# initialization
COMPILE=3D$TRUE=20
MAIL=3D$TRUE=20
PERC_USED=3D90
# user
#USER=3D`whoami`
USER=3Doracle=20
#
# return code
SUCCESS=3D0
WARNING=3D1
ERROR=3D2
ORA_PROCESS_CNT=3D5
ORATAB=3D/var/opt/oracle/oratab
SIDLIST=3D`cat $ORATAB | awk -F: '/^[^#]/' | cut -d ":" -f1` #
# job name
TOOLS=3D/ora/admin/maint =20
MONITOR=3D/ora/admin/monitor
LOGS=3D/ora/admin/monitor/LOGS
JOBNAME=3D"$0"
JOBNAME_SHORT=3D`basename $JOBNAME`
JOB=3D`echo $JOBNAME_SHORT | cut -d "." -f1`
OUT=3D${LOGS}/${JOB}.trc =20
echo "$JOBNAME_SHORT: sqlplus output is redirected to "
echo "$JOBNAME_SHORT:  to $OUT"

date '+Started: %m/%d/%y %H:%M:%S' > $OUT=20 # check parameters
if [ $1 ]; then

   DBNAME=3D$1
   # validate DBNAME
   if [ `echo $SIDLIST |grep -c $DBNAME` -eq 0 ]; then

      echo "$JOBNAME_SHORT: Invalid <dbname> : $DBNAME does not exists"
      echo "$JOBNAME_SHORT: Must be one of: `echo $SIDLIST`"
      exit ${ERROR}
   else
      # reset list to DBNAME
      SIDLIST=3D${DBNAME}

   fi
fi
# Message file
MESSAGE_FILE=3D/tmp/fifo$$
echo "$JOBNAME_SHORT: Starting monitoring reports..." TITLE=3D$TRUE=20
for DBNAME in `echo $SIDLIST`; do
  # set environment vars=20
  . ${TOOLS}/dbenv.sh $DBNAME y=20
  if [ $? -ne 0 ]; then

     echo "$JOBNAME_SHORT: Failed to set oracle env vars. Skipping = $DBNAME ..."
  else
    # check if the instance is running
    if [ `ps -fu oracle |grep ora_ | \
grep ${ORACLE_SID} | wc -l` -ge $ORA_PROCESS_CNT ]; then

       #SHUTDOWN_AFTER=3D${TRUE}=20
       #echo "$JOBNAME_SHORT: Starting up ${ORACLE_SID} database..."
       #$ORACLE_HOME/bin/svrmgrl >> $OUT << EOF
       #connect internal
       #startup open pfile=3D${PFILE}
#EOF
       # make sure that the database is open
       STATUS=3D`${MONITOR}/dbstatus.sh | grep -v "Available ORACLE" | =
grep $ORACLE_SID |grep -c OPEN`
       if [ $STATUS -gt 0 ]; then
          OPEN=3D${TRUE}
       else=20
          echo "$JOBNAME_SHORT: ${ORACLE_SID} database is up but not =
open. Skipping ..."
          OPEN=3D${FALSE}
       fi
    else
       OPEN=3D${FALSE}
       echo "$JOBNAME_SHORT: ${ORACLE_SID} database is down. Skipping =
..."
       #SHUTDOWN_AFTER=3D${FALSE}=20

    fi
   if [ $OPEN -eq $TRUE ]; then
    # compile monitoring package if required     if [ $COMPILE -eq $TRUE ]; then
        $ORACLE_HOME/bin/svrmgrl >> $OUT << EOF
        connect internal
	REM SELECT on the views below is required
	REM to access them from PL/SQL code (db_monit.sql)
        REM disable out to exclude ORA- error when
        REM trying to drop DBA_LOCKS view
        REM as it does not exist and nevr created
        set termout off
        @$ORACLE_HOME/rdbms/admin/catblock.sql
        set termout on =20
	grant select on dba_data_files to OPS\$${USER};
	grant select on dba_free_space to OPS\$${USER};
	grant select on dba_segments to OPS\$${USER};
	grant select on dba_tablespaces to OPS\$${USER};
	grant select on dba_tables to OPS\$${USER};
	grant select on dba_objects to OPS\$${USER};
	grant select on dba_locks to OPS\$${USER};
	grant select on dba_rollback_segs to OPS\$${USER};
	grant select on v_\$session to OPS\$${USER};
	grant select on v_\$sysstat to OPS\$${USER};
	grant select on v_\$rollstat to OPS\$${USER};
	grant select on v_\$sesstat to OPS\$${USER};
	grant select on v_\$rollname to OPS\$${USER};
	grant select on v_\$timer to OPS\$${USER};
	grant select on v_\$database to OPS\$${USER};
        connect /           =20
	@${MONITOR}/db_monit.sql

EOF
    fi=20
    $ORACLE_HOME/bin/sqlplus -s / >> $OUT << EOF
        set echo off feedback off verify off
        set serveroutput on lines 132 pages 999
        spool ${LOGS}/${JOB}_${ORACLE_SID}.rpt
        execute db_monit.ts_space;
	PROMPT --------------------------------------------------------
        spool off

EOF
   if [ -s ${LOGS}/${JOB}_${ORACLE_SID}.rpt ]; then
      # analyze output=20
      DBTITLE=3D$TRUE=20
      grep -i "\.\.\." ${LOGS}/${JOB}_${ORACLE_SID}.rpt | while read =
LINE
      do
        Tablespace=3D`echo $LINE | awk '{print $1}'`
        FreeExtents=3D`echo $LINE | awk '{print $4}'`
        UsedPerc=3D`echo $LINE | awk '{print $9}'`
	if [ ${UsedPerc} -gt ${PERC_USED} -a "${Tablespace}" !=3D =
"Total......."  ]; then
           if [ ${TITLE} -eq ${TRUE} ]; then
              echo "`hostname` server report">> $MESSAGE_FILE
              echo >> $MESSAGE_FILE=20
              TITLE=3D$FALSE
	   fi
           if [ ${DBTITLE} -eq ${TRUE} ]; then
              echo >> $MESSAGE_FILE=20
              echo "ATTENTION: More than ${PERC_USED}% of the space is =
already used in the following $ORACLE_SID tablespaces" >> $MESSAGE_FILE
              echo "             (more details in =
${LOGS}/${JOB}_${ORACLE_SID}.rpt)" >> $MESSAGE_FILE=20
              echo >> $MESSAGE_FILE=20
              echo =
"-----------------------------------------------------------------------=
-">> $MESSAGE_FILE
              echo 'Tablespace\tUsed Space %\tAvail. extents (estim.)' =
>> $MESSAGE_FILE
              echo =
"-----------------------------------------------------------------------=
-">> $MESSAGE_FILE
              DBTITLE=3D$FALSE
           fi=20
           echo $Tablespace"\t"$UsedPerc"\t\t\t\t"$FreeExtents >> =
$MESSAGE_FILE
        fi
       done
    else
       echo "$JOBNAME_SHORT: Failed to create =
${LOGS}/${JOB}_${ORACLE_SID}.rpt file..."

    fi
    #
    # recompile and check invalid objects and triggers     for I in "1 2"; do=20

        $ORACLE_HOME/bin/sqlplus -s / >> $OUT << EOF
        set pause off feedback off echo off verify off
	set head off pages 999 lines 255
        -- Check triger status
        SELECT  owner||'.'||trigger_name||   =20
           ' trigger on '||trigger_type||' event '||
           triggering_event||' into/from '||
           table_owner||'.'||table_name||' table'||' is '||status=20
        FROM sys.dba_triggers
        WHERE status =3D 'DISABLED'=20
        order by owner, trigger_name;=20
        -- Recompile invalid objects
        spool ${LOGS}/${JOB}_${ORACLE_SID}.gql
        SELECT 'ALTER TRIGGER '|| owner||'.'||
             trigger_name||' compile;'
        FROM dba_triggers
        WHERE status =3D 'INVALID' ;
        SELECT 'ALTER '||object_type||' '||owner||'.'||
            object_name|| ' COMPILE;'
        FROM dba_objects=20
        WHERE status =3D 'INVALID'=20
        AND   object_type IN ('PACKAGE', 'PROCEDURE',
                             'TRIGGER', 'VIEW');
        spool off=20
        @${LOGS}/${JOB}_${ORACLE_SID}.gql=20
EOF
    done
    # analyze output=20
    if [ -s ${LOGS}/${JOB}_${ORACLE_SID}.gql ]; then
       if [ ${TITLE} -eq ${TRUE} ]; then
          echo "`hostname` server report" >> $MESSAGE_FILE
          echo >> $MESSAGE_FILE
          TITLE=3D$FALSE
       fi
       echo >> $MESSAGE_FILE
       echo "ATTENTION: Invalid objects are found in $ORACLE_SID =
database (sql saved in ${LOGS}/${JOB}_${ORACLE_SID}.gql file)" >> = $MESSAGE_FILE
       cat ${LOGS}/${JOB}_${ORACLE_SID}.gql >> ${MESSAGE_FILE}=20
       echo >> $MESSAGE_FILE

    fi
    ## shutdown database if it was started by the script
    ##
    #if [ ${SHUTDOWN_AFTER} -eq ${TRUE} ]; then
    #   if [ `ps -fu oracle |grep ora_ | \
#grep ${ORACLE_SID} | wc -l` -ge ${ORA_PROCESS_CNT} ]; then
    #      echo "$JOBNAME_SHORT: Shutting down ${ORACLE_SID} =
database..."
    #   $ORACLE_HOME/bin/svrmgrl >> $OUT << EOF
    #      connect internal
    #      shutdown immediate;=09

#EOF
    # fi
    #fi
  fi =20
 fi
done
# send email
if [ ${MAIL} -eq $TRUE -a -s ${MESSAGE_FILE} ]; then

   # Send warning email
    ${TOOLS}/sendmail.sh ${MESSAGE_FILE} "$JOBNAME_SHORT: Database(s) = monitoring report!" ${CCFLAG}
fi
if [ -f ${MESSAGE_FILE} ]; then

   rm ${MESSAGE_FILE}
else
  echo "$JOBNAME_SHORT: No message file generated" fi
echo "$JOBNAME_SHORT: Completed monitoring reports..." exit=20

------_=_NextPart_000_01C0389D.C204F6A0
Content-Type: application/octet-stream;

        name="sendmail.sh"
Content-Disposition: attachment;

        filename="sendmail.sh"

#!/bin/ksh
#
# Program Name: @(#) sendmail.sh
#
# This script sends status via email 
Received on Tue Oct 17 2000 - 19:52:50 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US