11. 5. 2017

Oracle - shell odmazávač starých logov

Tu je shell skript, ktorým na unixovom serveri mažem rôzne oracle log súbory o ktoré sa nestará ADRCI. Ide hlavne o adump súbory (audit prihlásení do DB).
Funguje ako doplnok k minule riešenému odmazávaniu cez ADRCI.

Tento jednoduchý program je inšpirovaný unixovým príkazom find, jadrom je funkcia "zmazf" ktorá je rozdelená na dve časti, jedna ponechá zadaný počet súborov (posledných).
Druhá časť hľadá cez find súbory staršie ako daný počet dní.

Zdrojový kód:

#!/bin/sh

# ====== CLEANER.SH =======
# BK2     2010
# jednoducha verzia
# =========================

konf="/opt/oracle/bk2/cleaner/cleaner.ini"


# --- UNIVERZALNA FUNKCIA MAZANIA SUBOROV ---
function zmazf {
verbose=1
poceta=0
prvyadr="`find $1 -type d | head -1`"
if [ -d "$prvyadr" ]; then
  # ZADANY POCET SUBOROV AKO 3 PARAMETER
  if [ "`echo $3 | cut -c3`" != "" ]; then
    poc=`ls $1/$2 | wc -l | tr -d " "`
    echo "  +nechavam poslednych $3 suborov z $poc v $1"
    if [ $poc -gt $3 ]; then
     # VIAC SUBOROV AKO CHCEME, MAZEME
      zpoc=`expr $poc - $3`
      for x in `ls -t $1/$2 | tail -$zpoc`; do
        echo "   $x"
        fs=`ls -la $x | awk '{ print $5 }'`
        if [ "$fs" != "" ]; then spolu=`expr $spolu + $fs`; fi
        poceta=`expr $poceta + 1`
        if [ "$zmaz" = "1" ]; then rm -f "$x"; fi
      done
    fi
  else
  # ZADANY CAS AKO 3 PARAMETER
  find $1 -name "$2" -type f $fol -mtime +$3 2>/dev/null | while read f; do
    if [ "$verbose" = "1" ]; then echo "   $f";
          if [ "$poceta" = "200" ]; then verbose=0; fi
    else
      if [ "`echo $poceta | grep \"00$\"`" ]; then echo "   $poceta files"; fi
    fi
    fs=`ls -la $f | awk '{ print $5 }'`
    if [ "$fs" != "" ]; then spolu=`expr $spolu + $fs`; fi
    poceta=`expr $poceta + 1`
    if [ "$zmaz" = "1" ]; then rm -f "$f"; fi
  done
 fi
fi

pocet=`expr $pocet + $poceta`
}


# --- MAIN ------------
# ---------------------

# --- INICIALIZACNA CAST ---
tmpdr="/tmp"
zmaz=0
if [ "$1" = "-d" ]; then zmaz=1; fi
spolu=0
pocet=0
fol="-follow"

df -g | grep -v "var" | awk '{ print $2"\t"$3"\t"$4"\t"$7 }' > $tmpdr/cleaner1.log

echo "+++cleaner start at `date`:"

# --- PEVNE CISTENIA ---
echo "  +cistim adump"
zmazf "/opt/oracle/diag/rdbms/*/*/adump" "*.aud" "3"
echo "  +cistim alert xml"
zmazf "/opt/oracle/diag/tnslsnr/*/*/alert" "log_*.xml" "3"


if [ -f "$konf" ]; then
 echo "  +cistim podla suboru cleaner.ini"
 for x in `cat $konf | grep -v "^$" | grep -v "^#"`; do
  ces="`echo $x | cut -d":" -f1`"
  naz="`echo $x | cut -d":" -f2`"
  vek="`echo $x | cut -d":" -f3`"
  zmazf "$ces" "$naz" "$vek"
 done
fi

# --- KONIEC ---
# --------------
spolu=`expr $spolu / 1024`

echo " --zmazane $spolu KB v $pocet suboroch"
if [ "$zmaz" = "1" ]; then
echo " --zmena kapacit na filesysteme:"
# cakame koli postupnemu asynchronnemu uvolneniu diskov po mazani
sleep 13
df -g | grep -v "var" | awk '{ print $2"\t"$3"\t"$4"\t"$7 }' > $tmpdr/cleaner2.log

diff $tmpdr/cleaner1.log $tmpdr/cleaner2.log | grep "%" | sort +2

else
echo "!!!pozor, spusteny beh bez priznaku mazania -d"
fi


V kóde je priamo zadané mazanie adump súborov starších ako 3 dni:
zmazf /opt/oracle/diag/rdbms/*/*/adump *.aud 3
Ďalej xml súbory listenerov staršie ako 3 dni:
zmazf /opt/oracle/diag/tnslsnr/*/*/alert log_*.xml 3

Ak sa na treťom mieste nachádza trojciferné číslo (003), ponechá daný počet najaktuálnejších súborov.

Navyše v danej ceste kontroluje konfiguračný súbor cleaner.ini, do ktorého je možné pridať vlastné nastavenie ciest, príklad:
/opt/oracle/diag/rdbms/DB1/db1/trace:*.trc:050
/opt/oracle/diag/rdbms/DB1/db1/trace:*.trm:050

Skript bez parametra -d simuluje odmazávanie, ale nemaže súbory. Slúži ako testovací beh správnej konfigurácie pred jej zaradením do pravidelného spúšťania z cronu.

Žiadne komentáre:

Zverejnenie komentára