Bacula-users

Re: [Bacula-users] Script to find/delete disk volumes which are no longer used (slight change)

2013-06-07 12:51:41
Subject: Re: [Bacula-users] Script to find/delete disk volumes which are no longer used (slight change)
From: Jonathan Bayer <linuxgurugamer AT gmail DOT com>
To: bacula-users AT lists.sourceforge DOT net
Date: Fri, 07 Jun 2013 12:47:54 -0400
If you were trying to use this, the "set -u" was misplaced.  See below for the correct location

JBB

On 6/7/2013 11:07 AM, Jonathan Bayer wrote:
Hi,

We are using Bacula to backup a number of VMs.  The backup is being done to disk volumes.

The configuration I've set up is still being tuned.  In the meantime, I found that there are a number of disk volumes which, which the file(s) themselves are rather large, all the files on the jobs which are in that volume have been expired, so the physical volume itself can be deleted both from the database and the disk.

I've written a script which I've included below.  I'd appreciate any comments on it.  Hopefully this will help someone else.

JBB


#!/bin/bash

#
# show usage of volumes (ie:  how many files are on each volume
# which have not been purged/expired from the database)
#
# Usage:
#       purgediskvolumes [-d dir] [volumename(s)]
#
#               -d              specify a custom directory
#               volumename(s)   Specific volume names to check
#

set -e


DBHOST=localhost
DBUSER=bacula
DB=bacula_db
FILEDIR="/mnt/baculaStorage"

# End of changable parameters

if [ "$1" = "-d" ]; then
        if [ $# -lt 2 ]; then
                echo "Missing directory name, exiting"
                exit 1
        fi
        FILEDIR=$2
        shift
        shift
fi
if [ ! -d $FILEDIR ]; then
        echo "$FILEDIR is not a directory, exiting"
        exit 1
fi
set -u
START=$(date +%s)

RUN_ON_MYDB="/usr/bin/psql -t --no-align -X -U $DBUSER -h $DBHOST $DB"
files=`ls $FILEDIR`

[ $# -ne 0 ] && files="$*"

emptyvolumes=""
for volume in $files; do
        if [ "$volume" != "lost+found" ]; then
                #
                # Get list of jobs on a volume
                #
                sql="SELECT DISTINCT Job.JobId
                        FROM JobMedia,Job,media
                        WHERE JobMedia.JobId=Job.JobId
                        AND JobMedia.MediaId=media.mediaid
                        AND media.volumename='$volume'"

                jobids=`$RUN_ON_MYDB -c "$sql"`

                #
                # now get count of files in Db for each job
                #
                cnt=0
                for jobid in $jobids; do
                        sql="SELECT count(*) FROM File,Filename,Path WHERE
                                File.JobId='$jobid' AND
                                Filename.FilenameId=File.FilenameId AND
                                Path.PathId=File.PathId"
                        numfiles=`$RUN_ON_MYDB -c "$sql"`
                        cnt=$((cnt + numfiles))
                done
                echo -e "Total files on volume $volume: $cnt\n"
                [ $cnt -eq 0 ] && emptyvolumes="$volume $emptyvolumes"

        fi
done
echo "Empty Volumes: $emptyvolumes"
cd $FILEDIR
ls -lh $emptyvolumes

END=$(date +%s)
DIFF=$(( $END - $START ))
echo "Searchtime: $DIFF seconds"


echo "Do you wish to delete these volumes from the database and the disk (Y/n): "
read yn
[ "$yn" = "n" -o "$yn" = "N" ] && exit


#
# get the filesystem type, if it is an ext3 filesystem, then
# the default answer to the next question will be yes, otherwise
# it will be no
# This is needed since deleting a very big file on an ext3 filesystem
# can totally lock up the system until the delete is done
#
fstype=`df -TP "${FILEDIR}"`
def="y/N"
[ "$fstype" = "ext3" ] && def="Y/n"

echo "Do you need/want to delete the file by truncating in parts"
echo "to avoid locking up the system.  This may be needed on ext3"
echo "filesystems when the files are very big. ($def): "
read trunc
if [ "$trunc" = "" ]; then
        [ "$def" = "y/N" ] && trunc="n"
        [ "$def" = "Y/n" ] && trunc="y"
fi

for vol in "$emptyvolumes"; do
        echo "delete volume=$vol yes"
done | bconsole

if [ "$trunc" = "n" -o "$trunc" = "N" ]; then
        for vol in "$emptyvolumes"; do
                rm -f ${FILEDIR}/$vol
        done
else
        #
        # use the truncate command to slowly shrink the file by 100 meg
        # at a time.  RHEL_5 based systems will need to get the truncate command from
        # RHEL6 or CentOS6
        #

        SLEEP=0.1
        TRUNCATEBY=100000000 # 100 meg
        trunc=`which truncate 2>/dev/null`
        if [ "$trunc" = "" ]; then
                echo "truncate command isn't available"
                echo "Will just delete files instead"
        fi
        for vol in "$emptyvolumes"; do
                file=${FILEDIR}/$vol
                echo "Deleting $file"
                if [ "$trunc" != "" ]; then
                        size=`ls -l $file |awk '{print $5}'`
                        while [ $size -gt $TRUNCATEBY ]; do
                                size=`echo $size-$TRUNCATEBY|bc`;
                                $trunc -c -s -$TRUNCATEBY $file ;
                        sleep $SLEEP
                        done
                fi
                rm -f $file
        done
fi





------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. A cloud service to automate IT design, transition and operations
2. Dashboards that offer high-level views of enterprise services
3. A single system of record for all IT processes
http://p.sf.net/sfu/servicenow-d2d-j
_______________________________________________
Bacula-users mailing list
Bacula-users AT lists.sourceforge DOT net
https://lists.sourceforge.net/lists/listinfo/bacula-users
<Prev in Thread] Current Thread [Next in Thread>