Tuesday, March 10, 2020


Database patch set details on one server of serveral homes

=======================================================================================
Database patch set details on one server of serveral homes
How to gather OPatch inventory for all RAC Oracle Homes, regardless of role separation. 
(Doc ID 1922360.1)
========================================================================================
#!/bin/bash
# File: ListAllOraHomesInv.sh  (Author: Bob Clare, Oracle Support Engineer)
# Created: 21-Mar-15  Modified: 19-Sep-16
# Checks Oracle Central/Global Inventory & Local Registry (along w/OraTab & 
# OraGCHomeList files) to list all active Oracle Homes & Instances, then finds 
# each Home's Owner and runs OPatch from each Home as the Owner, filtering for 
# just the key info.  LFD is Loc[ation] File Directory, OCI is Oracle Central 
# Inventory, OLR is Oracle Local Registry, rest should be self-explanatory!  
export PATH=/sbin:/bin:/usr/sbin:/usr/bin ; Script=$(basename $0)
(($EUID)) && { echo "Script $Script must be run as root!" ; exit 1 ; }
# Above check for root uses a "bash-ism", but remainder is also ksh-compliant. 
{ case $(uname) in SunOS ) OCILFD=/var/opt/oracle ; OLRLFD=$OCILFD ;; * )
OCILFD=/etc ; OLRLFD=$OCILFD/oracle ;; esac ; OCILOC=$OCILFD/oraInst.loc
OEMHL=$OCILFD/oragchomelist ; OLRLOC=$OLRLFD/olr.loc ; ORATAB=$OCILFD/oratab
DL=$(printf '%80s' | tr ' ' '=') ; echo $DL ; [ -r $ORATAB ] && { echo \
"Active Oracle instances (from $ORATAB):" ; cut -d# -f1 $ORATAB | cut -d: \
-f-3 -s | sort | cat -n ; echo $DL ; echo "Oracle Homes (of Active Oracle \
instances from $ORATAB):" ; cut -d# -f1 $ORATAB | cut -d: -f2 -s | sort -u | \
cat -n ; echo $DL ; } ; [ -r $OCILOC ] && { echo "Oracle Central Inventory \
Location Pointer: $OCILOC" ; OCIDIR=$(grep _loc= $OCILOC | cut -d= -f2)
[ -d $OCIDIR ] && { echo "Oracle Central Inventory Directory: $OCIDIR"
OCIXML=$OCIDIR/ContentsXML/inventory.xml ; [ -r $OCIXML ] && { echo "Oracle \
Homes in Central Inventory, except EM plugins" ; echo "(from $OCIXML):"
egrep -v 'REMOVED|sbin|plugins' $OCIXML | grep "HOME NAME=" | cut -d\" -f2,4 \
| tr '"' '=' | sort ; echo $DL ; } ; } ; } ; [ -r $OLRLOC ] && { echo "Oracle \
Local Registry Location Pointer: $OLRLOC" ; CRS_HOME=$(grep home= $OLRLOC | \
cut -d= -f2) ; [ -d $CRS_HOME ] && { echo "CRS Home: $CRS_HOME" ; CRSCFG=\
$CRS_HOME/crs/install/crsconfig_params ; [ -r $CRSCFG ] && { CRS_OWNER=\
$(grep OWNER $CRSCFG | cut -d= -f2) ; [ -n "$CRS_OWNER" ] && { echo "CRS Home \
Owner: $CRS_OWNER" ; OPATCH=$CRS_HOME/OPatch/opatch ; [ -x $OPATCH ] && su \
$CRS_OWNER -c "$OPATCH lsinv -oh $CRS_HOME -all | awk '/^List of Oracle Homes:\
$/,/^$/ { print }'" | egrep -v 'sbin|plugins' ; echo $DL ; } ; } ; } ; }
[ -r $ORATAB ] && { for OH in $(cut -d# -f1 $ORATAB | cut -d: -f2 -s | sort -u)
do OH_OWNER=$(ls -dl $OH | awk '{ print $3 }') ; [ "$OH_OWNER" == "root" ] && \
OH_OWNER=$CRS_OWNER ; ls -dl $OH ; OPATCH=$OH/OPatch/opatch ; [ -x $OPATCH ] \
&& su $OH_OWNER -c "$OPATCH lsinv -oh $OH | egrep '^Ce|^I|^O|^P|^T|from|node'"
echo $DL ; done ; } ; [ -r $OEMHL ] && { echo "Oracle Enterprise Manager OMS \
and/or Agent Homes in $OEMHL :" ; cat -bs $OEMHL ; echo $DL ; { for OH in $(\
cut -d: -f1 $OEMHL | sort -u) ; do [ -d $OH ] && { ls -dl $OH ; OH_OWNER=$(ls \
-dl $OH | awk '{ print $3 }') ; OPATCH=$OH/OPatch/opatch ; [ -x $OPATCH ] && \
su $OH_OWNER -c "$OPATCH lsinv -oh $OH | egrep '^Ce|^E|^I|^O|^P|^T|from|node'"
echo $DL ; } ; done ; } ; } ; } | tee /tmp/OPinv.log
# EOF


Tablespace space details script with temp

set pages 100
col Name for a20
SELECT 
/* PERMANENT*/
   d.tablespace_name "Name", 
   TO_CHAR(NVL(a.bytes / 1024 / 1024, 0),'99,999,990.900') "Allocated Size (Mo)", 
   TO_CHAR(NVL(a.bytes - NVL(f.bytes, 0), 0)/1024/1024,'99,999,999.999') "Used (Mo)",
  TO_CHAR(NVL(a.maxbytes / 1024 / 1024, 0),'99,999,990.900') "MAX Size (Mo)",
  TO_CHAR(NVL((a.bytes - NVL(f.bytes, 0)) / a.maxbytes * 100, 0), '990.00')  "Used % (including Autoextend)" 
FROM 
  sys.dba_tablespaces d, 
  (select tablespace_name, sum(bytes) bytes,sum(decode(autoextensible,'YES',maxbytes,bytes)) maxbytes  
from dba_data_files group by tablespace_name) a, 
  (select tablespace_name, sum(bytes) bytes from dba_free_space group by tablespace_name) f 
WHERE 
 d.tablespace_name = a.tablespace_name(+) AND 
 d.tablespace_name = f.tablespace_name(+) AND NOT 
 (d.extent_management like 'LOCAL' AND d.contents like 'TEMPORARY') 
UNION ALL 
/* TEMPORARY*/
 SELECT   
 A.tablespace_name "Name" , 
      TO_CHAR(NVL(D.mb_total, 0),'99,999,990.900') "Allocated Size (Mo)",
       TO_CHAR(NVL(SUM (A.used_blocks * D.block_size),0)/1024/1024,  '99,999,990.999') "Used (Mo)", 
       TO_CHAR(NVL(M.maxbytes/1024/1024, 0),'99,999,990.900') "MAX Size (Mo)",
        to_char(nvl((SUM (A.used_blocks * D.block_size)/1024/1024 ) / D.mb_total *100,0),'990.00')  "Used % (including Autoextend)"
FROM     v$sort_segment A,
         (
         SELECT   B.name, C.block_size, SUM (C.bytes) / 1024 / 1024 mb_total
         FROM     v$tablespace B, v$tempfile C
         WHERE    B.ts#= C.ts#
         GROUP BY B.name, C.block_size
         ) D,
 ( select tablespace_name,sum(decode(autoextensible,'YES',maxbytes,bytes)) maxbytes  
from dba_temp_files group by tablespace_name) M
WHERE    
 A.tablespace_name = D.name
 and D.name= M.tablespace_name
GROUP by 
A.tablespace_name, D.mb_total,M.maxbytes
order by 5 desc ;

Exadata scripts blog - very good


https://unknowndba.blogspot.com/2018/04/a-shortcut-to-all-scripts-provided-by.html

Database patch set details on one server of serveral homes ==========================================================================...