Inhaltsverzeichnis

Oracle Audit Log Files unter Linux löschen

Das Problem:

Mit der Zeit sammlen sich die SYS audit connections Logs im Audit Verzeichnis auf der Platte an.

Besonders in einer Oracle Cluster Umgebung kommen hier schnell mal ein paar hundertausend oder gar Millionen von Dateien zusammen.

Ein einfaches „rm *“ führt hier dann nicht mehr zum gewünschten Ziel! Die Schell kann das bei solche großer Anzahl nicht mehr expandieren!

Neuere Dateien sollen zudem noch aufgehoben werden und ab einer gewissen Menge an Dateien ist ein „*“ gar keine gute Idee mehr!

Siehe dazu aber auch die Möglichkeit das intern mit ⇒ Die Audit Logs der Datenbank unter Oracle 11g/12c mit DBMS_AUDIT_MGMT "aufräumen" .


Lösung A: Über Find mit dem Datei Datum löschen:

Finde all die älter als 160 Tage sind:

#Liste die Anzahl über die Tage auf:
ls -la | awk '{ print $7 "-" $6 }' | sort | uniq -c 
 
#Alternativ über stat !Langsamer
find . -name "*.aud" -exec stat -c %y {} \; | awk '{ print $1 }' | sort | uniq -c 
 
 
#Lösche Dateien die älter als 160 Tage sind:
 
find . -name "*" -mtime +160 -exec rm {} \;

Lösung B: Mit einem Script automatisieren:

Skript:

delete_audit_log_older_then.sh
#!/bin/sh
 
FILES=/u01/app/11.2.0.4/grid/rdbms/audit/*.aud
LOG_FILE=/tmp/aud_delete_logs_list.log
 
DATE_NOW_EPOCH=`date +%s`
#Get the epoch 6 Month ago
DATE_DELETE_OLDER=`date --date "now -6 months" +"%s"`
 
echo "Info - check the age of the file - start at  -- `date` -- " > $LOG_FILE
 
for f in $FILES
do
  #File date as epoch 
  FILE_DATE=`stat -c %Y ${f}`
  FILE_LOG_DATE=`stat -c %y ${f}`
  if [[ $FILE_DATE -lt $DATE_DELETE_OLDER ]];
  then
   echo "Info - delete :: ${FILE_LOG_DATE} ${f}"  >> $LOG_FILE
   rm ${f}
  fi
done
 
echo "Info - finish at  -- `date` -- "        >> $LOG_FILE

Das kann dann automatisiert regelmäßig laufen und die Umgebung „säubern“.