| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Mailing Lists -> Oracle-L -> RE: Monitoring script
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
------_=_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 * MAINTENANCE LOG =
*
REM * --------------- =
*
REM * DATE WHO DESCRIPTION =
*
------------------------------------------- *
REM * 12OCT98 Afanassiev Created =
*
************************************************************************=**
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
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
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;
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
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;
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);
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);
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 =
*
#***********************************************************************=
OUT=3D${LOGS}/${JOB}.trc =20
echo "$JOBNAME_SHORT: sqlplus output is redirected to "
echo "$JOBNAME_SHORT: to $OUT"
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}
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
$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
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
# 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
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
## 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
# 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 emailReceived on Tue Oct 17 2000 - 19:52:50 CDT
![]() |
![]() |