Bacula: освобождаем место

Оказалось как всегда все в opensource не просто. Благо наткнулся на скрипт для linux. Оставалось адаптировать его под freebsd. Данный скрипт будет удалять бекапы старее двух месяцев.

Для начала установим coreutils поскольку в нем есть gnu date. Вам же надо будет подправить пути в скрипте и срок бекапов под свои реалии.

#!/usr/bin/env bash
#set -x

# original script https://gist.github.com/starkers/5cfa83dfaeba2da9fe7c

# Prune and volumes older than 2 months:
PAST=`gdate --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 -U postgres $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 $TMPF2
        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:

        NAME="$(cut -f1 -d"_" <<<"$a")"
        #Firstly lets remove the Catalog files
        if grep -q ^Catalog_File <<< "$a"  ; then
            FPATH=/backups
            echo "+[$a] removing file: $FPATH/$NAME/volume/$a"
            echo rm -f "$FPATH/$NAME/volume/$a"
            rm -f "$FPATH/$NAME/volume/$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=/backups
            echo "+[$a]  removing file: $FPATH/$NAME/volume/$a"
            echo rm -f "$FPATH/$NAME/volume/$a"
            rm -f "$FPATH/$NAME/volume/$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;"

В скрипте после shebang указана ссылка на оригинальный скрипт.