# Copyright (c) 2013, 2016, Liang Guojun. All rights reserved.
# Check Oracle Database Command.
case $1 in
#==============================================================================
# -help
#==============================================================================
-help)
echo " "
echo "Copyright (c) 2013, 2016, Liang Guojun. All rights reserved."
echo " "
echo "Usage:";
echo " -help ---Print this help info."
echo "============================================="
echo " database general check"
echo "============================================="
echo " -log db <N> ---List database alert log last N rows."
echo " -active ---List active session."
echo " -longops ---List long run query."
echo " -tran ---List all the transactions."
echo " -param <pattern> ---List Oracle parameters."
echo " -param_ <pattern> ---List Oracle hidden parameters."
echo " -size <owner> <tabname> ---List size of tables/indexes."
echo " -segment <size> ---List Segment large than given size."
echo " -tbs info ---List tablespace basic information."
echo " -tbs rate ---List statistics tablespace usage rate."
echo " -tbs file ---List datafile."
echo " -objlike <owner> <pattern> ---List object by name pattern."
echo " -tablike <owner> <pattern> ---List table by name pattern."
echo " -tstat <owner> <tabname> ---List table statistics."
echo " -tabpart <owner> <tabname> ---List table partitions."
echo " -istat <owner> <tabname> ---List index statistics."
echo " -ipstat <owner> <tabname> ---List index partition statistics."
echo " -idxdesc <owner> <tabname> ---List index structure."
echo " -ddl <owner> <object_type> <name> ---List the create object sql."
echo " -flash ---List flashbackup infomation."
echo " -lock ---List lock infomation."
echo " -lockwait ---List lock wait infomation."
echo " -sqltext <SQL_ID> ---List SQL Text by SQL_ID."
echo " -sql spid <SPID> ---List SQL_ID/username/SQL_TEXT by OS spid."
echo " -sql plan <SQL_ID> [child_number] ---List SQL explain plan infomation."
echo " -sql hist <SQL_ID> ---List history of SQL explain plan infomation."
echo " -topevent ---List top event."
echo "============================================="
echo " RAC/ASM check"
echo "============================================="
echo " -asmfree ---List ASM disk user and free space."
echo " -adinfo ---List ASM disk comment information."
echo "============================================="
echo " Data Guard check"
echo "============================================="
echo " -dgarc ---List Data Guard archivelog applied status."
echo " -dgs ---List Data Guard status."
echo " -dgp ---List Data Guard process status."
echo " -dge ---List Data Guard archive dest error."
echo " -dggap ---List Data Guard GAP."
echo " -dglag ---List Data Guard lag."
echo " "
;;
#=====================
# End of -help
#=====================
#==============================================================================
# -log
#==============================================================================
-log)
case $2 in
#------------------------------------------------------------
# db
#------------------------------------------------------------
db)
sqlalert=`sqlplus -S / as sysdba <<EOF
col name format a18
col value format a55
select value from v\\$diag_info where name ='Diag Trace';
exit;
EOF`
alertpath=`echo $sqlalert | cut -d " " -f 3`
export myoraclesido=$ORACLE_SID
tail -n $3 $alertpath/alert_$myoraclesido.log
;;
#---------------------
# End of adb
#---------------------
esac
;;
#=====================
# End of -log
#=====================
#==============================================================================
# -active
#==============================================================================
-active)
sqlplus -S / as sysdba <<EOF
set linesize 140
set pagesize 999
col sid format 9999
col s# format 99999
col username format a10
col event format a30
col machine format a20
col p123 format a18
col wt format 999
col SQL_ID for a18
alter session set cursor_sharing=force;
SELECT /* XJ LEADING(S) FIRST_ROWS */
S.SID,
S.SERIAL# S#,
P.SPID,
NVL(S.USERNAME, SUBSTR(P.PROGRAM, LENGTH(P.PROGRAM) - 6)) USERNAME,
S.MACHINE,
S.EVENT,
S.P1 || '/' || S.P2 || '/' || S.P3 P123,
S.WAIT_TIME WT,
NVL(SQL_ID, S.PREV_SQL_ID) SQL_ID
FROM V\$PROCESS P, V\$SESSION S
WHERE P.ADDR = S.PADDR
AND S.STATUS = 'ACTIVE'
AND P.BACKGROUND IS NULL;
exit;
EOF
;;
#=====================
# End of -active
#=====================
#==============================================================================
# -longops
#==============================================================================
-longops)
sqlplus -S / as sysdba <<EOF
set linesize 120
set pagesize 999
col MESSAGE format a30
col opname for a20
col username for a20
select opname,TIME_REMAINING REMAIN,
ELAPSED_SECONDS ELAPSE,MESSAGE,
SQL_ID,sid,username
from v\$session_longops where TIME_REMAINING >0;
exit;
EOF
;;
#=====================
# End of -longops
#=====================
#==============================================================================
# -tran
#==============================================================================
-tran)
sqlplus -S / as sysdba <<EOF
set linesize 120
col USERNAME format a12
col rbs format a12
col BLKS_RECS format a16
col START_TIME format a17
col LOGIO format 99999
col PHY_IO FORMAT 99999
COL CRGET FORMAT 99999
COL CRMOD FORMAT 99999
SELECT /* SHSNC */ /* RULE */
S.SID,S.SERIAL#,S.USERNAME, R.NAME RBS,
T.START_TIME,
to_char(T.USED_UBLK)||','||to_char(T.USED_UREC) BLKS_RECS ,
T.LOG_IO LOGIO,T.PHY_IO PHYIO,T.CR_GET CRGET,T.CR_CHANGE CRMOD
FROM V\$TRANSACTION T, V\$SESSION S,V\$ROLLNAME R,
V\$ROLLSTAT RS
WHERE T.SES_ADDR(+) = S.SADDR
AND T.XIDUSN = R.USN AND S.USERNAME IS NOT NULL
AND R.USN = RS.USN ;
exit;
EOF
;;
#=====================
# End of -tran
#=====================
#==============================================================================
# -param
#==============================================================================
-param)
sqlplus -S / as sysdba <<EOF
set linesize 120
set pagesize 999
col NAME format a40
COL VALUE FORMAT A40
SELECT /* SHSNC */ NAME,ISDEFAULT,ISSES_MODIFIABLE SESMOD,
ISSYS_MODIFIABLE SYSMOD,VALUE
FROM V\$PARAMETER
WHERE NAME LIKE '%' || LOWER('$2') || '%'
AND NAME <> 'control_files'
and name <> 'rollback_segments';
exit;
EOF
;;
#=====================
# End of -param
#=====================
#==============================================================================
# -param_
#==============================================================================
-param_)
sqlplus -S / as sysdba <<EOF
set linesize 120
set pagesize 999
col NAME format a40
COL VALUE FORMAT A40
SELECT /* SHSNC */
P.KSPPINM NAME, V.KSPPSTVL VALUE
FROM SYS.X\$KSPPI P, SYS.X\$KSPPSV V
WHERE P.INDX = V.INDX
AND V.INST_ID = USERENV('Instance')
AND SUBSTR(P.KSPPINM,1,1)='_'
AND ('$2' IS NULL OR P.KSPPINM LIKE '%'||LOWER('$2')||'%');
exit;
EOF
;;
#=====================
# End of -param_
#=====================
#==============================================================================
# -size
#==============================================================================
-size)
sqlplus -S / as sysdba <<EOF
set linesize 120
set pagesize 999
col owner format a10
col segment_name for a30
SELECT /*+ SHSNC */ OWNER,SEGMENT_NAME, SEGMENT_TYPE, SUM(BYTES)/1048576 SIZE_MB,
MAX(INITIAL_EXTENT) INIEXT, MAX(NEXT_EXTENT) MAXEXT FROM DBA_SEGMENTS
WHERE SEGMENT_NAME = upper('$3')
AND ('$2' IS NULL OR UPPER(OWNER) = UPPER('$2'))
AND SEGMENT_TYPE LIKE 'TABLE%'
GROUP BY OWNER, SEGMENT_NAME, SEGMENT_TYPE
UNION ALL
SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE, SUM(BYTES)/1048576 SIZE_MB,
MAX(INITIAL_EXTENT) INIEXT, MAX(NEXT_EXTENT) MAXEXT FROM DBA_SEGMENTS
WHERE (OWNER,SEGMENT_NAME) IN (
SELECT OWNER,INDEX_NAME FROM DBA_INDEXES WHERE TABLE_NAME=upper('$3') AND
('$2' IS NULL OR UPPER(OWNER) = UPPER('$2'))
UNION
SELECT OWNER,SEGMENT_NAME FROM DBA_LOBS WHERE TABLE_NAME=upper('$2') AND
('$2' IS NULL OR UPPER(OWNER) = UPPER('$2')))
GROUP BY OWNER, SEGMENT_NAME, SEGMENT_TYPE;
exit;
EOF
;;
#=====================
# End of -size
#=====================
#==============================================================================
# -segment
#==============================================================================
-segment)
sqlplus -S / as sysdba <<EOF
set linesize 120
col USERNAME format a12
col MACHINE format a16
col TABLESPACE format a10
SELECT /* SHSNC */ /*+ RULE */
SEGMENT_TYPE,OWNER SEGMENT_OWNER,SEGMENT_NAME,
TRUNC(SUM(BYTES)/1024/1024,1) SIZE_MB
FROM DBA_SEGMENTS WHERE OWNER NOT IN ('SYS','SYSTEM')
GROUP BY SEGMENT_TYPE,OWNER,SEGMENT_NAME
HAVING SUM(BYTES) > TO_NUMBER(NVL('$2','100')) * 1048576
ORDER BY 1,2,3,4 DESC;
exit;
EOF
;;
#=====================
# End of -segment
#=====================
#==============================================================================
# -tbs
#==============================================================================
-tbs)
case $2 in
#------------------------------------------------------------
# info
#------------------------------------------------------------
info)
sqlplus -S / as sysdba <<EOF
set linesize 160
set pagesize 999
select a.tablespace_name,
a.type,
a.bigfile,
a.status,
a.extent_management,
a.segment_space_management
from ( select d.tablespace_name,
t.contents type,
t.status,
t.bigfile,
t.extent_management,
t.segment_space_management
from dba_data_files d, dba_tablespaces t
where d.tablespace_name = t.tablespace_name
group by d.tablespace_name,
t.contents,
t.status,
t.bigfile,
t.extent_management,
t.segment_space_management) a,
( select tablespace_name
from dba_free_space
group by tablespace_name) b
where a.tablespace_name = b.tablespace_name(+)
union all
select a.tablespace_name,
a.type,
a.bigfile,
a.status,
a.extent_management,
a.segment_space_management
from ( select d.tablespace_name,
t.contents type,
t.status,
t.bigfile,
t.extent_management,
t.segment_space_management
from dba_temp_files d, dba_tablespaces t
where d.tablespace_name = t.tablespace_name
group by d.tablespace_name,
t.contents,
t.status,
t.bigfile,
t.extent_management,
t.segment_space_management) a,
( select tablespace_name
from v\$temp_space_header
group by tablespace_name) b
where a.tablespace_name = b.tablespace_name(+);
exit;
EOF
;;
#---------------------
# End of info
#---------------------
#------------------------------------------------------------
# rate
#------------------------------------------------------------
rate)
sqlplus -S / as sysdba <<EOF
set linesize 160
set pagesize 999
col TABLESPACE_NAME for a18
col TBS_TOTAL_MB for 9999999
col TBS_USED_MB for 9999999
col TBS_FREE_MB for 9999999
col TBS_RATE for a11
col EXTEND_MAX_MB for 9999999999999
col EXTEND_FREE_MB for 9999999999999
col EXTEND_RATE for a11
select a.tablespace_name,
round(current_size / 1024 / 1024, 1) TBS_TOTAL_MB,
round((current_size - b.free_bytes) / 1024 / 1024, 1) TBS_USED_MB,
round(b.free_bytes / 1024 / 1024, 1) TBS_FREE_MB,
round(((current_size - b.free_bytes) / current_size) * 100, 1) || '%' TBS_RATE,
round(a.max_size / 1024 / 1024, 1) EXTEND_MAX_MB,
round((a.max_size - (current_size - b.free_bytes)) / 1024 / 1024, 1) EXTEND_FREE_MB,
round(((current_size - b.free_bytes) / a.max_size) * 100, 1) || '%' EXTEND_RATE
from (select tablespace_name,
sum(ddf.bytes) current_size,
sum(case
when ddf.autoextensible = 'YES' THEN
DDF.MAXBYTES
ELSE
DDF.BYTES
END) max_size
from dba_data_files ddf
group by tablespace_name
union
select tablespace_name,
sum(ddf.bytes) current_size,
sum(case
when ddf.autoextensible = 'YES' THEN
DDF.MAXBYTES
ELSE
DDF.BYTES
END) max_size
from dba_temp_files ddf
group by tablespace_name) a,
(select dfs.tablespace_name, sum(dfs.bytes) free_bytes
from dba_free_space dfs
group by dfs.tablespace_name
union
select tfs.tablespace_name, sum(tfs.BYTES_FREE) free_bytes
from v\$TEMP_SPACE_HEADER tfs
group by tfs.tablespace_name) b
where a.tablespace_name = b.tablespace_name(+);
exit;
EOF
;;
#---------------------
# End of rate
#---------------------
#------------------------------------------------------------
# file
#------------------------------------------------------------
file)
sqlplus -S / as sysdba <<EOF
set linesize 140
set pagesize 9999
col file_id for 9999
col TABLESPACE_NAME for a20
col FILE_NAME for a70
col STATUS for a7
col FILE_STATUS for a10
col "AUTO" for a3
col "MB" for 999999999
select d.file_id,
d.tablespace_name,
t.status "STATUS",
d.file_name,
d.status FILE_STATUS,
d.AUTOEXTENSIBLE "AUTO",
d.BYTES / 1024 / 1024 "MB"
from dba_data_files d, dba_tablespaces t
where t.tablespace_name = d.tablespace_name
order by file_id;
exit;
EOF
;;
#---------------------
# End of file
#---------------------
#------------------------------------------------------------
# -tbs *
#------------------------------------------------------------
*)
echo "commond not found!!!"
;;
esac
;;
#=====================
# End of -tbs
#=====================
#==============================================================================
# -objlike
#==============================================================================
-objlike)
sqlplus -S / as sysdba <<EOF
set linesize 120
col type format a16
col OWNER format a12
col status format a8
col CREATED format a10
col MODIFIED format a19
col OBJECT_NAME format a30
SELECT /* SHSNC */ OBJECT_TYPE TYPE,OBJECT_ID ID,OWNER,OBJECT_NAME,
TO_CHAR(CREATED,'YYYY/MM/DD') CREATED,
TO_CHAR(LAST_DDL_TIME,'YYYY/MM/DD HH24:MI:SS') MODIFIED,STATUS
FROM DBA_OBJECTS
WHERE OBJECT_TYPE IN ('CLUSTER','FUNCTION','INDEX',
'PACKAGE','PROCEDURE','SEQUENCE','SYNONYM',
'TABLE','TRIGGER','TYPE','VIEW')
AND ('$2' IS NULL OR UPPER(OWNER) = UPPER('$2'))
AND OBJECT_NAME LIKE UPPER('%$3%');
exit;
EOF
;;
#=====================
# End of -objlike
#=====================
#==============================================================================
# -tablike
#==============================================================================
-tablike)
sqlplus -S / as sysdba <<EOF
set linesize 120
col OWNER format a12
col status format a8
col CREATED format a10
col MODIFIED format a19
col OBJECT_NAME format a30
SELECT /* SHSNC */ OBJECT_ID ID,OWNER,OBJECT_NAME,
TO_CHAR(CREATED,'YYYY/MM/DD') CREATED,
TO_CHAR(LAST_DDL_TIME,'YYYY/MM/DD HH24:MI:SS') MODIFIED,STATUS
FROM DBA_OBJECTS
WHERE OBJECT_TYPE = 'TABLE'
AND ('$2' IS NULL OR UPPER(OWNER) = UPPER('$2'))
AND OBJECT_NAME LIKE UPPER('%$3%');
exit;
EOF
;;
#=====================
# End of -tablike
#=====================
#==============================================================================
# -tstat
#==============================================================================
-tstat)
sqlplus -S / as sysdba <<EOF
set linesize 150
col owner format a10
col partname format a30
col INIEXT format 99999
col nxtext format 99999
col avgspc format 99999
col ccnt format 999
col rowlen format 9999
col ssize format 9999999
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SELECT /* SHSNC */
OWNER,NULL PARTNAME,
NUM_ROWS NROWS, BLOCKS, AVG_SPACE AVGSPC,CHAIN_CNT CCNT, AVG_ROW_LEN ROWLEN,
SAMPLE_SIZE SSIZE,LAST_ANALYZED ANADATE
FROM DBA_TABLES
WHERE UPPER(OWNER)=NVL(UPPER('$2'),OWNER) AND TABLE_NAME=UPPER('$3')
UNION ALL
SELECT /* SHSNC */
TABLE_OWNER OWNER,PARTITION_NAME PARTNAME,
NUM_ROWS NROWS, BLOCKS, AVG_SPACE AVGSPC,CHAIN_CNT CCNT, AVG_ROW_LEN ROWLEN,
SAMPLE_SIZE SSIZE,LAST_ANALYZED ANADATE
FROM DBA_TAB_PARTITIONS
WHERE UPPER(TABLE_OWNER)=NVL(UPPER('$2'),TABLE_OWNER) AND TABLE_NAME=UPPER('$3');
exit;
EOF
;;
#=====================
# End of -tstat
#=====================
#==============================================================================
# -tabpart
#==============================================================================
-tabpart)
sqlplus -S / as sysdba <<EOF
set linesize 120
col USERNAME format a12
col MACHINE format a16
col TABLESPACE format a10
SELECT /* SHSNC */ PARTITION_POSITION NO#,PARTITION_NAME,TABLESPACE_NAME TS_NAME,
INITIAL_EXTENT/1024 INI_K, NEXT_EXTENT/1024 NEXT_K,PCT_INCREASE PCT,
FREELISTS FLS, FREELIST_GROUPS FLGS
FROM DBA_TAB_PARTITIONS
WHERE ('$2' IS NULL OR UPPER(TABLE_OWNER) = UPPER('$2'))
AND TABLE_NAME LIKE UPPER('$3')
ORDER BY 1;
exit;
EOF
;;
#=====================
# End of -tabpart
#=====================
#==============================================================================
# -istat
#==============================================================================
-istat)
sqlplus -S / as sysdba <<EOF
set linesize 120
col OWNER format a10
col lkey format 999
col dkey format 999
col lev format 99
col anaday format a10
SELECT /* SHSNC */
TABLE_OWNER OWNER, INDEX_NAME,
BLEVEL LEV, LEAF_BLOCKS LBLKS,TRUNC(NUM_ROWS) NROWS,
DISTINCT_KEYS DROWS,
CLUSTERING_FACTOR CLSFCT,SAMPLE_SIZE SSIZE,
TO_CHAR(LAST_ANALYZED,'YYYY/MM/DD') ANADAY,
PARTITIONED PAR
FROM DBA_INDEXES
WHERE UPPER(TABLE_OWNER)=NVL(UPPER('$2'),TABLE_OWNER)
AND TABLE_NAME=UPPER('$3');
exit;
EOF
;;
#=====================
# End of -istat
#=====================
#==============================================================================
# -ipstat
#==============================================================================
-ipstat)
sqlplus -S / as sysdba <<EOF
set linesize 120
col OWNER format a10
col lkey format 999
col dkey format 999
col lev format 99
col anaday format a10
SELECT /* SHSNC */
PARTITION_NAME,
BLEVEL LEV, LEAF_BLOCKS LBLKS,TRUNC(NUM_ROWS) NROWS,
DISTINCT_KEYS DROWS,
CLUSTERING_FACTOR CLSFCT,SAMPLE_SIZE SSIZE,
TO_CHAR(LAST_ANALYZED,'YYYY/MM/DD') ANADAY
FROM DBA_IND_PARTITIONS
WHERE UPPER(INDEX_OWNER)=NVL(UPPER('$2'),INDEX_OWNER)
AND INDEX_NAME=UPPER('$3');
exit;
EOF
;;
#=====================
# End of -ipstat
#=====================
#==============================================================================
# -idxdesc
#==============================================================================
-idxdesc)
sqlplus -S / as sysdba <<EOF
SET linesize 500
set pagesize 999
col INDEX_COL FOR a30
col INDEX_TYPE FOR a22
col INDEX_NAME FOR a40
col table_name FOR a32
SELECT B.OWNER||'.'||B.INDEX_NAME INDEX_NAME,
A.INDEX_COL,B.INDEX_TYPE||'-'||B.UNIQUENESS INDEX_TYPE,B.PARTITIONED
FROM (SELECT TABLE_OWNER,TABLE_NAME,INDEX_NAME, SUBSTR(MAX(SYS_CONNECT_BY_PATH(COLUMN_NAME, ',')), 2) INDEX_COL
FROM (SELECT TABLE_OWNER, TABLE_NAME,INDEX_NAME, COLUMN_NAME,
ROW_NUMBER() OVER(PARTITION BY TABLE_OWNER, TABLE_NAME, INDEX_NAME
ORDER BY TABLE_OWNER, INDEX_NAME, COLUMN_POSITION, COLUMN_NAME) RN
FROM DBA_IND_COLUMNS
WHERE TABLE_NAME = UPPER('$3')
AND TABLE_OWNER = UPPER('$2'))
START WITH RN = 1
CONNECT BY PRIOR RN = RN - 1
AND PRIOR TABLE_NAME = TABLE_NAME
AND PRIOR INDEX_NAME = INDEX_NAME
AND PRIOR TABLE_OWNER = TABLE_OWNER
GROUP BY TABLE_NAME, INDEX_NAME, TABLE_OWNER
ORDER BY TABLE_OWNER, TABLE_NAME, INDEX_NAME
) A,
(SELECT * FROM DBA_INDEXES WHERE TABLE_NAME = UPPER('$3') AND TABLE_OWNER = UPPER('$2')) B
WHERE A.TABLE_OWNER = B.TABLE_OWNER
AND A.TABLE_NAME = B.TABLE_NAME
AND A.INDEX_NAME =B.INDEX_NAME;
exit;
EOF
;;
#=====================
# End of -idxdesc
#=====================
#==============================================================================
# -ddl
#==============================================================================
-ddl)
sqlplus -S / as sysdba <<EOF
set long 49000
set longc 9999
set line 150
set pagesize 10000
SELECT dbms_metadata.get_ddl(upper('$3'),upper('$4'),upper('$2')) from dual;
exit;
EOF
;;
#=====================
# End of -ddl
#=====================
#==============================================================================
# -flash
#==============================================================================
-flash)
sqlplus -S / as sysdba <<EOF
set linesize 120
set pagesize 9999
col "ORDER_ " for 99
col NAME for a40
col VALUE for a48
WITH flashback_database_log AS
(SELECT ROUND((SYSDATE - oldest_flashback_time) * 24 * 60, 2) oldest_log_minutes,
retention_target retention_target_minutes,
flashback_size / 1048576 flashback_size_mb,
estimated_flashback_size / 1048576 estimated_flashback_size_mb
FROM v\$flashback_database_log),
flashback_database_logfile AS
(SELECT COUNT(*) logs,
SUM(BYTES / 1048576) size_mb,
MIN(first_time) oldest_log,
MAX(first_time) latest_log
FROM v\$flashback_database_logfile),
flashback_usage AS
(SELECT file_type,
ROUND(mb_used, 2) mb_used,
ROUND(mb_reclaimable, 2) mb_reclaimable,
DECODE(total_mb, 0, 0, ROUND(mb_used * 100 / total_mb, 2)) percent_space_used,
DECODE(total_mb, 0, 0, ROUND(mb_reclaimable * 100 / total_mb, 2)) percent_space_reclaimable,
number_of_files,
total_mb db_recovery_file_dest_mb,
flashback_retention_target,
oldest_record,
ROUND((sysdate - oldest_record) * 24 * 60, 2) oldest_record_age_sec
FROM (SELECT SUM(DECODE(NAME,
'db_recovery_file_dest_size',
VALUE / 1048576,
0)) total_mb,
SUM(DECODE(NAME, 'db_flashback_retention_target', VALUE, 0)) flashback_retention_target
FROM v\$parameter
WHERE NAME IN ('db_recovery_file_dest_size',
'db_flashback_retention_target')),
(SELECT 'FLASHBACKLOG' file_type,
NVL(SUM(BYTES) / 1048576, 0) mb_used,
sum(CASE
WHEN last_time <= (sysdate - (tgt.value / 1440)) THEN
bytes / 1048576
ELSE
0
END) mb_reclaimable,
COUNT(*) number_of_files,
MIN(first_time) oldest_record
FROM (select bytes,
lead(first_time) over(order by first_time asc) last_time,
first_time
from v\$flashback_database_logfile) fla_log,
(SELECT value value
FROM v\$parameter
WHERE name = 'db_flashback_retention_target') tgt
UNION
SELECT 'BACKUPPIECE' file_type,
NVL(SUM(BYTES / 1048576), 0) mb,
SUM(CASE
WHEN dl.rectype = 13 THEN
(BYTES / 1048576)
ELSE
0
END) reclaimable_mb,
COUNT(*) no_of_files,
MIN(start_time) oldest_record
FROM v\$backup_piece bp, x\$kccagf dl
WHERE is_recovery_dest_file = 'YES'
AND deleted = 'NO'
AND bp.recid = dl.recid(+)
AND dl.rectype(+) = 13
UNION
SELECT 'ARCHIVELOG' file_type,
NVL(SUM(blocks * block_size) / 1048576, 0) mb,
SUM(CASE
WHEN dl.rectype = 11 THEN
(LOG.blocks * LOG.block_size / 1048576)
ELSE
0
END) reclaimable_mb,
COUNT(*) no_of_files,
MIN(first_time) oldest_record
FROM v\$archived_log log, x\$kccagf dl
WHERE deleted = 'NO'
AND is_recovery_dest_file = 'YES'
AND dl.recid(+) = log.recid
AND dl.rectype(+) = 11
UNION
SELECT 'ONLINELOG' file_type,
SUM(BYTES / 1048576) mb,
0 reclaimable,
COUNT(*) no_of_files,
MIN(first_time) oldest_record
FROM v\$logfile lf,
(SELECT group#, BYTES, first_time
FROM v\$standby_log
UNION
SELECT group#, BYTES, first_time FROM v\$log) l
WHERE l.group# = lf.group#
AND lf.is_recovery_dest_file = 'YES'
UNION
SELECT 'IMAGECOPY',
NVL(SUM(blocks * (block_size / 1048576)), 0) mb,
0 reclaimable_mb,
COUNT(*) no_of_files,
MIN(creation_time) oldest_record
FROM v\$datafile_copy
WHERE deleted = 'NO'
AND is_recovery_dest_file = 'YES'
UNION
SELECT 'CONTROLFILE',
NVL(SUM(block_size * file_size_blks) / 1048576, 0) mb,
0 reclaimable,
COUNT(*) no_of_files,
NULL oldest_record
FROM v\$controlfile
WHERE is_recovery_dest_file = 'YES'))
SELECT order_, NAME, VALUE
FROM (SELECT 0 order_, NAME, VALUE
FROM v\$parameter
WHERE NAME LIKE 'db_recovery_file%'
UNION
SELECT 3,
'oldest flashback log (minutes)',
TO_CHAR(ROUND(oldest_log_minutes, 2))
FROM flashback_database_log
UNION
SELECT 1,
'retention target (minutes)',
UNION
SELECT 2,
'estimated size for flashback logs (MB)',
TO_CHAR(ROUND(retention_target_minutes, 2))
FROM flashback_database_log
TO_CHAR(ROUND(estimated_flashback_size_mb, 2))
FROM flashback_database_log
UNION
SELECT 2, 'Current flashback log count', TO_CHAR(logs)
FROM flashback_database_logfile
UNION
SELECT 3,
'Most recent flashback log (minutes)',
TO_CHAR(ROUND((SYSDATE - latest_log) * 24 * 60, 2))
FROM flashback_database_logfile
UNION
SELECT 4,
'Total size of all files in MB',
TO_CHAR(ROUND(SUM(mb_used), 2))
FROM flashback_usage
UNION
SELECT 5,
'Total size of reclaimable files in MB',
TO_CHAR(ROUND(SUM(mb_reclaimable), 2))
FROM flashback_usage
UNION
SELECT 6,
'unused space in MB',
TO_CHAR(ROUND(MIN(db_recovery_file_dest_mb) - SUM(mb_used)))
FROM flashback_usage)
ORDER BY order_, NAME;
exit;
EOF
;;
#=====================
# End of -flash
#=====================
#==============================================================================
# -lock
#==============================================================================
-lock)
sqlplus -S / as sysdba <<EOF
set linesize 180
set pagesize 999
col OS_USER_NAME for a20
col USER_NAME for a16
col LOCK_TYPE for a16
col OBJECT for a20
col LOCK_MODE for a16
col OWNER for a16
col SID for 999999
col SERIAL_NUM for 99999
SELECT /*+ RULE */
LS.OSUSER OS_USER_NAME,
LS.USERNAME USER_NAME,
DECODE(LS.TYPE,
'RW',
'Row wait enqueue lock',
'TM',
'DML enqueue lock',
'TX',
'Transaction enqueue lock',
'UL',
'User supplied lock') LOCK_TYPE,
O.OBJECT_NAME OBJECT,
DECODE(LS.LMODE,
1,
NULL,
2,
'Row Share',
3,
'Row Exclusive',
4,
'Share',
5,
'Share Row Exclusive',
6,
'Exclusive',
NULL) LOCK_MODE,
O.OWNER,
LS.SID,
LS.SERIAL# SERIAL_NUM
FROM SYS.DBA_OBJECTS O,
(SELECT S.OSUSER,
S.USERNAME,
L.TYPE,
L.LMODE,
S.SID,
S.SERIAL#,
L.ID1,
L.ID2
FROM v\$SESSION S, v\$LOCK L
WHERE S.SID = L.SID) LS
WHERE O.OBJECT_ID = LS.ID1
AND O.OWNER <> 'SYS'
ORDER BY O.OWNER, O.OBJECT_NAME;
exit;
EOF
;;
#=====================
# End of -lock
#=====================
#==============================================================================
# -lockwait
#==============================================================================
-lockwait)
sqlplus -S / as sysdba <<EOF
set linesize 180
set pagesize 999
col HOLD_SID format 99999
col WAIT_SID format 99999
col type format a20
col hold format a12
col request format a12
SELECT /* SHSNC */ /*+ ORDERED USE_HASH(H,R) */
H.SID HOLD_SID,
R.SID WAIT_SID,
decode(H.type,
'MR', 'Media Recovery',
'RT', 'Redo Thread',
'UN', 'User Name',
'TX', 'Transaction',
'TM', 'DML',
'UL', 'PL/SQL User Lock',
'DX', 'Distributed Xaction',
'CF', 'Control File',
'IS', 'Instance State',
'FS', 'File Set',
'IR', 'Instance Recovery',
'ST', 'Disk Space Transaction',
'TS', 'Temp Segment',
'IV', 'Library Cache Invalidation',
'LS', 'Log Start or Switch',
'RW', 'Row Wait',
'SQ', 'Sequence Number',
'TE', 'Extend Table',
'TT', 'Temp Table',
'TC', 'Thread Checkpoint',
'SS', 'Sort Segment',
'JQ', 'Job Queue',
'PI', 'Parallel operation',
'PS', 'Parallel operation',
'DL', 'Direct Index Creation',
H.type) type,
decode(H.lmode,
0, 'None', 1, 'Null',
2, 'Row-S (SS)', 3, 'Row-X (SX)',
4, 'Share', 5, 'S/Row-X (SSX)',
6, 'Exclusive', to_char(H.lmode)) hold,
decode(r.request, 0, 'None',
1, 'Null', 2, 'Row-S (SS)',
3, 'Row-X (SX)', 4, 'Share',
5, 'S/Row-X (SSX)',6, 'Exclusive',
to_char(R.request)) request,
R.ID1,R.ID2,R.CTIME
FROM V\$LOCK H,V\$LOCK R
WHERE H.BLOCK = 1 AND R.REQUEST > 0 AND H.SID <> R.SID
and H.TYPE <> 'MR' AND R.TYPE <> 'MR'
AND H.ID1 = R.ID1 AND H.ID2 = R.ID2 AND H.TYPE=R.TYPE
AND H.LMODE > 0 AND R.REQUEST > 0 ORDER BY 1,2;
exit;
EOF
;;
#=====================
# End of -lockwait
#=====================
#==============================================================================
# -sqltext
#==============================================================================
-sqltext)
sqlplus -S / as sysdba <<EOF
set linesize 120
set pagesize 999
SELECT /* SHSNC */ SQL_TEXT FROM V\$SQLTEXT
WHERE SQL_ID = to_char('$2')
ORDER BY PIECE;
exit;
EOF
;;
#=====================
# End of -sqltext
#=====================
#==============================================================================
# -sql
#==============================================================================
-sql)
case $2 in
#------------------------------------------------------------
# spid
#------------------------------------------------------------
spid)
sqlplus -S / as sysdba <<EOF
set linesize 140
set pagesize 999
col username for a18
col sql_text for a80
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select ses.username, ses.LOGON_TIME, sql.sql_text
from v\$session ses, v\$process pro, v\$sql sql
where ses.paddr = pro.addr
and ses.SQL_HASH_VALUE = sql.HASH_VALUE
and ses.SQL_ADDRESS = sql.address
and pro.spid = '$3';
exit;
EOF
;;
#---------------------
# End of spid
#---------------------
#------------------------------------------------------------
# plan
#------------------------------------------------------------
plan)
sqlplus -S / as sysdba <<EOF
set pagesize 999
set linesize 180
alter session set STATISTICS_LEVEL = ALL;
select * from table(dbms_xplan.display_cursor('$3',$4,'advanced'));
exit;
EOF
;;
#---------------------
# End of plan
#---------------------
#------------------------------------------------------------
# hist
#------------------------------------------------------------
hist)
sqlplus -S / as sysdba <<EOF
set linesize 120
set pagesize 999
set linesize 140
col plan_hash_value format 9999999999
col id format 999
col operation format a16
col options format a8
col object_owner format a10
col object_name format a30
col optimizer format a10
col cost format 9999999
col access_predicates format a10
col filter_predicates format a10
SELECT plan_hash_value,
id,
LPAD (' ', DEPTH) || operation operation,
options,
object_owner,
object_name,
optimizer,
cost,
access_predicates,
filter_predicates
FROM dba_hist_sql_plan
WHERE sql_id = '$3'
ORDER BY plan_hash_value, id;
exit;
EOF
;;
#---------------------
# End of hist
#---------------------
esac
;;
#=====================
# End of -sql
#=====================
#==============================================================================
# -topevent
#==============================================================================
-topevent)
sqlplus -S / as sysdba <<EOF
set linesize 120
col "Event" for a34
col "Waits" for 9999999999999
col "Time" for 9999999999999
col "Avg" for 999999999
col pctwa for 999999
col "Wait Class" for a20
SELECT event "Event", totwa "Waits", twsec "Time", avgms "Avg",
ROUND(RATIO_TO_REPORT(twsec) OVER () * 100,1) pctwa , wclas "Wait Class"
FROM
(SELECT
NVL(substr(event,1,30),' ') event,
AVG(total_waits) totwa,
ROUND(AVG(time_waited_micro)/1000000, 0) twsec,
ROUND(SUM(time_waited_micro)/
SUM(total_waits)/1000, 2) avgms,
NVL(substr(wait_class,1,13),' ') wclas
FROM Gv\$SYSTEM_EVENT
WHERE WAIT_CLASS <> 'Idle'
GROUP BY event, wait_class
HAVING SUM(total_waits) > 0
UNION ALL
SELECT
'CPU time' event,
0 totwa,
AVG(icput) twsec,
0 avgms,
' ' wclas
FROM
(
select inst_id, sum(VALUE)/100 icput
FROM Gv\$SYSSTAT
WHERE name in ('CPU used when call started',
'CPU used by this session')
group by inst_id) ORDER BY twsec desc) WHERE ROWNUM <6;
exit;
EOF
;;
#=====================
# End of -topevent
#=====================
#==============================================================================
# -adinfo
#==============================================================================
-adinfo)
for i in `asmcmd lsdg |grep -v Name | awk -F' ' '{print $NF}'|cut -d/ -f1`; do echo "";echo "Diskgroup : $i";asmcmd lsattr -l -G $i ;done
;;
#=====================
# End of -adinfo
#=====================
#==============================================================================
# -asmfree
#==============================================================================
-asmfree)
sqlplus -S / as sysdba <<EOF
set linesize 120
set pagesize 999
col name for a20
col total_mb for 9999999999999
col free_mb for 9999999999999
col pct_used for 999999999
select name, total_mb/1024, free_mb/1024, ROUND((1- (free_mb / total_mb))*100, 2) pct_used from v\$asm_diskgroup;
exit;
EOF
;;
#=====================
# End of -asmfree
#=====================
#==============================================================================
# -dgarc
#==============================================================================
-dgarc)
sqlplus -S / as sysdba <<EOF
set linesize 140
set pagesize 999
col SEQUENCE# for 999999
col APPLIED for a10
col ARCHIVED for a8
col FIRST_TIME for a20
col NEXT_TIME for a20
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select * from (select SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED, ARCHIVED from V\$ARCHIVED_LOG order by 1 desc) where rownum<40 order by 1;
exit;
EOF
;;
#=====================
# End of -dgarc
#=====================
#==============================================================================
# -dgs
#==============================================================================
-dgs)
sqlplus -S / as sysdba <<EOF
set linesize 140
set pagesize 999
col PROCESS for a10
col DB_UNIQUE_NAME for a12
col DATABASE_ROLE for a12
col OPEN_MODE for a12
col PROTECTION_MODE for a20
col PROTECTION_LEVEL for a20
col SWITCHOVER_STATUS for a20
SELECT DB_UNIQUE_NAME,DATABASE_ROLE , OPEN_MODE,
PROTECTION_MODE, PROTECTION_LEVEL, SWITCHOVER_STATUS
FROM V\$DATABASE;
col STATUS for a20
col CURRENT_TARGET for a20
col THRESHOLD for 9999999999
col PRESENT for a20
SELECT FS_FAILOVER_STATUS STATUS, FS_FAILOVER_CURRENT_TARGET CURRENT_TARGET, FS_FAILOVER_THRESHOLD THRESHOLD,
FS_FAILOVER_OBSERVER_PRESENT PRESENT
FROM V\$DATABASE;
exit;
EOF
;;
#=====================
# End of -dgs
#=====================
#==============================================================================
# -dgp
#==============================================================================
-dgp)
sqlplus -S / as sysdba <<EOF
set linesize 140
set pagesize 999
col PROCESS for a10
col CLIENT_PROCESS for a10
col SEQUENCE# for 999999999
col STATUS for a15
SELECT PROCESS, CLIENT_PROCESS, SEQUENCE#, STATUS FROM V\$MANAGED_STANDBY;
exit;
EOF
;;
#=====================
# End of -dgp
#=====================
#==============================================================================
# -dge
#==============================================================================
-dge)
sqlplus -S / as sysdba <<EOF
set linesize 140
set pagesize 999
col dest_id for 999
col error for a80
SELECT DEST_ID,ERROR FROM V\$ARCHIVE_DEST where rownum<3;
exit;
EOF
;;
#=====================
# End of -dge
#=====================
#==============================================================================
# -dggap
#==============================================================================
-dggap)
sqlplus -S / as sysdba <<EOF
set lines 200 pages 100
column db_name format a9
column database_role format a13
column thread# format 9999
break on thread# skip 1
select db_name,thread#,database_role,sequence# from
(select name db_name from v\$database),
(select 'Primary' database_role,thread#,sequence# from (select unique thread#, max(sequence#) over (partition by thread#) as sequence# from v\$archived_log where standby_dest='NO' and archived='YES'))
union all
select db_name,thread#,database_role,sequence# from
(select name db_name from v\$database),
(select 'Standby' database_role,thread#,sequence# from (select unique thread#, max(sequence#) over (partition by thread#) as sequence# from v\$archived_log where standby_dest='YES' and archived='YES'))
order by thread#,database_role;
exit;
EOF
;;
#=====================
# End of -dggap
#=====================
#==============================================================================
# -dglag
#==============================================================================
-dglag)
sqlplus -S / as sysdba <<EOF
set lines 200 pages 100
column value format a26
select value from v\$dataguard_stats where name='apply lag';
exit;
EOF
;;
#=====================
# End of -dglag
#=====================
#==============================================================================
# $1 *
#==============================================================================
*)
echo " "
echo "commond not found!!!"
echo "use 'orac -help' learn more about usage"
echo " "
;;
esac