Core DBA Scripts
Core DBA Scripts
=============================================
select p.spid,s.username, s.sid,s.status,t.disk_reads, s.last_call_et/3600 last_
call_et_Hrs,
s.action,s.program,s.machine cli_mach,s.process cli_process,lpad(t.sql_text,30)
"Last SQL"
from gv$session s, gv$sqlarea t,v$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
t.disk_reads > 5000
and s.status='INACTIVE'
and s.process='1234'
order by S.PROGRAM;
To Analyze the DISK I/o's
==========================
prompt SESSIONS PERFORMING HIGH I/O > 50000
select p.spid, s.sid,s.process cli_process, s.status,t.disk_reads, s.last_call_e
t/3600 last_call_et_Hrs,
s.action,s.program,lpad(t.sql_text,30) "Last SQL"
from v$session s, v$sqlarea t,v$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
t.disk_reads > 10000
order by t.disk_reads desc;
#####################33LATCH Free Sessions Monitoring and Troubleshooting
===========================================================================
LATCH COUNT ON DATABASE:
=========================
set
set
set
col
col
col
col
col
col
col
col
col
col
col
col
col
col
col
col
pagesize 5000
lines 180
long 5000
username for a15
osuser for a15
program for a20
"LOGON_TIME" for a23
"LAST_CALL_HRS" for 99999.999
status for a8
machine for a15
SQL_TEXT for a90
P1TEXT for a10
P2TEXT for a10
P3TEXT for a10
p1 for 9999999999999
p2 for 9999999999999
p3 for 9999999999999
event for a50
"LATCH_NAME" for a20
pagesize 5000
lines 185
long 5000
username for a15
osuser for a15
program for a20
"LOGON_TIME" for a23
status for a8
machine for a15
SQL_TEXT for a90
EVENT for a50
P1TEXT for a10
P2TEXT for a10
P3TEXT for a10
p1 for 9999999999999
set
set
set
col
col
col
col
col
col
col
col
col
col
col
col
col
col
col
pagesize 5000
lines 180
long 5000
username for a15
osuser for a15
program for a20
"LOGON_TIME" for a23
status for a8
machine for a15
SQL_TEXT for a90
EVENT for a50
P1TEXT for a10
P2TEXT for a10
P3TEXT for a10
p1 for 9999999999999
p2 for 9999999999999
p3 for 9999999999999
"LAST_CALL_HRS" for 99999.999
To find Wait event Most of the time the session waited for
============================================================
select event,TOTAL_WAITS ,TOTAL_TIMEOUTS,TIME_WAITED from gv$session_event where
sid=54
order by TIME_WAITED
To find the list of wait events and count of associated sessions
==================================================================
select count(sid),event from v$session_wait group by event order by 1;
No of events with sid's
==========================
prompt Sessions Wait Event Summary
select EVENT,COUNT(SID)
from v$session_wait
GROUP BY EVENT;
Obtaining a parameter defined
==============================
col value for a10
col description for a30
select name,value,description from v$parameter where name like '%timed_statistic
s%';
Wait events
set linesize 152
set pagesize 80
column EVENT format a30
select * from v$system_event
where event like '%wait%';
Sessions waiting "sql*net message from client"
prompt Sessions having Wait Event "sql*net message from client"
select program,module,count(s.sid) from v$session s, v$session_Wait w
where w.sid=s.sid and w.event='SQL*Net message from client' group by program,mod
ule having
count(s.sid)>5 order by count(s.sid);
Sessions having Wait Event "sql*net message from client" from more than 1Hour
select program,module,count(s.sid) from v$session s, v$session_Wait w
where w.sid=s.sid
and s.last_call_et > 3600
and w.event='SQL*Net message from client' group by program,module having
SELECT
FROM
WHERE
ORDER BY
SELECT
FROM
WHERE
AND
AND
Sessions
A.name, B.value
v$statname A, v$sesstat B
A.statistic# = 12
B.statistic# = A.statistic#
B.sid = 47;
Ordered by Wait event in Database
Example
select SID, STATUS, LAST_CALL_ET, SERIAL# from v$session where SID in (select SE
SSION_ID
from v$locked_object where OBJECT_ID in (select OBJECT_ID from dba_objects w
here
OBJECT_NAME='MSC_ST_SALES_ORDERS'));
Note:
Library Cache contention is a serious issue. In most cases it would be good to a
nalyze what is holding the library cache lock and killing it will resolve the is
sue. Library cache events can even bring the database to a hang state. It s a good
idea to identify and kill appropriately as early as possible. But do not kill a
ny mandatory processes or sessions as it may lead to an outage. Contact Oracle s
upport for critical issues.
Library cache resource types waited for over the life of the instance
========================================================================
set linesize 152
column average_wait format 9999990.00
select
substr(e.event, 1, 40) event,
e.time_waited,
e.time_waited / decode(
e.event,
'latch free', e.total_waits,
decode(e.total_waits - e.total_timeouts,0, 1,e.total_waits - e.total_timeouts))
average_wait
from
sys.v$system_event e,
sys.v$instance i
where
e.event like '%library cache%';
Detect sessions waiting for a Library Cache Locks
==================================================
select sid Waiter, p1raw,
substr(rawtohex(p1),1,30) Handle,
substr(rawtohex(p2),1,30) Pin_addr
from v$session_wait where wait_time=0 and event like '%library cache%';
Sessions waiting for lib cache in RAC
==========================================
select a.sid Waiter,b.SERIAL#,a.event,a.p1raw,
substr(rawtohex(a.p1),1,30) Handle,
substr(rawtohex(a.p2),1,30) Pin_addr
from v$session_wait a,v$session b where a.sid=b.sid
and a.wait_time=0 and a.event like 'library cache%';
Objects locked by Library Cache based on sessions detected above
=================================================================
select to_char(SESSION_ID,'999') sid ,
substr(LOCK_TYPE,1,30) Type,
substr(lock_id1,1,23) Object_Name,
substr(mode_held,1,4) HELD, substr(mode_requested,1,4) REQ,
lock_id2 Lock_addr
from dba_lock_internal
where
mode_requested<>'None'
and mode_requested<>mode_held
and session_id in ( select sid
from v$session_wait where wait_time=0
and event like '%library cache%') ;
Detect Library Cache holders that sessions are waiting for
=============================================================
select sid Holder ,KGLPNUSE Sesion , KGLPNMOD Held, KGLPNREQ Req
from x$kglpn , v$session
where KGLPNHDL in (select p1raw from v$session_wait
where wait_time=0 and event like '%library cache%')
and KGLPNMOD <> 0
and v$session.saddr=x$kglpn.kglpnuse ;
Sessions holding the lib cache in RAC
========================================
col
set
set
col
col
linesize 150
action format a25
logon_time format a16
module format a13
=======================================
undefine spid
col spid for a10
set linesize 150
col action format a10
col logon_time format a16
col module format a13
col cli_process format a7
col cli_mach for a15
col status format a10
col username format a10
col last_call_et for 9999.99
select p.spid,s.sid, s.serial#, s.status, s.username, s.action,
to_char(s.logon_time, 'DD-MON-YY, HH24:MI') logon_time,
s.module,s.last_call_et/3600 last_call_et,s.process cli_process,s.machine cli_ma
ch
from gv$session s, gv$process p
where p.addr=s.paddr and p.spid= '&spid';
Session details thru Client process name
============================================
undefine spid
col spid for a6
col sid for 99999
set linesize 140
col action format a20
col logon_time format a15
col module format a13
col cli_process format a7
col cli_mach for a10
col status format a10
col username format a10
select p.spid,s.sid, s.serial#, s.status, s.username, s.action,
to_char(s.logon_time, 'DD-MON-YY, HH24:MI') logon_time,
s.module,s.last_call_et/3600,s.process cli_process,s.machine cli_mach
from gv$session s, gv$process p
where p.addr=s.paddr and s.process = '&cli_process';
Details thru multiple inputs of SIDs
====================================
undefine spid
col last_call_et for 9999999
set pagesize 40
col spid for a6
col sid for 99999
set linesize 150
col action format a20
col logon_time format a15
col module format a13
col cli_process format a7
col cli_mach for a10
col status format a10
col last_call_et for 999.99
col username format a10
select p.spid,s.sid, s.serial#, s.status, s.username, s.action,
'None',
'Null',
'Row-S (SS)',
'Row-X (SX)',
'Share',
'S/Row-X (SSX)',
'Exclusive'
EXCLUSIVE (X)
Lock allows queries but nothing else.
SHARE (S)
Lock allows queries but not updates.
ROW SHARE (RS)
Lock allows concurrent process access to table. Resour
ce may not be locked exclusively.
ROW EXCLUSIVE (RX)
Same as row share but no share mode locking. Updates,
deletes and inserts use this lock mode.
SHARE ROW EXCLUSIVE (SRX) Lock used to do selective updates and to allow other p
rocesses to look at rows in table but not
lock table i
n share mode or to update any rows. (Never used).
To check for blocking sessions
================================
Indentifying blocking session tree
@$ORACLE_HOME/rdbms/admin/catblock.sql
@$ORACLE_HOME/rdbms/admin/utllockt.sql
From v$lock
select * from v$lock where block>0;
select * from v$lock where request>0;
From gv$lock global view
select * from gv$lock where block>0;
select * from gv$lock where request>0;
From dba_locks
select distinct BLOCKING_OTHERS from dba_locks;
To find Session information
============================
col
col
col
set
select s.sid,
s.serial#,
'*'||s.process||'*' Client,
p.spid Server,
s.sql_address,
s.sql_hash_value,
s.username,
s.action,
s.program || s.module,
s.terminal,
s.machine,
s.status,
--s.last_call_et
s.last_call_et/3600
from gv$session s, gv$process p
where p.addr=s.paddr and
s.sid=nvl('&sid',s.sid) and
p.spid=nvl('&spid',p.spid) and
nvl(s.process,-1) = nvl('&ClientPid',nvl(s.process,-1));
and
s.sid=&BSID;
Blockers-Waiters Info
col SESS for a12
set lines 132
SELECT DECODE(request,0,'Holder: ','Waiter: ')||sid sess,
id1, id2, lmode, request, type
FROM V$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM V$LOCK WHERE request>0)
ORDER BY id1, request;
select distinct holding_session from dba_waiters where holding_session not in (s
elect
waiting_session from dba_waiters);
select s.sid, s.serial#, s.action, s.module, s.status, s.last_call_et,s.logon_ti
me
from v$session s
where s.sid in (select sid from v$lock where block >0)
order by sid;
Blocking session
=================
SELECT blocking_sid, num_blocked
FROM ( SELECT blocking_sid, SUM(num_blocked) num_blocked
FROM ( SELECT l.id1, l.id2,
MAX(DECODE(l.block, 1, i.instance_name||'-'||l.sid,
2, i.instance_name||'-'||l.sid, 0 )) blocking_sid,
SUM(DECODE(l.request, 0, 0, 1 )) num_blocked
FROM gv$lock l, gv$instance i
WHERE ( l.block!= 0 OR l.request > 0 ) AND
l.inst_id = i.inst_id
GROUP BY l.id1, l.id2)
GROUP BY blocking_sid
ORDER BY num_blocked DESC)
WHERE num_blocked != 0
Blocker-waiter
==============
set linesize 80
col sess for a15
SELECT DECODE(request,0,'Holder: ','Waiter: ')||trim(sid) sess,
id1, id2, lmode, request, type
FROM V$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM V$LOCK WHERE request>0)
ORDER BY id1, request;
SELECT DECODE(request,0,'Holder: ','Waiter: ')||sid sess,inst_id,
id1, id2, lmode, request, type
FROM GV$LOCK
pagesize 5000
lines 150
username for a15
osuser for a15
program for a20
logon_time for a20
status for a8
machine for a15
sql_text for a100
EVENT for a30
P1TEXT for a10
P2TEXT for a10
P3TEXT for a10
p1 for 9999999999999
p2 for 9999999999999
p3 for 9999999999999
LAST_CALL_ET_HRS for 999999.99
select sid,serial#,username,osuser,program,machine,status,to_char(logon_time,'DD
-MON-YYYY HH24:MI:SS') "LOGON_TIME",last_call_et/3600 " LAST_CALL_ET_HRS" from v
$session where status='ACTIVE' AND username is not null and last_call_et/3600 >1
order by 9 desc;
s.sid= '&sid' ;
Checking for active transactions SID
select username,t.used_ublk,t.used_urec from v$transaction t,v$session s where t
.addr=s.taddr and s.sid='&sessionid';
Checking rollback/Undo segment info used by SID
column rr heading 'RB Segment' format a18
column us heading 'Username' format a15
column os heading 'OS User' format a10
column te heading 'Terminal' format a10
SELECT r.name rr, nvl(s.username,'no transaction') us,s.sid, s.osuser os, s.term
inal te, rs.rssize,
rs.xacts, rs.rssize/1048576 Rssize
FROM v$lock l, v$session s,v$rollname r , v$rollstat rs
WHERE l.sid = s.sid(+) AND trunc(l.id1/65536) = r.usn AND l.type = 'TX' AND
l.lmode = 6 AND r.usn=rs.usn and s.sid in (&sid_list_comma_sep);
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
0 ;
0 ;
'';
'';
'';
'';
'';
'';
'';
0 ;
'';
0 ;
0 ;
0 ;
'';
'';
'';
a.terminal terminal,
a.program program,
a.module module,
a.action action,
a.sql_hash_value sql_hash_value,
to_char(a.logon_time,'DD-Mon-YYYY HH:MI:SS') logontime,
a.last_call_et last_call_et,
a.process proc,
b.spid spid,
sw.event event,
sw.state state
from gv$session a, gv$process b, gv$session_wait sw
where a.paddr=b.addr
and a.inst_id=b.inst_id
and a.sid ='&sid'
and a.inst_id=sw.inst_id
and a.sid=sw.sid;
begin
DBMS_OUTPUT.PUT_LINE('----------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE(' Database session detail for the shadow process ');
DBMS_OUTPUT.PUT_LINE('----------------------------------------------------------------');
for m in cur1 loop
DBMS_OUTPUT.ENABLE(50000);
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('SID............ : ' || m.sid);
DBMS_OUTPUT.PUT_LINE('SERIAL#........ : ' || m.serial);
DBMS_OUTPUT.PUT_LINE('USERNAME....... : ' || m.username);
DBMS_OUTPUT.PUT_LINE('STATUS......... : ' || m.status);
DBMS_OUTPUT.PUT_LINE('Machine........ : ' || m.machine);
DBMS_OUTPUT.PUT_LINE('Terminal....... : ' || m.terminal);
DBMS_OUTPUT.PUT_LINE('Program........ : ' || m.program);
DBMS_OUTPUT.PUT_LINE('Module......... : ' || m.module);
DBMS_OUTPUT.PUT_LINE('Action......... : ' || m.action);
DBMS_OUTPUT.PUT_LINE('SQL Hash Value. : ' || m.sql_hash_value);
DBMS_OUTPUT.PUT_LINE('Logon Time..... : ' || m.logontime);
DBMS_OUTPUT.PUT_LINE('Last Call Et... : ' || m.last_call_et);
DBMS_OUTPUT.PUT_LINE('Process ID..... : ' || m.proc);
DBMS_OUTPUT.PUT_LINE('SPID........... : ' || m.spid);
DBMS_OUTPUT.PUT_LINE('Session Waiting for event:'||m.event);
DBMS_OUTPUT.PUT_LINE('Session state ...........:'||m.state);
for rec in ( select distinct(sql_text) sql_text from v$session s,v$sql v whe
re
s.sql_hash_value=v.hash_value and s.sql_address=v.address and s.sid=m.si
d)
loop
dbms_output.put_line(substr('SQL_TEXT is..........:'||rec.sql_text,1,255))
;
end loop;
DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE(' ');
end loop;
end;
/
-5));
dbms_output.put_line(SUBSTR('SQL_TEXT is..........:'||rec.sql_text,1,25
Another version
set echo off
set linesize 132
set verify off
set feedback off
set serveroutput on;
declare
SID
number
:= 0 ;
SERIAL
number
:= 0 ;
username
varchar(20) := '';
Status
varchar(8)
:= '';
machine
varchar(10) := '';
terminal
varchar(25) := '';
program
varchar(30) := '';
Module
varchar(30) := '';
Action
varchar(20) := '';
sql_hash_value number
:= 0 ;
logontime
varchar(30) := '';
last_call_et
number
:= 0 ;
proc
number
:= 0 ;
spid
number
:= 0 ;
event
varchar(30) := '';
state
varchar(30) := '';
sql_text
varchar(1000) := '';
cursor cur1 is
select
a.sid sid,
a.serial# serial,
a.username username,
a.status status ,
a.machine machine,
a.terminal terminal,
a.program program,
a.module module,
a.action action,
a.sql_hash_value sql_hash_value,
to_char(a.logon_time,'DD-Mon-YYYY HH:MI:SS') logontime,
a.last_call_et last_call_et,
a.process proc,
b.spid spid,
b.event event,
b.state state
from gv$session a, gv$process b, gv$session_wait sw
where a.paddr=b.addr
and a.inst_id=b.inst_id
and b.spid='&1'
and a.inst_id=sw.inst_id
and a.sid=sw.sid;
begin
DBMS_OUTPUT.PUT_LINE('----------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE(' Database session detail for the shadow process ');
DBMS_OUTPUT.PUT_LINE('----------------------------------------------------------------');
for m in cur1 loop
DBMS_OUTPUT.ENABLE(50000);
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('SID............ : ' || m.sid);
DBMS_OUTPUT.PUT_LINE('SERIAL#........ : ' || m.serial);
DBMS_OUTPUT.PUT_LINE('USERNAME....... : ' || m.username);
DBMS_OUTPUT.PUT_LINE('STATUS......... : ' || m.status);
DBMS_OUTPUT.PUT_LINE('Machine........ : ' || m.machine);
DBMS_OUTPUT.PUT_LINE('Terminal....... : ' || m.terminal);
DBMS_OUTPUT.PUT_LINE('Program........ : ' || m.program);
DBMS_OUTPUT.PUT_LINE('Module......... : ' || m.module);
DBMS_OUTPUT.PUT_LINE('Action......... : ' || m.action);
DBMS_OUTPUT.PUT_LINE('SQL Hash Value. : ' || m.sql_hash_value);
DBMS_OUTPUT.PUT_LINE('Logon Time..... : ' || m.logontime);
DBMS_OUTPUT.PUT_LINE('Last Call Et... : ' || m.last_call_et);
DBMS_OUTPUT.PUT_LINE('Process ID..... : ' || m.proc);
DBMS_OUTPUT.PUT_LINE('SPID........... : ' || m.spid);
DBMS_OUTPUT.PUT_LINE('Session Waiting for event:'||m.event);
DBMS_OUTPUT.PUT_LINE('Session state ...........:'||m.state);
DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE(' ');
end loop;
end;
/
'||s.sid,
'||s.serial#,
'||s.username,
'||s.status,
'||'*'||s.process||'*
'||p.spid Server,
'||s.sql_address,
'||s.sql_hash_value,
'||s.SCHEMANAME,
'||s.program,
'|| s.module,
'||s.action,
'||s.terminal,
'||s.machine,
select s.sid,
s.serial#,
'*'||s.process||'*' Client,
p.spid Server,
s.sql_address,
s.sql_hash_value,
s.username,
s.action,
s.program || s.module,
s.terminal,
s.machine,
s.status,
--s.last_call_et
s.last_call_et/3600
from gv$session s, gv$process p
where p.addr=s.paddr and
s.sid=nvl('&sid',s.sid) and
p.spid=nvl('&spid',p.spid) and
nvl(s.process,-1) = nvl('&ClientPid',nvl(s.process,-1));
select s.sid,
s.serial#,
'*'||s.process||'*' Client,
p.spid Server,
s.sql_address,
s.sql_hash_value,
s.username,
s.action,
s.program || s.module,
s.terminal,
s.machine,
s.status,
--s.last_call_et
s.last_call_et/3600
from gv$session s, gv$process p
where p.addr=s.paddr and s.type != 'BACKGROUND';
col
col
col
set
select s.sid,
s.serial#,
'*'||s.process||'*' Client,
p.spid Server,
s.sql_address,
s.sql_hash_value,
s.username,
s.action,
s.program || s.module,
s.terminal,
s.machine,
s.status,
--s.last_call_et
s.last_call_et/3600
from gv$session s, gv$process p
where p.addr=s.paddr and
s.sid=nvl('&sid',s.sid) and
p.spid=nvl('&spid',p.spid) and
s.status='ACTIVE' and
--(s.last_call_et/3600)<1 and
nvl(s.process,-1) = nvl('&ClientPid',nvl(s.process,-1));
Active sessions
================
select p.spid "Thread", s.sid "SID-Top Sessions",
substr(s.osuser,1,15) "OS User", substr(s.program,1,25) "Program Running"
from v$process p, v$session s
where p.addr=s.paddr
order by substr(s.osuser,1,15);
'||s.sid,
'||s.serial#,
'||s.username,
'||s.status,
'||'*'||s.process||'*
'||p.spid Server,
'||s.sql_address,
'||s.sql_hash_value,
'||s.SCHEMANAME,
'||s.program,
'Module .................................................:
'Action .................................................:
'Terminal ...............................................:
'Client Machine .........................................:
'LAST_CALL_ET ...........................................:
'S.LAST_CALL_ET/3600 ....................................:
0
from v$session s, v$process p
where p.addr=s.paddr and
s.sid=nvl('&sid',s.sid) and
p.spid=nvl('&spid',p.spid) and
nvl(s.process,-1) = nvl('&ClientPid',nvl(s.process,-1));
'|| s.module,
'||s.action,
'||s.terminal,
'||s.machine,
'||s.last_call_et,
'||s.last_call_et/360
***APPS 11i*****
To Find Forms User Session Details Given ClientProcess id
================================================================
SELECT /*+ ORDERED FULL(fl) FULL(vp) USE_HASH(fl vp) */
( SELECT SUBSTR ( fu.user_name, 1, 20 )
FROM apps.fnd_user fu
WHERE fu.user_id = fl.user_id
) user_name,
'
'
'
'
'
'
'
'
'
'
'
||
||
||
||
||
||
||
||
||
||
||
m.inst_id );
m.sid );
m.serial );
m.username );
m.status );
m.machine );
m.terminal);
m.program );
m.module );
m.action );
m.sql_hash_value
' || m.logontime );
' || m.last_call_et||
' || m.proc );
' || m.spid );
select s.sid,
s.serial#,
'*'||s.process||'*' Client,
p.spid Server,
s.sql_address,
s.sql_hash_value,
s.username,
s.action,
s.program || s.module,
s.terminal,
s.machine,
s.status,
--s.last_call_et
s.last_call_et/3600
from gv$session s, gv$process p
where p.addr=s.paddr
and s.osuser='&osuser';
Session accessing an object
===============================
select b.sql_text,a.sid,a.serial#,b.users_executing, b.rows_processed,a.last_cal
l_et/3600 Hrs from v$sqlarea b,v$session a where b.sql_text like '&object_name'
and a.sql_address=b.address;
--
"
--
FROM v$session s,
v$process p
WHERE s.sid LIKE NVL('&sid', '%')
AND p.spid LIKE NVL ('&OS_ProcessID', '%')
AND s.process LIKE NVL('&Client_Process', '%')
AND s.paddr = p.addr
group by s.sid, p.spid;
:
:
:
:
:
:
:
:
:
:
'||v.sid
|| chr(10)||
'||v.serial# || chr(10) ||
'||v.username
|| chr(10) ||
'||v.osuser || chr(10) ||
'||v.process || chr(10) ||
'||v.machine || chr(10) ||
'||p.pid
|| chr(10) ||
'||p.spid
|| chr(10) ||
'||v.status || chr(10) ||
'||to_char(v.logon_time, 'MM/DD HH24:M
: '||v.program || chr(10)
' P1 Text
' P1 Value
' P2 Text
' P2 Value
' P3 Text
' P3 Value
from v$session_wait x
where x.sid= &sid_number
/
:
:
:
:
:
:
'
'
'
'
'
'
||
||
||
||
||
||
x.p1text || chr(10) ||
x.p1 || chr(10) ||
x.p2text || chr(10) ||
x.p2 || chr(10) ||
x.p3text || chr(10) ||
x.p3
PROMPT
PROMPT Session Statistics
PROMPT -----------------select
'
'|| b.name ||'
: '||decode(b.name, 'redo size',
round(a.value/1024/1024,2)||' M', a.value)
from v$session s, v$sesstat a, v$statname b
where a.statistic# = b.statistic#
and name in ('redo size', 'parse count (total)', 'parse count (hard)', 'user com
mits')
and s.sid = &sid_number
and a.sid = &sid_number
--order by b.name
order by decode(b.name, 'redo size', 1, 2), b.name
/
COLUMN USERNAME FORMAT a10
COLUMN status FORMAT a8
column RBS_NAME format a10
PROMPT
PROMPT Transaction and Rollback Information
PROMPT -----------------------------------select
||' M'
'
Rollback Used
|| chr(10) ||
'
Rollback Records
: '||t.used_ublk*8192/1024/1024
: '||t.used_urec
|| chr(1
'
: '||t.xidusn
|| chr(1
'
: '||r.name
|| chr(1
'
Logical IOs
: '||t.log_io
|| chr(1
'
Physical IOs
: '||t.phy_io
|| chr(1
'
: '||t.start_uext
|| chr(1
'
: '||t.start_time
|| chr(1
0)||
0)||
0)||
0)||
0)||
0)||
0)||
'
Transaction_Status
: '||t.status
FROM v$transaction t, v$session s, v$rollname r
WHERE t.addr = s.taddr
and r.usn = t.xidusn
and s.sid = &sid_number
/
PROMPT
PROMPT Sort Information
PROMPT ---------------column username format a20
column user format a20
column tablespace format a20
SELECT
24*8 ||' M'
e
'
0)||
'
Total Extents Used for Sorting
FROM v$session s, v$sort_usage u
WHERE s.saddr = u.session_addr
AND s.sid = &sid_number
/
: '||u.extents
set heading on
set verify on
clear column
order by 2 desc;
TOTAL INACTIVE SESSIONS GROUP BY MODULE
col program for a60
COL MODULE FOR A30
prompt TOTAL SESSIONS
col INACTIVE_PROGRAMS FOR A40
select s.module,count(s.module) Total_Inactive_Sessions
from gv$session s,v$process p
where
p.addr=s.paddr AND
s.status='INACTIVE'
group by s.module;
INACTIVE SESSION DETAILS MORE THAN 1 HOUR
set pagesize 40
col INST_ID for 99
col spid for a10
set linesize 150
col PROGRAM for a10
col action format a10
col logon_time format a16
col module format a13
col cli_process format a7
col cli_mach for a15
col status format a10
col username format a10
col last_call_et_Hrs for 9999.99
col sql_hash_value for 9999999999999col username for a10
set linesize 152
set pagesize 80
col "Last SQL" for a60
col elapsed_time for 999999999999
select p.spid, s.sid,s.last_call_et/3600 last_call_et_Hrs ,s.status,s.action,s.m
odule,s.program,t.disk_reads,lpad(t.sql_text,30) "Last SQL"
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
and s.last_call_et > (3600)
order by last_call_et;
INACTIVE PROGRAM --ANY-select p.spid, s.sid,s.last_call_et/3600 last_call_et_Hrs ,s.status,s.action,s.m
odule,s.program,t.disk_reads,lpad(t.sql_text,30) "Last SQL"
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
And s.program='&PROGRAM_NAME'
order by last_call_et;
Y HH24:MI:SS') "START_TIME" ,
d.user_form_name "FORM_NAME"
from apps.fnd_logins a, apps.fnd_login_resp_forms b, apps.fnd_user c,
apps.fnd_form_tl d
where
a.login_id=b.login_id
and c.user_name like 'JROMO'
and a.user_id=c.user_id
and trunc(b.start_time) >trunc(sysdate -11)
and trunc(b.end_time) is null
and b.form_id=d.form_id
and d.language='US';
INACTIVE FORM
set pagesize 40
col INST_ID for 99
col spid for a10
set linesize 150
col PROGRAM for a10
col action format a10
col logon_time format a16
col module format a13
col cli_process format a7
col cli_mach for a15
col status format a10
col username format a10
col last_call_et for 9999.99
col sql_hash_value for 9999999999999col username for a10
set linesize 152
set pagesize 80
col "Last SQL" for a30
col elapsed_time for 999999999999
select p.spid, s.sid,s.process cli_process,s.last_call_et/3600 last_call_et ,
s.status,s.action,s.module,s.program,t.disk_reads,lpad(t.sql_text,30) "Last SQL"
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
and s.action like ('FRM%')
and s.last_call_et > (3600*3)
order by last_call_et;
cli_proc for a9
AUDSID FOR A6
PID FOR A6
SID FOR A5
FORM_NAME FOR A25
pagesize 40
INST_ID for 99
spid for a10
linesize 150
group by session_id,user_id,session_serial#,program
order by sum(decode(session_state,'ON CPU',1,1))) topsession,
v$session s,
user$ u
where
u.user# =topsession.user_id and
/* outer join to v$session because the session might be disconnected */
topsession.session_id
= s.sid
(+) and
topsession.session_serial# = s.serial# (+)
group by topsession.session_id, topsession.session_serial#, topsession.user_id,
topsession.program, s.username,s.sid,s.paddr,u.name
order by max(topsession.TOTAL) desc;
To get the Top Session Userwise
================================
select
/* if sid not found in v$session then disconnected */
decode(nvl(to_char(s.sid),-1),-1,'DISCONNECTED','CONNECTED')
"STATUS",
topsession.session_id
"SESSION_ID",
u.name "NAME",
topsession.program
"PROGRAM",
max(topsession.CPU)
"CPU",
max(topsession.WAITING)
"WAITING",
max(topsession.IO)
"IO",
max(topsession.TOTAL)
"TOTAL"
from ( previous query ) topsession,
v$session s,
user$ u
where
u.user# =topsession.user_id and
/* outer join to v$session because the session might be disconnected */
topsession.session_id
= s.sid
(+) and
topsession.session_serial# = s.serial# (+)
group by topsession.session_id, topsession.session_serial#, topsession.user_id,
topsession.program, s.username,s.sid,s.paddr,u.name
order by max(topsession.TOTAL) desc;
To check the Top Sessions
==========================
select
ash.session_id,
ash.session_serial#,
ash.user_id,
ash.program,
sum(decode(ash.session_state,'ON CPU',1,0))
"CPU",
sum(decode(ash.session_state,'WAITING',1,0))
sum(decode(ash.session_state,'WAITING',
decode(en.wait_class,'User I/O',1, 0 ), 0))
"WAITING" ,
sum(decode(ash.session_state,'WAITING',
decode(en.wait_class,'User I/O',1, 0 ), 0))
"IO" ,
sum(decode(session_state,'ON CPU',1,1))
"TOTAL"
from v$active_session_history ash,
v$event_name en
where en.event# = ash.event# and rownum<11
group by session_id,user_id,session_serial#,program
order by sum(decode(session_state,'ON CPU',1,1));
>
>
>
>
>
>
>
>
>
* (s.rssize + p.value)
/ s.extents
) - p.value new_opt
from
( select
optsize,
avg(rssize)
rssize,
avg(extents)
extents,
max(wraps)
wraps,
max(shrinks)
shrinks,
avg(aveshrink) aveshrink
from
sys.v_$rollstat
where
optsize is not null and
status = 'ONLINE'
group by
optsize
) s,
( select
kvisval value
from
sys.x_$kvis
where
kvistag = 'kcbbkl' ) p,
sys.v_$rollstat r,
sys.v_$rollname n
where
s.shrinks > 1 and
s.shrinks > s.wraps / ceil(s.optsize / ((s.rssize + p.value) / s.extents)) and
r.optsize = s.optsize and
r.status = 'ONLINE' and
n.usn = r.usn
/
Generating Shrink commands (Examples)
select b.segment_name,b.tablespace_name,a.extents,a.rssize,a.xacts,a.optsize,a.s
hrinks,a.wraps,a.status from v$rollstat a, dba_rollback_segs b where b.segment_i
d = a.usn;
select 'alter rollback segment ' || segment_name || ' shrink;' from sys.dba_roll
back_segs where status = 'ONLINE';
SQL> select 'alter rollback segment ' || segment_name || ' shrink;' from sys.dba
_rollback_segs where status = 'ONLINE';
'ALTERROLLBACKSEGMENT'||SEGMENT_NAME||'SHRINK;'
------------------------------------------------------------alter rollback segment SYSTEM shrink;
alter rollback segment R01 shrink;
alter rollback segment R02 shrink;
alter rollback segment R03 shrink;
alter rollback segment R04 shrink;
tbs: RBS1
dba_data_files where tablespace_na
where
dba_data_files where tablespace_na
where
tbs: RBS1
tablespace_name in ('&tbs')
tablespace_name in ('RBS1')
R01
RBS1
R02
50
6400
10
50
6400
10
50
6400
10
50
6400
10
R03
R04
6 rows selected.
SQL> SELECT segment_name, tablespace_name, status
FROM sys.dba_rollback_segs; 2
SEGMENT_NAME
-----------------------------SYSTEM
R0
R01
R02
R03
R04
TABLESPACE_NAME
STATUS
------------------------- ---------------SYSTEM
ONLINE
OFFLINE
RBS1
ONLINE
ONLINE
ONLINE
ONLINE
no rows selected
SQL> select b.segment_name,b.tablespace_name,a.extents,a.rssize,a.xacts,a.optsiz
e,a.shrinks,a.wraps,a.status from v$rollstat a, dba_rollback_segs b where b.segm
ent_id = a.usn;
SEGMENT_NAME
TABLESPACE_NAME
EXTENTS
RSSIZE
XACTS Current Optimal
SHRINKS
WRAPS STATUS
------------------------------ ------------------------- ---------- ---------- --------- --------------- ---------- ---------- --------------SYSTEM
SYSTEM
17
1384448
0
0
0 ONLINE
R01
RBS1
10 52420608
0
0
360 ONLINE
R02
69 361750528
0
0
703 ONLINE
R03
10 52420608
0
0
710 ONLINE
R04
10
52420608
356 ONLINE
Approaching Max extents different formula (less than 500 extents to extend)
select owner, SEGMENT_NAME, segment_type, tablespace_name, NEXT_EXTENT,PCT_INCRE
ASE, INITIAL_EXTENT, EXTENTS,
MAX_EXTENTS from dba_segments where tablespace_name= 'APPLSYSD' and extents-ma
x_extents<500;
select count(*) from dba_segments where tablespace_name= 'APPLSYSD' and extents
-max_extents<506;
Approaching Max extents different Formula 2*extents>Maxextents
select owner, SEGMENT_NAME, segment_type, tablespace_name, NEXT_EXTENT,PCT_INCRE
ASE, INITIAL_EXTENT, EXTENTS,MAX_EXTENTS from dba_segments where tablespace_na
me='&tbs' and 2*extents>max_extents;
Less than 25 extents able to extend
select owner, segment_name, segment_type, initial_extent, next_extent, extents,
max_extents, pct_increase from dba_segments where tablespace_name='&TS_NAME' and
max_extents-extents<25;
Checking total space available within TS (Effective MB)
select tablespace_name, sum(bytes/1024/1024) "mb" from dba_free_space
group by tablespace_name having tablespace_name=upper('&tname');
UNLIMITED
alter table
and
alter index
table
table
index
index
table
table
index
index
index
index
index
index
index
CRP.CRP_RESOURCE_PLAN_N1
CRP.CRP_RESOURCE_PLAN_N2
CRP.CRP_RESOURCE_PLAN_N3
CRP.CRP_RESOURCE_PLAN_U1
allocate
allocate
allocate
allocate
extent;
extent;
extent;
extent;
To check instance-wise total allocated, total used TEMP for both rac and non-rac
set lines 152
col FreeSpaceGB format 999.999
col UsedSpaceGB format 999.999
col TotalSpaceGB format 999.999
col host_name format a30
col tablespace_name format a30
select tablespace_name,
(free_blocks*8)/1024/1024 FreeSpaceGB,
(used_blocks*8)/1024/1024 UsedSpaceGB,
(total_blocks*8)/1024/1024 TotalSpaceGB,
i.instance_name,i.host_name
from gv$sort_segment ss,gv$instance i where ss.tablespace_name in (select tables
pace_name from dba_tablespaces where contents='TEMPORARY') and
i.inst_id=ss.inst_id;
Total Used and Total Free Blocks
select inst_id, tablespace_name, total_blocks, used_blocks, free_blocks from gv
$sort_segment;
Another Query to check TEMP USAGE
from v$sort_usage u,
v$session s,
v$parameter p
where u.session_addr = s.saddr
and p.name = 'db_block_size'
group by s.sid,s.status,s.sql_hash_value,u.sqlhash,s.username,u.tablespace,
nvl(s.module,s.program),
floor(last_call_et/3600)||':'||
floor(mod(last_call_et,3600)/60)||':'||
mod(mod(last_call_et,3600),60)
order by 7 desc,3)
where rownum < 11;
Displays the amount of IO for each tempfile
SELECT SUBSTR(t.name,1,50) AS file_name,
f.phyblkrd AS blocks_read,
f.phyblkwrt AS blocks_written,
f.phyblkrd + f.phyblkwrt AS total_io
FROM v$tempstat f,v$tempfile t
WHERE t.file# = f.file#
ORDER BY f.phyblkrd + f.phyblkwrt DESC;
select * from (SELECT u.tablespace, s.username, s.sid, s.serial#, s.logon_time,
program, u.extents, ((u.blocks*8)/1024) as MB,
i.inst_id,i.host_name
FROM gv$session s, gv$sort_usage u ,gv$instance i
WHERE s.saddr=u.session_addr and u.inst_id=i.inst_id order by MB DESC) a where
rownum<10;
Check for ORA-1652
show parameter background
cd <background dump destination>
ls -ltr|tail
view <alert log file name>
shift + G ---> to get the tail end...
?ORA-1652 ---- to search of the error...
shift + N ---- to step for next reported error...
I used these queries to check some settings:
CONTENTS
--------PERMANENT
PERMANENT
TEMPORARY
TEMPORARY
EXTENT_MAN
---------DICTIONARY
DICTIONARY
DICTIONARY
LOCAL
STATUS
--------ONLINE
ONLINE
OFFLINE
ONLINE
Now, the above query and the storage clause of the old 'create tablespace TEMP'
command seem to tell us the tablespace only allows temporary objects, so it shou
ld be safe to assume that no one created any tables or other permanent objects i
n TEMP by mistake, as I think Oracle would prevent that. However, just to be abs
olutely certain, I decided to double-check. Checking for any tables in the table
space is very easy:
-- Show number of tables in the TEMP tablespace - SHOULD be 0:
select count(*) from dba_all_tables
where tablespace_name = 'TEMP' ;
Checking for any other objects (views, indexes, triggers, pl/sql, etc.) is trick
ier, but this query seems to work correctly - note that you'll probably need to
connect internal in order to see the sys_objects view:
-- Shows all objects which exist in the TEMP tablespace - should get
-- NO rows for this:
column owner
format a20
column object_type format a30
column object_name format a40
select
o.owner ,o.object_name
,o.object_type
from sys_objects s
,dba_objects o
,dba_data_files df
where df.file_id = s.header_file
and o.object_id = s.object_id
and df.tablespace_name = 'TEMP' ;
Identifying WHO is currently using TEMP Segments
10g onwards
SELECT sysdate,a.username, a.sid, a.serial#, a.osuser, (b.blocks*d.block_size)/1
048576 MB_used, c.sql_text
FROM v$session a, v$tempseg_usage b, v$sqlarea c,
(select block_size from dba_tablespaces where tablespace_name='TEMP') d
WHERE b.tablespace = 'TEMP'
and a.saddr = b.session_addr
AND c.address= a.sql_address
AND c.hash_value = a.sql_hash_value
AND (b.blocks*d.block_size)/1048576 > 1024
ORDER BY b.tablespace, 6 desc;
If any ratio is > .01 then more rollback segments are needed
GETS
Ratio
---------- --------269
.00000
304
.00000
REM
REM
REM
REM
REM
REM
REM
R02
R03
R04
R05
R06
R07
R08
0
0
1
0
1
0
0
2820
629
511
513
503
301
299
.00000
.00000
.00196
.00000
.00199
.00000
.00000
Looking at the tcl script to see what sql gets performed to determine rollback
segment contention
select
select
select
select
count
count
count
count
from
from
from
from
v$waitstat
v$waitstat
v$waitstat
v$waitstat
where
where
where
where
class
class
class
class
=
=
=
=
* select tablespace_name,segment_name,initial_extent,next_extent,min_extents,max
_extents,status
from dba_rollback_segs
where status='ONLINE';
* select tablespace_name,file_name,bytes/1024/1024,maxbytes/1024/1024,autoextens
ible
from dba_data_files where file_name like '%&filename%';
* select sum(bytes)/1024/1024 from dba_free_space where tablespace_name='&tbs';
Optimize Oracle UNDO Parameters
Actual Undo Size
SELECT SUM(a.bytes/1024/1024/1024) "UNDO_SIZE"
FROM v$datafile a,
v$tablespace b,
dba_tablespaces c
WHERE c.contents = 'UNDO'
AND c.status = 'ONLINE'
AND b.name = c.tablespace_name
AND a.ts# = b.ts#;
UNDO_SIZE
---------209715200
Undo Blocks per Second
SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
"UNDO_BLOCK_PER_SEC"
FROM v$undostat;
UNDO_BLOCK_PER_SEC
-----------------3.12166667
Undo Segment Summary for DB
Undo Segment Summary for DB: S901 Instance: S901 Snaps: 2 -3
-> Undo segment block stats:
-> uS - unexpired Stolen, uR - unexpired Released, uU - unexpired reUsed
-> eS - expired Stolen, eR - expired Released, eU - expired reUsed
Undo
Undo
Num Max Qry
Max Tx Snapshot Out of uS/uR/uU/
TS#
Blocks
Trans Len (s) Concurcy Too Old Space eS/eR/eU
---- -------------- ---------- -------- ---------- -------- ------ ------------1
20,284
1,964
8
12
0
0 0/0/0/0/0/0
select tablespace_name,file_name,file_id,autoextensible,bytes/1048576
Mbytes, maxbytes/1048576 maxMbytes
from dba_data_files
where tablespace_name like '%UNDO%'
or tablespace_name like '%RBS%'
or tablespace_name like '%ROLLBACK%'
order by tablespace_name,file_name;
select a.owner,a.tablespace_name,b.status, a.extents,a.next_extent/1024 next_ext
nentKB,a.max_extents,a.pct_increase from dba_segments a,dba_tablespaces b
where segment_type='ROLLBACK' and a.tablespace_name=b.tablespace_name;
select tablespace_name,status from dba_tablespaces where tablespace_name='ROLLBA
CK';
Actual Undo Size
SELECT SUM(a.bytes/1024/1024) "UNDO_SIZE"
FROM v$datafile a,
v$tablespace b,
dba_tablespaces c
WHERE c.contents = 'UNDO'
AND c.status = 'ONLINE'
AND b.name = c.tablespace_name
AND a.ts# = b.ts#;
UNDO_SIZE
----------
209715200
Undo Blocks per Second
SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
"UNDO_BLOCK_PER_SEC"
FROM v$undostat;
UNDO_BLOCK_PER_SEC
-----------------3.12166667
DB Block Size
SELECT TO_NUMBER(value) "DB_BLOCK_SIZE [KByte]"
FROM v$parameter
WHERE name = 'db_block_size';
DB_BLOCK_SIZE [Byte]
-------------------4096
Optimal Undo Retention
209'715'200 / (3.12166667 * 4'096) = 16'401 [Sec]
Using Inline Views, you can do all in one query!
SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]",
SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
ROUND((d.undo_size / (to_number(f.value) *
g.undo_block_per_sec))) "OPTIMAL UNDO RETENTION [Sec]"
FROM (
SELECT SUM(a.bytes) undo_size
FROM v$datafile a,
v$tablespace b,
dba_tablespaces c
WHERE c.contents = 'UNDO'
AND c.status = 'ONLINE'
AND b.name = c.tablespace_name
AND a.ts# = b.ts#
) d,
v$parameter e,
v$parameter f,
(
SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
undo_block_per_sec
FROM v$undostat
) g
WHERE e.name = 'undo_retention'
le from dba_data_files
where tablespace_name='&tablespace_name' order by file_name ;
To list a specific datafile space details using file_id
col file_name for a40
set pagesize 100
select tablespace_name,file_name,bytes/1024/1024,maxbytes/1024/1024,autoextensib
le from dba_data_files
where file_id=128 order by file_name;
Space left to extend for autoextensible files in a mount point
(replace File_name variable to the associated mountpoint)
col file_name for a40
set lines 170 pages 0
BREAK on REPORT
compute SUM of space_left_to_extend on report
select tablespace_name,file_name,bytes/1024/1024,maxbytes/1024/1024,autoextensib
le,(maxbytes/1024/1024)-(bytes/1024/1024) space_left_to_extend from dba_data_fil
es
where file_name like '%/u01/oradata/%' and autoextensible='YES' order by file_na
me;
To check autoextendable files of a mountpoint
col file_name for a40
set pagesize 100
select tablespace_name,file_name,bytes/1024/1024 ,maxbytes/1024/1024,autoextensi
ble from dba_data_files
where file_name like '%/tbarti/oradata%' and autoextensible='YES' order by file_
name;
To check Current size of an autoextendable file
col file_name for a40
set pagesize 100
select SUM(bytes/1024/1024) from dba_data_files
where file_name like '%/tmzg1s/oradata%' and autoextensible='YES';
To check Total space that is supposed to be extendable for autoextensible files
of a mountpoint
col file_name for a40
set pagesize 100
select (SUM(maxbytes/1024/1024)-SUM(bytes/1024/1024)) EXTENSIBLESIZE from dba_da
ta_files
where file_name like '%/tmzg1s/oradata%' and autoextensible='YES';
order by a.tsdf;
To add a datafile to a given tablespace manually
alter tablespace &tablespace_name add datafile '&filefullpath' size 200M autoext
end on next 20M maxsize 1800M;
alter tablespace INDEX1 add datafile '/oradata12/ora816/SLA2/database/index1_26.
dbf' size 1024M;
To resize a datafile of a given tablespace
For autoextensible file
alter database datafile '&filefullpath' autoextend on next 20M maxsize 1800M;
For static file without autoextension
alter database datafile '/SID/oradata/data01/a_txn_data01.dbf' resize 1800M;
Example
alter database datafile '/SID/oradata/data01/statsdata02.dbf' resize 1800M;
alter database datafile '/SID/oradata/data01/a_nolog01.dbf' autoextend on maxsiz
e 120M;
alter database datafile '/SID/oradata/data03/ard198.dbf' autoextend off;
AND d.tablespace_name=upper('&TABLESPACE_NAME');
set lines 152
col file_name for a50
col TBS_NAME for a15
col "% FREE" FOR 999.99
select tablespace_name TBS_NAME,
(BYTES/1024)/1024 "Used(MB)",
total "allocated size(MB)",
maxi "max allowable(MB)",
maxi-(BYTES/1024)/1024 "effect_free(MB)",
--maxi-total "free(MB)",
round(((maxi-(BYTES/1024)/1024)/maxi)*100,2) "% FREE"
from
SM$TS_USED,(select sum((BYTES/1024)/1024)
total,sum((decode(MAXBYTES,0,bytes,maxbytes)/1024)/1024) maxi from
dba_data_files where tablespace_name in UPPER('&tablespace')) where
tablespace_name in upper('&tablespace');
select tablespace_name from dba_tablespaces where tablespace_name like '%&TABLES
PACE_NAME%';
FIND 25% LESS FREE SPACE
prompt Checking tablespace free space size less than 15% of total size
SELECT
d.tablespace_name,
(a.bytes - NVL(f.bytes,0))/1024/1024 "Used Space(MB)",
a.bytes/1024/1024 "allocated size(MB)",
a.maxbytes/1024/1024 "maximum allowable (MB)",
(NVL(f.bytes,0) + (a.maxbytes - a.bytes))/1024/1024 "effective free(MB)",
100-round(((a.bytes - NVL(f.bytes,0))*100/a.maxbytes),2) "%FREE"
FROM
sys.dba_tablespaces d,
(select tablespace_name, sum(bytes) bytes,
sum(greatest(maxbytes,bytes)) maxbytes
from sys.dba_data_files group by tablespace_name) a,
(select tablespace_name,
sum(bytes) bytes
from sys.dba_free_space group by tablespace_name) f
WHERE d.tablespace_name = a.tablespace_name(+)
AND d.tablespace_name = f.tablespace_name(+)
and (100-round(((a.bytes - NVL(f.bytes,0))*100/a.maxbytes),2)) <= 75
AND NOT (d.extent_management = 'LOCAL' AND d.contents = 'TEMPORARY');
To check freespace in the tablespace
select
a.tsdf tblspace,
a.file_space totspace,
nvl(b.free_space,0) tfsspace,
a.extn_space extspace,
round(((a.extn_space - (a.file_space - nvl(b.free_space,0)))/a.extn_space)*100,2
) pctfrees
from
(select tablespace_name tsdf,sum(bytes)/1048576 file_space,sum(decode(maxbytes,0
,bytes,maxbytes))/1048576 extn_space
from dba_data_files group by tablespace_name) a,
(select tablespace_name tsfs,sum(bytes)/1048576 free_space,max(bytes)/1048576 ma
x_chunk from dba_free_space group by
tablespace_name) b
where
a.tsdf = b.tsfs (+) and
a.tsdf like upper('%&TableSpace%')
and round(((a.extn_space - (a.file_space - nvl(b.free_space,0)))/a.extn_space)*1
00,2) < &PcFree
order by a.tsdf;
SELECT
d.tablespace_name,
(a.bytes - NVL(f.bytes,0))/1024/1024 "Used Space(MB)",
a.bytes/1024/1024 "allocated size(MB)",
a.maxbytes/1024/1024 "maximum allowable (MB)",
(NVL(f.bytes,0) + (a.maxbytes - a.bytes))/1024/1024 "effective free(MB)",
100-round(((a.bytes - NVL(f.bytes,0))*100/a.maxbytes),2) "%FREE"
FROM
sys.dba_tablespaces d,
(select tablespace_name, sum(bytes) bytes,
sum(greatest(maxbytes,bytes)) maxbytes
from sys.dba_data_files group by tablespace_name) a,
(select tablespace_name,
sum(bytes) bytes
from sys.dba_free_space group by tablespace_name) f
WHERE d.tablespace_name = a.tablespace_name(+)
AND d.tablespace_name = f.tablespace_name(+)
AND NOT (d.extent_management = 'LOCAL' AND d.contents = 'TEMPORARY')
AND round(((NVL(f.bytes,0) + (a.maxbytes - a.bytes))/1048576),2) <2000
AND round(((a.bytes - NVL(f.bytes,0))*100/a.maxbytes),2) <75
order by 6 desc;
SM$TS_USED,(select sum((BYTES/1024)/1024)
total,sum((decode(MAXBYTES,0,bytes,maxbytes)/1024)/1024) maxi from
dba_data_files where tablespace_name in UPPER('&&tbs')) where
tablespace_name in upper('&tbs');
select file_name,bytes/1024/1024,maxbytes/1024/1024,autoextensible
from dba_data_files where tablespace_name=upper('&tbs') order by file_name;
Changing maxsize for all the files whose size is set more than maxsize
set linesize 152
select 'alter database datafile ' || ''''|| a.file_name||'''' || ' autoextend o
n maxsize ' || a.maxsize || 'M;'
from
(select file_name,bytes/1024/1024 maxsize,maxbytes/1024/1024 ,autoextensible
from dba_data_files where tablespace_name in ('')
and maxbytes<bytes and autoextensible='YES' order by file_name) a ;
Changing bytes for all the files which have size less than 20MB
set linesize 152
select 'alter database datafile ' || ''''|| file_name||'''' || ' size 50M ;'
from dba_data_files
where bytes/1024/1024< 20 order by file_name ;
Freespace in tablespaces in MB
set lines 152
set pages 1000
select
utbs.tablespace_name,
round(utbs.mb) "Allocated Used/Unused MB",
round(Ftbs.mb) "Allocated_Free MB",
round((100/utbs.mb)*Ftbs.mb) "%Allocated_Free MB",
round(utbs.Maxmb-utbs.mb) "Space_AutoExtensible MB"
from
(select ddf.tablespace_name,sum(ddf.bytes)/1048576 MB,sum(ddf.maxbytes)/1048576
MaxMB
from dba_data_files ddf
group by ddf.tablespace_name) Utbs,
(select dfs.tablespace_name,sum(dfs.bytes)/1048576 MB
set
set
col
col
col
col
col
col
col
col
linesize 150
pagesize 1000
name for a50
parameter for a30
value for a30
member for a50
DATAFILE_NAME for a70
TEMPFILE_NAME for a70
CONTROLFILE_NAME for a70
LOGFILE_MEMBER for a70
=======================================================
col name for a90
select * from v$controlfile
To get the TEMPFILES SIZE from the database
=============================================
select tablespace_name,file_name,bytes/1024/1024 "SIZE_IN_MB" from dba_temp_file
s order by file_name asc;
segment_type
owner
segment_name
partition_name
tablespace_name
bytes
extents
FORMAT
FORMAT
FORMAT
FORMAT
FORMAT
FORMAT
FORMAT
A20
A15
A30
A30
A20
9,999,999,999,999
999,999,999
HEADING
HEADING
HEADING
HEADING
HEADING
HEADING
HEADING
'Segment Type'
'Owner'
'Segment Name'
'Partition Name'
'Tablespace Name'
'Size (in bytes)'
'Extents'
SELECT
a.segment_type
segment_type
, a.owner
owner
, a.segment_name
segment_name
, a.partition_name
partition_name
, a.tablespace_name tablespace_name
, a.bytes
bytes
, a.extents
extents
FROM
(select
b.segment_type
, b.owner
, b.segment_name
, b.partition_name
, b.tablespace_name
, b.bytes
, b.extents
from
dba_segments b
order by
b.bytes desc
) a
WHERE
rownum < 101
ORDER BY
segment_type, bytes desc, owner, segment_name
/
Posted by Suresh Kumar at 5:32 PM No comments: Links to this post
Labels: DB Scripts
To check for index fragmentation
-- +-----------------------------------------------------------------------------+
-- | PURPOSE : To check for index fragmentation. As a rule of thumb if 10-15%
|
-- |
of the table data changes, then you should consider rebuilding t
he index |
-- +------------------------------------------------------------------------------+
ANALYZE INDEX &&index_name VALIDATE STRUCTURE;
COL
COL
COL
COL
name
del_lf_rows
lf_rows_used
ibadness
SELECT
name
HEADING
HEADING
HEADING
HEADING
'Index Name'
'Deleted|Leaf Rows'
'Used|Leaf Rows'
'% Deleted|Leaf Rows'
FORMAT
FORMAT
FORMAT
FORMAT
a30
99999999
99999999
999.99999
, del_lf_rows
, lf_rows - del_lf_rows lf_rows_used
, TO_CHAR( del_lf_rows /(DECODE(lf_rows,0,0.01,lf_rows))*100,'999.99999') ibad
ness
FROM index_stats
/
prompt
prompt Consider rebuilding any index if % of Deleted Leaf Rows is > 20%
prompt
undefine index_name
Posted by Suresh Kumar at 5:30 PM No comments: Links to this post
Labels: DB Scripts
Report free space fragmentation
-- +---------------------------------------------------------------------------+
-- | PURPOSE : Report free space fragmentation.
|
-- |
THIS SCRIPT MUST BE RUN AS THE SYS USER!!!
|
-- +---------------------------------------------------------------------------+
connect / as sysdba
CREATE OR REPLACE VIEW free_space (
tablespace
, pieces
, free_bytes
, free_blocks
, largest_bytes
, largest_blks
, fsfi
, data_file
, file_id
, total_blocks
)
AS
SELECT
a.tablespace_name
, COUNT(*)
, SUM(a.bytes)
, SUM(a.blocks)
, MAX(a.bytes)
, MAX(a.blocks)
, SQRT(MAX(a.blocks)/SUM(a.blocks))*(100/SQRT(SQRT(count(a.blocks))))
, UPPER(b.file_name)
, MAX(a.file_id)
, MAX(b.blocks)
FROM
sys.dba_free_space a
, sys.dba_data_files b
WHERE
a.file_id = b.file_id
GROUP BY
a.tablespace_name, b.file_name
/
CLEAR COLUMNS
SET
SET
SET
SET
LINESIZE
PAGESIZE
FEEDBACK
VERIFY
120
9999
off
off
SUM
SUM
SUM
SUM
OF
OF
OF
OF
total_blocks
free_blocks
free_blocks
total_blocks
tablespace
file_id
pieces
free_bytes
free_blocks
largest_bytes
largest_blks
data_file
total_blocks
HEADING
HEADING
HEADING
HEADING
HEADING
HEADING
HEADING
HEADING
HEADING
ON
ON
ON
ON
tablespace
tablespace
report
report
"Tablespace"
File#
Frag
'Free Byte'
'Free Blk'
'Biggest Bytes'
'Biggest Blks'
'File Name'
'Total Blocks'
FORMAT a15
FORMAT 99999
FORMAT 9999
FORMAT 999,999,999
FORMAT 999,999,999
FORMAT a45
FORMAT 999,999,999
SELECT
tablespace
, data_file
, pieces
, free_blocks
, largest_blks
, file_id
, total_blocks
FROM
free_space
/
DROP VIEW free_space
/
Posted by Suresh Kumar at 4:44 PM No comments: Links to this post
Labels: DB Scripts
List all currently connected user sessions ordered by current PGA size
-- +------------------------------------------------------------------------------------+
-- | PURPOSE : List all currently connected user sessions ordered by current PG
A size |
-- +------------------------------------------------------------------------------------+
SET LINESIZE 145
SET PAGESIZE 9999
COLUMN
COLUMN
COLUMN
USTIFY
COLUMN
USTIFY
COLUMN
sid
serial_id
session_status
right
oracle_username
right
os_username
FORMAT 99999
FORMAT 999999
FORMAT a9
HEADING 'SID'
HEADING 'Serial#'
HEADING 'Status'
FORMAT a12
FORMAT a9
USTIFY
COLUMN
USTIFY
COLUMN
RUNC
COLUMN
USTIFY
COLUMN
COLUMN
COLUMN
COLUMN
right
os_pid
right
session_program
session_machine
right TRUNC
session_pga_memory
session_pga_memory_max
session_uga_memory
session_uga_memory_max
FORMAT 9999999
FORMAT a18
FORMAT a8
HEADING 'Machine'
FORMAT
FORMAT
FORMAT
FORMAT
HEADING
HEADING
HEADING
HEADING
9,999,999,999
9,999,999,999
9,999,999,999
9,999,999,999
'PGA
'PGA
'UGA
'UGA
Memory'
Memory Max'
Memory'
Memory MAX'
prompt
prompt +----------------------------------------------------+
prompt | User Sessions Ordered by Current PGA Size
|
prompt +----------------------------------------------------+
SELECT
s.sid
sid
, s.serial#
serial_id
, lpad(s.status,9)
session_status
, lpad(s.username,12) oracle_username
, lpad(s.osuser,9)
os_username
, lpad(p.spid,7)
os_pid
, s.program
session_program
, lpad(s.machine,8)
session_machine
, sstat1.value
session_pga_memory
, sstat2.value
session_pga_memory_max
, sstat3.value
session_uga_memory
, sstat4.value
session_uga_memory_max
FROM
v$process p
, v$session s
, v$sesstat sstat1
, v$sesstat sstat2
, v$sesstat sstat3
, v$sesstat sstat4
, v$statname statname1
, v$statname statname2
, v$statname statname3
, v$statname statname4
WHERE
p.addr (+)
= s.paddr
AND s.sid
= sstat1.sid
AND s.sid
= sstat2.sid
AND s.sid
= sstat3.sid
AND s.sid
= sstat4.sid
AND statname1.statistic# = sstat1.statistic#
AND statname2.statistic# = sstat2.statistic#
AND statname3.statistic# = sstat3.statistic#
AND statname4.statistic# = sstat4.statistic#
AND statname1.name
= 'session pga memory'
AND statname2.name
= 'session pga memory max'
AND statname3.name
= 'session uga memory'
AND statname4.name
= 'session uga memory max'
ORDER BY session_pga_memory DESC
/
Posted by Suresh Kumar at 4:42 PM No comments: Links to this post
Labels: DB Scripts
List all currently connected user sessions ordered by Logical I/O
-- +-------------------------------------------------------------------------------+
-- | PURPOSE : List all currently connected user sessions ordered by Logical I/O |
-- +-------------------------------------------------------------------------------+
SET LINESIZE 145
SET PAGESIZE 9999
COLUMN sid
COLUMN serial_id
COLUMN session_status
FY right
COLUMN oracle_username
FY right
COLUMN os_username
FY right
COLUMN os_pid
FY right
COLUMN session_program
COLUMN session_machine
FY right TRUNC
COLUMN logical_io
COLUMN physical_reads
COLUMN physical_writes
FORMAT 99999
FORMAT 999999
FORMAT a9
HEADING 'SID'
HEADING 'Serial#'
HEADING 'Status'
JUSTI
FORMAT a12
JUSTI
FORMAT a9
JUSTI
FORMAT 9999999
JUSTI
FORMAT a18
FORMAT a8
prompt
prompt +----------------------------------------------------+
prompt | User Sessions Ordered by Logical I/O
|
prompt +----------------------------------------------------+
SELECT
s.sid
, s.serial#
, lpad(s.status,9)
, lpad(s.username,12)
, lpad(s.osuser,9)
, lpad(p.spid,7)
, s.program
, lpad(s.machine,8)
, sstat1.value
+ sstat2.value
, sstat3.value
, sstat4.value
FROM
v$process p
, v$session s
, v$sesstat sstat1
, v$sesstat sstat2
, v$sesstat sstat3
, v$sesstat sstat4
, v$statname statname1
, v$statname statname2
, v$statname statname3
, v$statname statname4
WHERE
p.addr (+)
AND s.sid
AND s.sid
sid
serial_id
session_status
oracle_username
os_username
os_pid
session_program
session_machine
logical_io
physical_reads
physical_writes
= s.paddr
= sstat1.sid
= sstat2.sid
AND s.sid
= sstat3.sid
AND s.sid
= sstat4.sid
AND statname1.statistic# = sstat1.statistic#
AND statname2.statistic# = sstat2.statistic#
AND statname3.statistic# = sstat3.statistic#
AND statname4.statistic# = sstat4.statistic#
AND statname1.name
= 'db block gets'
AND statname2.name
= 'consistent gets'
AND statname3.name
= 'physical reads'
AND statname4.name
= 'physical writes'
ORDER BY logical_io DESC
/
Posted by Suresh Kumar at 4:38 PM No comments: Links to this post
Labels: DB Scripts
List all currently connected user sessions ordered by CPU time.
-- +---------------------------------------------------------------------------+
-- | DATABASE : Oracle |
-- | PURPOSE : List all currently connected user sessions ordered by CPU time. |
-- +---------------------------------------------------------------------------+
SET LINESIZE 145
SET PAGESIZE 9999
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
COLUMN
prompt
prompt +----------------------------------------------------+
prompt | User Sessions Ordered by CPU |
prompt +----------------------------------------------------+
SELECT
s.sid sid
, s.serial# serial_id
, lpad(s.status,9) session_status
, lpad(s.username,12) oracle_username
, lpad(s.osuser,9) os_username
, lpad(p.spid,7) os_pid
, s.program session_program
, lpad(s.machine,14) session_machine
, sstat.value cpu_value
FROM
v$process p
, v$session s
, v$sesstat sstat
, v$statname statname
WHERE
p.addr (+) = s.paddr
AND s.sid = sstat.sid
AND statname.statistic# = sstat.statistic#
AND statname.name = 'CPU used by this session'