Monitoring Scripts12
Monitoring Scripts12
Monitoring Scripts
SQL, PL/SQL Commands with Examples
Asfaw Gedamu
This guide outlines efficient methods for querying various database monitoring information in an
Oracle database, including commands, scripts, privileges required, and script execution details.
Privileges Required:
Most queries require SELECT privilege on relevant tables and views. Some might require
additional privileges like EXECUTE or ALTER SESSION.
Script 1:
Script 2:
select sesion.sid,
sesion.username,
optimizer_mode,
hash_value,
address,
cpu_time,
elapsed_time,
sql_text
from v$sqlarea sqlarea, v$session sesion
where sesion.sql_hash_value = sqlarea.hash_value
and sesion.sql_address = sqlarea.address
and sesion.username is not null;
2. Find Active Sessions in Oracle Database:
Script 1:
Script 2:
set echo off
set linesize 95
set head on
set feedback on
col sid head "Sid" form 9999 trunc
col serial# form 99999 trunc head "Ser#"
col username form a8 trunc
col osuser form a7 trunc
col machine form a20 trunc head "Client|Machine"
col program form a15 trunc head "Client|Program"
col login form a11
col "last call" form 9999999 trunc head "Last Call|In Secs"
col status form a6 trunc
select sid,serial#,substr(username,1,10)
username,substr(osuser,1,10) osuser,
substr(program||module,1,15) program,substr(machine,1,22)
machine,
to_char(logon_time,'ddMon hh24:mi') login,
last_call_et "last call",status
from gv$session where status='ACTIVE'
order by 1
/
Script 1:
SELECT sid, serial#, event_id, event_name, wait_time, timeouts
FROM v$session_wait;
Script 2:
SELECT a.sid,substr(b.username,1,10)
username,substr(b.osuser,1,10) osuser,
substr(b.program||b.module,1,15) program,substr(b.machine,1,22)
machine,
a.event,a.p1,b.sql_hash_value
from v$session_wait a,V$session b
where b.sid=a.sid
and a.event not in('SQL*Net message from client','SQL*Net
message to client',
'smon timer','pmon timer')
and username is not null
order by 6
/
Script 1:
Script 2:
select a.sid, a.serial#, a.username, b.used_urec
used_undo_record, b.used_ublk used_undo_blocks
from v$session a, v$transaction b
where a.saddr=b.ses_addr ;
Script 1:
SELECT sid, serial#, username, machine, temp_used
FROM v$session;
Script 2:
SELECT b.tablespace,
ROUND(((b.blocks*p.value)/1024/1024),2)||'M' AS temp_size,
a.inst_id as Instance,
a.sid||','||a.serial# AS sid_serial,
NVL(a.username, '(oracle)') AS username,
a.program,
a.status,
a.sql_id
FROM gv$session a,
gv$sort_usage b,
gv$parameter p
WHERE p.name = 'db_block_size'
AND a.saddr = b.session_addr
AND a.inst_id=b.inst_id
AND a.inst_id=p.inst_id
ORDER BY temp_size desc
/
Script 1:
Script 2:
set lines 2000
set pages 1000
col sid for 99999
col name for a09
col username for a14
col PROGRAM for a21
col MODULE for a25
select s.sid,sn.SERIAL#,n.name, round(value/1024/1024,2)
redo_mb, sn.username,sn.status,substr (sn.program,1,21)
"program", sn.type, sn.module,sn.sql_id
from v$sesstat s join v$statname n on n.statistic# =
s.statistic#
join v$session sn on sn.sid = s.sid where n.name like 'redo
size' and s.value!=0 order by
redo_mb desc;
Script 1:
Script 2:
col "Database Size" format a20
col "Free space" format a20
col "Used space" format a20
select round(sum(used.bytes) / 1024 / 1024 / 1024 ) || ' GB'
"Database Size"
, round(sum(used.bytes) / 1024 / 1024 / 1024 ) -
round(free.p / 1024 / 1024 / 1024) || ' GB' "Used space"
, round(free.p / 1024 / 1024 / 1024) || ' GB' "Free space"
from (select bytes
from v$datafile
union all
select bytes
from v$tempfile
union all
select bytes
from v$log) used
, (select sum(bytes) as p
from dba_free_space) free
group by free.p
/
8. Monitor Tablespace Usage:
Script 1:
Script 2:
set feedback off
set pagesize 70;
set linesize 2000
set head on
COLUMN Tablespace format a25 heading 'Tablespace Name'
COLUMN autoextensible format a11 heading 'AutoExtend'
COLUMN files_in_tablespace format 999 heading 'Files'
COLUMN total_tablespace_space format 99999999 heading
'TotalSpace'
COLUMN total_used_space format 99999999 heading 'UsedSpace'
COLUMN total_tablespace_free_space format 99999999 heading
'FreeSpace'
COLUMN total_used_pct format 9999 heading '%Used'
COLUMN total_free_pct format 9999 heading '%Free'
COLUMN max_size_of_tablespace format 99999999 heading
'ExtendUpto'
COLUM total_auto_used_pct format 999.99 heading 'Max%Used'
COLUMN total_auto_free_pct format 999.99 heading 'Max%Free'
WITH tbs_auto AS
(SELECT DISTINCT tablespace_name, autoextensible
FROM dba_data_files
WHERE autoextensible = 'YES'),
files AS
(SELECT tablespace_name, COUNT (*) tbs_files,
SUM (BYTES/1024/1024) total_tbs_bytes
FROM dba_data_files
GROUP BY tablespace_name),
fragments AS
(SELECT tablespace_name, COUNT (*) tbs_fragments,
SUM (BYTES)/1024/1024 total_tbs_free_bytes,
MAX (BYTES)/1024/1024 max_free_chunk_bytes
FROM dba_free_space
GROUP BY tablespace_name),
AUTOEXTEND AS
(SELECT tablespace_name, SUM (size_to_grow) total_growth_tbs
FROM (SELECT tablespace_name, SUM (maxbytes)/1024/1024
size_to_grow
FROM dba_data_files
WHERE autoextensible = 'YES'
GROUP BY tablespace_name
UNION
SELECT tablespace_name, SUM (BYTES)/1024/1024 size_to_grow
FROM dba_data_files
WHERE autoextensible = 'NO'
GROUP BY tablespace_name)
GROUP BY tablespace_name)
SELECT c.instance_name,a.tablespace_name Tablespace,
CASE tbs_auto.autoextensible
WHEN 'YES'
THEN 'YES'
ELSE 'NO'
END AS autoextensible,
files.tbs_files files_in_tablespace,
files.total_tbs_bytes total_tablespace_space,
(files.total_tbs_bytes - fragments.total_tbs_free_bytes
) total_used_space,
fragments.total_tbs_free_bytes total_tablespace_free_space,
round(( ( (files.total_tbs_bytes -
fragments.total_tbs_free_bytes)
/ files.total_tbs_bytes
)
* 100
)) total_used_pct,
round(((fragments.total_tbs_free_bytes / files.total_tbs_bytes)
* 100
)) total_free_pct
FROM dba_tablespaces a,v$instance c , files, fragments,
AUTOEXTEND, tbs_auto
WHERE a.tablespace_name = files.tablespace_name
AND a.tablespace_name = fragments.tablespace_name
AND a.tablespace_name = AUTOEXTEND.tablespace_name
AND a.tablespace_name = tbs_auto.tablespace_name(+)
order by total_free_pct;
9. Monitor Undo Tablespace Usage:
Script 1:
Script 2:
select a.tablespace_name, SIZEMB, USAGEMB, (SIZEMB - USAGEMB)
FREEMB
from (select sum(bytes) / 1024 / 1024 SIZEMB, b.tablespace_name
from dba_data_files a, dba_tablespaces b
where a.tablespace_name = b.tablespace_name
and b.contents = 'UNDO'
group by b.tablespace_name) a,
(select c.tablespace_name, sum(bytes) / 1024 / 1024 USAGEMB
from DBA_UNDO_EXTENTS c
where status <> 'EXPIRED'
group by c.tablespace_name) b
where a.tablespace_name = b.tablespace_name;
Script 1:
Script 2:
select a.tablespace_name tablespace,
d.TEMP_TOTAL_MB,
sum (a.used_blocks * d.block_size) / 1024 / 1024 TEMP_USED_MB,
d.TEMP_TOTAL_MB - sum (a.used_blocks * d.block_size) / 1024 /
1024 TEMP_FREE_MB
from v$sort_segment a,
(
select b.name, c.block_size, sum (c.bytes) / 1024 / 1024
TEMP_TOTAL_MB
from v$tablespace b, v$tempfile c
where b.ts#= c.ts#
group by b.name, c.block_size
) d
where a.tablespace_name = d.name
group by a.tablespace_name, d.TEMP_TOTAL_MB;
Script 1:
Script 2:
SELECT
s.inst_id,
s.blocking_session,
s.sid,
s.serial#,
s.seconds_in_wait
FROM
gv$session s
WHERE
blocking_session IS NOT NULL;
Script 1:
SELECT sid, serial#, sql_id, machine, username, elapsed_time
FROM v$sql
WHERE state = 'ACTIVE' AND last_call_et > <threshold_seconds>;
Script 2:
select
sid,inst_id,opname,totalwork,sofar,start_time,time_remaining
from gv$session_longops
where totalwork<>sofar
/
Script 1:
Script 2:
col session_id head 'Sid' form 9999
col object_name head "Table|Locked" form a30
col oracle_username head "Oracle|Username" form a10 truncate
col os_user_name head "OS|Username" form a10 truncate
col process head "Client|Process|ID" form 99999999
col mode_held form a15
select lo.session_id,lo.oracle_username,lo.os_user_name,
lo.process,do.object_name,
decode(lo.locked_mode,0, 'None',1, 'Null',2, 'Row Share (SS)',
3, 'Row Excl (SX)',4, 'Share',5, 'Share Row Excl (SSX)',6,
'Exclusive',
to_char(lo.locked_mode)) mode_held
from v$locked_object lo, dba_objects do
where lo.object_id = do.object_id
order by 1,5
/
14. Find Queries Triggered from a Procedure:
Script 1:
Script 2:
--Below script will provide the dependent queries getting
--triggered from a procedure.
Script 1:
Script 2:
set lines 123
col USERNAME for a15
col OSUSER for a8
col MACHINE for a15
col PROGRAM for a20
select b.spid, a.username, a.program , a.osuser ,a.machine,
a.sid, a.serial#, a.status from gv$session a, gv$process b
where addr=paddr(+) and sid=&sid;
16. Kill All Sessions of a User:
Script 1:
Script 2:
BEGIN
FOR r IN (select sid,serial# from v$session where username =
'TEST_ANB')
LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid
|| ',' || r.serial# || '''';
END LOOP;
END;
/
Script 1:
Script 2:
select 'alter system kill session ' ||''''||SID||','||SERIAL#||'
immediate ;' from v$session
where sql_id='&sql_id';
--FOR RAC
select 'alter system kill session '
||''''||SID||','||SERIAL#||',@'||inst_id||''''||' immediate ;'
from gv$session where sql_id='&sql_id'
18. Get Parallel Query Detail (Requires SELECT ANY TABLE privilege):
Script 1:
Script 2:
Script 1:
Script 2:
--It will generate kill session statements for all snipped
sessions:
select 'alter system kill session '''||sid||','||serial#||'''
immediate;' from v$session where status='SNIPED' ;
20. Top Query with High Elapsed Time (Requires SELECT ANY TABLE privilege):
Script 1:
Script 2:
--Queries in last 1 hour ( Preferred to run from Toad, for
proper view)
Select
module,parsing_schema_name,inst_id,sql_id,CHILD_NUMBER,sql_plan_
baseline,sql_profile,plan_hash_value,sql_fulltext,
to_char(last_active_time,'DD/MM/YY HH24:MI:SS' ),executions,
elapsed_time/executions/1000/1000,
rows_processed,sql_plan_baseline from gv$sql where
last_active_time>sysdate-1/24
and executions <> 0 order by elapsed_time/executions desc
Script 1:
Script 2:
select
s.inst_id,
decode(px.qcinst_id,NULL,s.username,
' - '||lower(substr(s.program,length(s.program)-4,4)
) ) "Username",
decode(px.qcinst_id,NULL, 'QC', '(Slave)') "QC/Slave" ,
to_char( px.server_set) "Slave Set",
to_char(s.sid) "SID",
decode(px.qcinst_id, NULL ,to_char(s.sid) ,px.qcsid) "QC
SID",
px.req_degree "Requested DOP",
px.degree "Actual DOP", p.spid
from
gv$px_session px,
gv$session s, gv$process p
where
px.sid=s.sid (+) and
px.serial#=s.serial# and
px.inst_id = s.inst_id
and p.inst_id = s.inst_id
and p.addr=s.paddr
order by 5 , 1 desc
22. Find Locked Objects (Requires SELECT ANY TABLE privilege):
Script 1:
Script 2:
SET PAGESIZE 1000
SET VERIFY OFF
COLUMN owner FORMAT A20
COLUMN username FORMAT A20
COLUMN object_owner FORMAT A20
COLUMN object_name FORMAT A30
COLUMN locked_mode FORMAT A15
SELECT b.inst_id,
b.session_id AS sid,
NVL(b.oracle_username, '(oracle)') AS username,
a.owner AS object_owner,
a.object_name,
Decode(b.locked_mode, 0, 'None',
1, 'Null (NULL)',
2, 'Row-S (SS)',
3, 'Row-X (SX)',
4, 'Share (S)',
5, 'S/Row-X (SSX)',
6, 'Exclusive (X)',
b.locked_mode) locked_mode,
b.os_user_name
FROM dba_objects a,
gv$locked_object b
WHERE a.object_id = b.object_id
ORDER BY 1, 2, 3, 4;
SET PAGESIZE 14
SET VERIFY ON
SET VERIFY ON
Script 2:
--Current open cursor
select a.value, s.username, s.sid, s.serial#
from v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic# and s.sid=a.sid
and b.name = 'opened cursors current';
--Max allowed open cursor and total open cursor
select max(a.value) as highest_open_cur, p.value as max_open_cur
from v$sesstat a, v$statname b, v$parameter p
where a.statistic# = b.statistic# and b.name = 'opened cursors
current'
and p.name= 'open_cursors'
group by p.value;
24. Session Login History from ASH (Requires SELECT ANY TABLE privilege):
Script 1:
Script 2:
select c.username,a.SAMPLE_TIME, a.SQL_OPNAME, a.SQL_EXEC_START,
a.program, a.module, a.machine, b.SQL_TEXT
from DBA_HIST_ACTIVE_SESS_HISTORY a, dba_hist_sqltext b,
dba_users c
where a.SQL_ID = b.SQL_ID(+)
and a.user_id=c.user_id
and c.username='&username'
order by a.SQL_EXEC_START asc;
Script 1:
SELECT 1 - (dbms_buffer_cache.get_miss_ratio) * 100 AS hit_ratio
FROM DUAL;
Script 2:
SELECT ROUND((1-(phy.value / (cur.value + con.value)))*100,2)
"Cache Hit Ratio"
FROM v$sysstat cur, v$sysstat con, v$sysstat phy
WHERE cur.name = 'db block gets'
AND con.name = 'consistent gets'
AND phy.name = 'physical reads'
/
26. Find Top Disk Reads by User (Requires SELECT ANY TABLE privilege):
Script 1:
Script 2:
select username users, round(DISK_READS/Executions)
DReadsExec,Executions Exec, DISK_READS DReads,sql_text
from gv$sqlarea a, dba_users b
where a.parsing_user_id = b.user_id
and Executions > 0
and DISK_READS > 100000
order by 2 desc;
27. Get OS PID from SID (Requires SELECT ANY TABLE privilege):
Script 1:
28. Get Active SID of a PL/SQL Object (Requires SELECT ANY TABLE privilege):
Script 1:
Script 2:
select sid, sql_id,serial#, status, username, program
from v$session
where PLSQL_ENTRY_OBJECT_ID in (select object_id
from dba_objects
where object_name in ('&PROCEDURE_NAME'));
29. Find Buffer Cache Usage (Requires SELECT ANY TABLE privilege):
Script 1:
30. Monitor Rollback Transactions (Requires SELECT and Alter ANY TABLE privilege):
Script 1:
31. Find Column Usage Statistics (Requires SELECT ANY TABLE privilege):
Script 1:
32. Get Background Process Details (Requires SELECT ANY TABLE privilege):t
Script 1:
Script 1:
Script 2:
select
length(addr)*4 || '-bits' word_length
from v$process
where ROWNUM =1;
Script 1:
Script 1:
Script 1:
Execution:
Script 2:
--export parfile
dumpfile=test.dmp
logfile=EXPLOG:test.log
directory=SOURCE_DUMP
tables=dbatest.EMPTAB
exclude=statistics
Script 1:
-- Oracle:
SELECT *
FROM table (DBMS_XPLAN.DISPLAY_CURSOR(sql_id => '<sql_id>'));
Script 2:
--First get the child number of the sql_id .One sql_id can have
multiple child number( one for each plan_hash_value)
SQL> select sql_id,child_number,plan_hash_value from gv$sql
where sql_id='9n2a2c8pvu6bm';
SQL_ID CHILD_NUMBER PLAN_HASH_VALUE
------------- ------------ ---------------
9n2a2c8pvu6bm 1 13761463
--Now get the explain plan for cursor:
SELECT * from
TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sqlid',&child_number));
38. Explain Plan of SQL_ID from AWR (Privilege: SELECT on dba_hist_sqlstat (Oracle)):
Script 1:
-- Oracle:
SELECT *
FROM table (DBMS_XPLAN.DISPLAY_AWR(sql_id => '<sql_id>',
plan_hash_value => <plan_hash_value>));
Script 2:
Script 1:
-- Oracle:
SELECT sql_text
FROM v$sql
WHERE sid = <sid>;
-- SQL Server:
SELECT text
FROM sys.dm_exec_query_stats
WHERE session_id = <sid>
Script 2:
Script 1:
-- Oracle:
EXPLAIN PLAN FOR SELECT * FROM <table_name>;
-- SQL Server:
SET STATISTICS IO ON;
SELECT * FROM <table_name>;
SET STATISTICS IO OFF;
Script 2:
Script 1:
-- Oracle:
SELECT * FROM table
(DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE('<baseline_name>'));
Script 2:
--- SYNTAX
-- SELECT *
FROM TABLE(DBMS_XPLAN.display_sql_plan_baseline(plan_name=>'<S
QL BASELINE NAME>'));
SELECT *
FROM TABLE(DBMS_XPLAN.display_sql_plan_baseline(plan_name=>'SQ
L_PLAN_gbhrw1v44209a5b2f7514'));
Script 1:
-- Oracle:
SELECT *
FROM v$sql_bind_values
WHERE sql_id = '<sql_id>';
Script 2:
SELECT
sql_id,
b. LAST_CAPTURED,
t.sql_text sql_text,
b.HASH_VALUE,
b.name bind_name,
b.value_string bind_value
FROM
gv$sql t
JOIN
gv$sql_bind_capture b using (sql_id)
WHERE
b.value_string is not null
AND
sql_id='&sqlid'
/
Script 1:
-- Oracle:
DBMS_SQL.CLOSE_CURSOR(<cursor_id>);
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
EXEC DBMS_SYSTEM.set_sql_trace_in_session(sid=>321,
serial#=>1234, sql_trace=>FALSE);
--Get the trace file name
SELECT p.tracefile FROM v$session s JOIN v$process p ON s.paddr
= p.addr WHERE s.sid = 321;
Script 1:
ALTER SESSION SET EVENTS '10053 trace optimizer' SCOPE=SESSION;
Script 2:
Begin
dbms_sqldiag.dump_trace(p_sql_id=>'dmx08r6ayx800',
p_child_number=>0,
p_component=>'Compiler',
p_file_id=>'TEST_OBJ3_TRC');
END;
/
Script 1:
SELECT *
FROM v$sql s
JOIN dba_hist_sql_statements h ON s.sql_id = h.sql_id
WHERE s.sql_id = '<SQL_ID>';
Script 2:
SELECT
module,parsing_schema_name,inst_id,sql_id,plan_hash_value,child_
number,sql_fulltext,
to_char(last_active_time,'DD/MM/YY HH24:MI:SS'
),sql_plan_baseline,executions,
elapsed_time/executions/1000/1000,rows_processed from gv$sql
where sql_id in ('&sql_id');
Script 1:
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
Script 1:
Script 2:
62. Queries Causing High Physical Read (SELECT on v$sql and v$sql_plan):
Script 1:
Script 2:
Script 1:
64. Latch Type and SQL Hash Value (SELECT on v$latch, v$latchholder):
Script 1:
Script 2:
Set lines 160 pages 100
Column event format A35
Column name format A35
select x.event, x.sql_hash_value,
case when x.event like 'latch%' then
l.name
else ' '
end name,
x.cnt from (
select substr(w.event, 1, 28) event, s.sql_hash_value,
w.p2,count(*) cnt
from v$session_wait w, v$session s, v$process p
where s.sid=w.sid
and p.addr = s.paddr
and s.username is not null
and w.event not like '%pipe%'
and w.event not like 'SQL*%'
group by substr(w.event, 1, 28), sql_hash_value,w.p2
) x,
v$latch l
where
x.p2 = l.latch#(+)
order by cnt;
Script 1:
Script 2:
-- Oracle:
DECLARE
CURSOR c_sql_stats IS
SELECT sql_id, sql_text
FROM v$sql
WHERE cursor_cache# IS NOT NULL;
l_sql_id VARCHAR2(30);
l_sql_text VARCHAR2(4000);
BEGIN
OPEN c_sql_stats;
LOOP
FETCH c_sql_stats INTO l_sql_id, l_sql_text;
EXIT WHEN c_sql_stats%NOTFOUND;
Script 2:
Script 1:
-- Oracle:
BEGIN
DBMS_RESOURCE_MANAGER.RUN_TARGET_ADVISORY(
target_type => 'SGA_TARGET',
advisor_name => 'SGA_TARGET_ADVISOR',
advisor_task_name => 'SGA_TARGET_ADVISORY'
);
END;
/
Script 2:
Script 1:
-- Oracle:
BEGIN
DBMS_RESOURCE_MANAGER.RUN_TARGET_ADVISORY(
target_type => 'SHARED_POOL_TARGET',
advisor_name => 'SHARED_POOL_ADVISOR',
advisor_task_name => 'SHARED_POOL_ADVISORY'
);
END;
/
Script 2:
Script 1:
-- Oracle:
DBMS_SNAPSHOT.CREATE_SNAPSHOT(<snap_id>, AS OF SYSDATE -
<retention_days>);
-- Oracle:
DBMS_AWRM.RUN_REPORT(
report_type => DBMS_AWRM.REPORT_TYPE_ADDM,
snap_id => <snap_id>, -- Replace with the snapshot ID
instance_number => DBMS_AWRM.INSTANCE_NUMBER,
output_file => 'addm_report.sql'
);
cd $ORACLE_HOME/rdbms/admin
SQL> @addm_report.sql
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 1058
Begin Snapshot Id specified: 1058
Enter value for end_snap: 1059
End Snapshot Id specified: 1059
Remember:
• Adjust the scripts and privileges based on your specific database platform.
• Be cautious granting EXECUTE privileges on packages like DBMS_SQLTUNE and
DBMS_RESOURCE_MANAGER.
• Consider performance implications before running resource-intensive queries on
production systems.
Additional Tips:
• Consider using tools and utilities provided by Oracle for comprehensive monitoring and
performance analysis.
• Regularly review and adapt your monitoring strategy based on your specific needs and
performance goals.
• Optimize your queries for efficiency by utilizing appropriate indexes, views, and filtering
techniques.
By following these guidelines and using the provided queries and scripts, you can efficiently
monitor various aspects of your Oracle database environment. Remember to adapt the
information and commands based on your specific context and database configuration.