Mantenimiento de datafiles

Mantenimiento de datafiles

Adjunto un pequeño script que tengo configurado vía crontab, para tener controlado cuando los tablespaces llegan a cierto umbral que se pasa por parámetro.

Lo que se hace es redimensionar el datafile añadiendo 5Gb y me notifica vía email si ha habido algún tablespaces que haya sufrido ese mantenimiento.

¡Espero que os sirva!

#!/bin/sh

. /home/oracle/.bashrc

UMBRAL=${1}

getInfo_Tablespace() {
    sqlplus -s ${USER}/${PASS}@${SID} <<EOF
     set lines 200 pages 9000
     set termout off
     set heading off
     set feedback off; 
     spool INFO_TABLESPACE.log
     Select 'Tablespace '||"Name"||' Ocupado: '||Trunc("(Used) %",2)||'%' Info, "Name" Tablespace_Nane
      From  (
      Select d.Status "Status",
         d.Tablespace_Name "Name",
         To_Char(Nvl(a.Bytes / 1024 / 1024 / 1024, 0), '99,999,990.90') "Size (GB)",
         To_Char(Nvl(a.Bytes - Nvl(f.Bytes, 0), 0) / 1024 / 1024 / 1024,
                 '99999999.99') "Used (GB)",
         To_Char(Nvl(f.Bytes / 1024 / 1024 / 1024, 0), '99,999,990.90') "Free (GB)",
         Nvl((a.Bytes - Nvl(f.Bytes, 0)) / a.Bytes * 100, 0) "(Used) %"
       From Sys.Dba_Tablespaces d,
         (Select pp.Name Tablespace_Name, Sum(Bytes) Bytes
            From v\$DATAFILE rr, v\$tablespace pp
           Where rr.TS# = pp.TS#
           Group By pp.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')
     ) Where "(Used) %" >= ${UMBRAL} And Instr("Name",'SYS') =  0 And Instr("Name",'UNDOTBS1') = 0;
    set heading on;
    set feedback on; 
    spool off;
    exit;
EOF
}

lanza_sqlplus() {
    sqlplus -s ${USER}/${PASS}@${SID} <<EOF
    set lines 200 pages 9000
    set termout off
    set heading off
    ${SQL}
    EXIT;
EOF
}
   getInfo_Tablespace

   LINEAS=`cat INFO_TABLESPACE.log`

   if [[ "$LINEAS" ]]
   then
     while IFS='' read -r line
     do
      set __ $line
      TABLESPACE=${6}
      if [[ "${TABLESPACE}" ]]
      then
      SQL=$(cat <<EOF
       Select Name, Ceil((BYTES + (5*(1024*1024*1024)))/1024/1024) Size_Mb
        From (
         Select r.FILE#, r.NAME , BYTES
          From v\$datafile r, v\$Tablespace z
         Where z.name = '${TABLESPACE}'
           And z.ts# = r.TS#
         Order By CREATION_TIME Desc
             )
        Where Rownum = 1;
EOF
    )

     set __ $(lanza_sqlplus)

     DATAFILE=${2}
     TAMANYO=${3}

     if [[ "${DATAFILE}" ]]
     then
     echo ${2}
     SQL=$(cat << EOF
     begin
      execute immediate 'ALTER DATABASE DATAFILE ''${DATAFILE}'' RESIZE  ${TAMANYO}M';
     end;
     /
EOF
)    
     echo ${SQL}

     $(lanza_sqlplus)

      . /home/oracle/scripts/email.sh "Mantenimiento Tablespace ${TABLESPACE}  with more ${UMBRAL}%"  "Mantenimiento Tablespace ${TABLESPACE}  with more ${UMBRAL}%"
     fi
     fi
     done <  INFO_TABLESPACE.log
   fi