On 04/19/2012 05:04 PM, Jerome Alet wrote:
> On Thu, Apr 19, 2012 at 10:11:20AM -0400, Josh Fisher wrote:
>>
>> Changing the "action on purge" for the pool does not change it for the
>> old volumes that were created before the change was made. You have to
>> individually update the action on purge for each of those old volumes.
>
> Sorry I didn't mention it but I did this with :
>
> UPDATE media SET actiononpurge=1;
>
> But still no volume is truncated excepted at recycle time, when possible
> (in our case not possible anymore for our Full storage pool).
>
> Since all storage pools are on the same disk partition, despite the
> Differential and Incremental storage pools having hundreds (they are
> small) of "dead" volumes, Full backups still can't happen because
> there's not a single recyclable volume in the Full storage pool.
>
> Any other idea ?
I gather you are creating a new volume for every job, and never reusing
the old ones. So write a simple shell script that will connect to the
bacula DB, select VolumeName from Media where VolStatus = 'Purged', save
the list of volume names, and delete them from the disk.
What I do: All disk volumes have RecyclePool = Scratch
Then I run this admin job once a week:
Job {
Name = "Clean Expired Volumes"
Type = Admin
Enabled = Yes
Pool = Scratch
FileSet = Dummy
Storage = babylon4-file
Client = babylon4
Level = Full
RunBeforeJob = "/opt/bacula/sbin/clean_volumes -v"
Rerun Failed Levels = yes
Messages = Daemon
Priority = 20
Allow Duplicate Jobs = no
Cancel Queued Duplicates = yes
Schedule = "Volume Cleanup"
}
/opt/bacula/sbin/clean_volumes:
#!/usr/bin/perl
use strict;
use Getopt::Long;
use IPC::Open2;
use IO::Handle;
my $bconsole = '/opt/bacula/bin/bconsole';
my (%opts, @purged, $pid);
GetOptions(\%opts,
'verbose|v',
'test');
my ($IN, $OUT) = (IO::Handle->new(), IO::Handle->new());
$pid = open2($OUT, $IN, $bconsole);
if (scalar (@purged = check_volumes()))
{
printf("Bacula reports the following purged volumes:\n\t%s\n",
join("\n\t", @purged)) if ($opts{verbose});
my $deleted = delete_volumes(@purged);
print "$deleted volumes deleted.\n" if ($opts{verbose});
}
elsif ($opts{verbose})
{
print "No purged volumes found to delete.\n";
}
print $IN "exit\n";
waitpid($pid, 0);
exit (0);
sub check_volumes
{
my $dividers = 0;
my (@purged, @row);
print $IN "list volumes pool=Scratch\n";
for (;;)
{
my $resp = <$OUT>;
last if ($resp =~ /No results to list./);
$dividers++ if ($resp =~ /^[\+\-]+$/);
last if ($dividers == 3);
@row = split(/\s+/, $resp);
push (@purged, $row[3]) if ($row[5] eq 'Purged');
}
return (@purged);
}
sub delete_volumes
{
my $volume_dir = '/spool/bacula/';
my $count = 0;
foreach my $vol (@_)
{
my $l;
my $file = $volume_dir.$vol;
print "Deleting volume $vol from catalog ... " if ($opts{verbose});
print $IN "delete volume=$vol yes\n";
$l = <$OUT>;
$l = <$OUT>;
print "Done.\nDeleting volume $file from disk ... " if
($opts{verbose});
if (-f $file)
{
$count++;
unlink ($file);
}
print "Done.\n" if ($opts{verbose});
}
return ($count);
}
--
Phil Stracchino, CDK#2 DoD#299792458 ICBM: 43.5607, -71.355
[email protected] [email protected] [email protected]
Renaissance Man, Unix ronin, Perl hacker, SQL wrangler, Free Stater
It's not the years, it's the mileage.
------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
Bacula-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bacula-users