#!/bin/bash
# Copyright (c) 2013, 2016, Liang Guojun.  All rights reserved.
# Program:
#       Check Oracle Database Command.
# History:
#       2013/11/15      Liang Guojun    First Release
#

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

orac的更多相关文章

  1. win2003 老的ASP程序报错 Microsoft OLE DB Provider for Orac(0x80004005)

    ASP连接ORACLE报错,记得环境刚配置完成的时候一切正常,今天莫名其妙的报错了 报错位置78行: 这是一个很老的系统,代码没人去东,只是从老的机器迁移到新的服务器中,想想应该是环境的问题 网上搜索 ...

  2. orac l e数据库第一章

    数据库两种权限:                    1.系统权限 2.对象权限 数据库端口号:                     SQL SERVER  1433 MySql   3306 ...

  3. CF1349A Orac and LCM 题解

    题意分析 给出$n$个数,求这$n$个数两两的最小公倍数的最大公约数 思路分析 通过分析样例可以发现,如果要成为这$n$个数两两的最小公倍数的公约数,至少要是这$n$个数中$n-1$个数的约数,否则就 ...

  4. Codeforces #6241 div2 C. Orac and LCM (数学)

    题意:给你一个数列,求所有子序列对的\(lcm\),然后求这些所有\(lcm\)的\(gcd\). 题解:我们对所有数分解质因数,这里我们首先要知道一个定理: ​ 对于\(n\)个数,假如某个质数\( ...

  5. Codeforces Round #641 div2 B. Orac and Models (DP)

    题意:有一个长度为\(n\)的序列\(a\),求一个最长上升子序列,且这个子序列的元素在\(a\)中的位置满足\(i_{j+1}modi_{j}=0\),求这个子序列的最大长度. 题意:这题假如我们用 ...

  6. Codeforces Round #641 (Div. 2) D. Orac and Medians (贪心)

    题意:有一个长度为\(n\)的数组,问能否通过多次使某个区间的所有元素变成这个区间的中位数,来使整个数组变成题目所给定的\(k\). 题解:首先这个\(k\)一定要在数组中存在,然后我们对中位数进行考 ...

  7. TNS-12518 & Linux Error:32:Broken pipe

    最近一周,有一台ORACLE数据库服务器的监听服务在凌晨2点过几分的时间点突然崩溃,以前从没有出现过此类情况,但是最近一周出现了两次这种情况,检查时发现了如下一些信息: $ lsnrctl servi ...

  8. oracle表分区、表分析及oracle数据泵文件导入导出开心版

    1.先说oracle表分区是什么吧,这样吧我们来举个桃子,栗子太小,我们就不举了,我们来举个桃子. 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到 ...

  9. LINUX磁盘分区、格式化、挂载、卸载全程详解

    1.一切皆文件 Linux系统有一个理念:“一切皆文件”,所以计算机的硬件在linux中也是以“文件”的形式存在于/dev目录中.   图为CentOS 6.5系统中/dev目录的部分内容.不同的计算 ...

随机推荐

  1. HTML5学习笔记(一):HTML5基本概念

    1.HTML的发展历程 HTML(1994年,W3C成立) HTML2(1995年) HTML3(1996年) HTML4.0(1997年) HTML4.01(1999年)——HTML5(2008年: ...

  2. Laravel-HTTP-验证

    Laravel-HTTP-验证 标签(空格分隔): php 第一种方式 **1 直接在controller里完成表单验证** **2 打印验证返回的错误信息 dd($errors)** 第二种方式 * ...

  3. Binary Indexed Tree

    我借鉴了这个视频中的讲解的填坑法,我认为非常易于理解.有FQ能力和基本英语听力能力请直接去看视频,并不需要继续阅读. naive 算法 考虑一个这样的场景: 给定一个int数组, 我们想知道它的连续子 ...

  4. DBMS_XPLAN详细说明

    执行计划的组成部分 正确的看执行计划 DBMS_XPLAN 这个包是一个很好查看执行计划,显示很多格式,来分析执行计划中存在的问题 format:控制详细执行计划输出的格式,包含以下内容: BASIC ...

  5. java高级——生产者消费者问题

    多线程是一个很重要的应用,本节讲述多线程中同步问题 public class ThreadDemo { public static void main(String[] args) { Resourc ...

  6. 你不知道的JavaScript(十)with关键字

    with关键字在JavaScript中不太常用,用来定义一个和对象相关的作用域,在该作用域中可以访问对象的属性或方法而前面无需加上对象名,以达到简化代码的目的. <script type=&qu ...

  7. RocketMQ学习笔记(6)----RocketMQ的Client的使用 Producer/Consumer

    1.  添加依赖 pom.xml如下: <dependency> <groupId>org.apache.rocketmq</groupId> <artifa ...

  8. Mojo Core Embedder API

    This document is a subset of the Mojo documentation. Contents Overview Basic Initialization IPC Init ...

  9. 路飞学城Python-Day5

    48.字典的类型的详细方法字典的增加值dic["k1"] = "v1"字典的修改dic["k2"] = "v2"判断是否 ...

  10. 2017-2-10 bash基础脚本

    练习:写一脚本,实现如下功能: 1.让用户通过键盘输入一个用户名,如果用户不存在就退出: 2.如果其UID等于其GID,就说它是个"good guy" 3.否则,就说它是个“bad ...