-
-
Save efr2et/a00ddc301c395f1e076f88bdc4cf9f34 to your computer and use it in GitHub Desktop.
prune delete and remove old bacula volumes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
#set -x | |
# Prune and volumes older than 2 months: | |
PAST=`date --date='-2 months 0 day ago' +%Y-%m-%d` | |
#EG a hard coded date | |
#PAST="2012-11-29" | |
#PAST="2013-11-29" | |
DB=bacula | |
#tmpfiles | |
TMPF1=`mktemp` | |
TMPF2=`mktemp` | |
#extract stuff from postgresq | |
psql $DB -c "select volumename from media where lastwritten < '$PAST' " > "$TMPF1" | |
#an ugly attempt to clean the output.. I'm sure this can be fixed with a flag on the above cmd sometime | |
VOLS=`awk '{print $1}' "$TMPF1" | tail -n+3 | grep -v "(" ` | |
#output a clean list of volumes into TMPF2 | |
cp /dev/null $TMPF2 | |
for a in $VOLS ; do | |
echo $a >> $TMPF2 | |
done | |
#how many volumes did we match btw? | |
COUNT=`wc -l $TMPF2 | awk '{print $1}'` | |
if [ "$COUNT" -gt 0 ]; then | |
echo "Found $COUNT volumes" | |
for a in `cat "$TMPF2"` ; do | |
echo "### processing $a ###" | |
cp /dev/null $TMPF1 | |
printf "prune yes volume=$a\n" >> $TMPF1 | |
printf "delete yes volume=$a\n" >> $TMPF1 | |
#bconsole <$TMPF1 1>/dev/null | |
# ^ uncomment the above to go live, check this works first! | |
#check if bconsole exited with an error | |
if [ "$?" -gt 0 ]; then | |
echo "+[$a]: WARNING: something went wrong with bconsole: $?" | |
echo "See: TMPF1=$TMPF1 / TMPF2=$TMPF2" | |
exit | |
fi | |
# The above takes care of the bacula side.. now delete files | |
# as I store my files in a per-host directory (and keep catalog files elsewhere I just split this into two: | |
#Firstly lets remove the Catalog files | |
if grep -q ^Catalog_File <<< "$a" ; then | |
FPATH=/mnt/snas1/backups/new | |
echo "+[$a] removing file: $FPATH/$a" | |
echo rm -f "$FPATH/$a" | |
# rm -f "$FPATH/$a" | |
# ^ uncomment the above to go live | |
# else its a client.. | |
else | |
# get the clients name from $a | |
NAME="$(cut -d "-" -f 1 <<<"$a")" | |
FPATH=/mnt/snas1/backups/new/pools | |
echo "+[$a] removing file: $FPATH/$NAME/$a" | |
echo rm -f "$FPATH/$NAME/$a" | |
# rm -f "$FPATH/$NAME/$a" | |
# ^ uncomment the above to go live | |
fi | |
echo | |
done | |
else | |
echo "No volumes found older than $PAST" | |
fi | |
#cleanup | |
rm "$TMPF1" "$TMPF2" | |
## Now as you may note the log table can get quite large. | |
# bacula does not (internally) rely on this in any form.. rather the "file" table is the important one | |
# | |
# | |
# bacula=# SELECT | |
#bacula-# relname AS objectname, | |
#bacula-# relkind AS objecttype, | |
#bacula-# reltuples AS "#entries", pg_size_pretty(relpages::bigint*8*1024) AS size | |
#bacula-# FROM pg_class | |
#bacula-# WHERE relpages >= 8 | |
#bacula-# ORDER BY relpages DESC; | |
# objectname | objecttype | #entries | size | |
#---------------------------------+------------+-------------+--------- | |
# log | r | 2.18772e+06 | 78 GB | |
# file | r | 3.49857e+08 | 51 GB | |
# file_jpfid_idx | i | 3.49857e+08 | 24 GB | |
# file_jobid_idx | i | 3.49857e+08 | 13 GB | |
# file_pkey | i | 3.49857e+08 | 11 GB | |
# log_name_idx | i | 2.18772e+06 | 7681 MB | |
# I suggest you truncate the bastard | |
# psql $DB -c "TRUNCATE log;" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment