quarta-feira, 24 de novembro de 2010

PostgreSQL - Remover arquivos WAL antigos que já foram "backupeados"

Um problema para quem utiliza o PostgreSQL em modo archive é que depois de fazer backup dos mesmos com o 'pg_rman' eles permanecem no disco. Com o tempo o disco ficará cheio e o que era para ser uma solução vira uma dor de cabeça.

Com isso criei um script em Perl que remove os archives mais antigos que já foram "backupeados". Os archives serão apagados se e somente se o último backup com o 'pg_rman' esteja validado com o status de 'OK'. A variável '$opt_date' deve ser utilizada fornecendo o número de archives criados antes do último backup que deseja manter em disco.

Código:


#!/usr/bin/perl

# Author: Gabriel Prestes
# Last modified: 11-24-2010
# Fuction: Recycle WAL backed in PostgreSQL

($opt_date) = @ARGV;

        # --- Doc --- #
        # WAL after backup example: 00000001000000000000004B.00000020.backup
        # --- Doc --- #

        # --- VARS --- #
        my @list=();
        my @list2=();
        my @stat=();
        my $wal_path="/data/archive_log";
        my $backup_catalog="/var/lib/pgsql/backup_catalog";
        my $lastbkp="";
        my $cmd="";
        my $counter=0;
        my $flag=0;
        my $flagok=0;
        my $pointrecycle="";

        if(!$opt_date){

                print "ERROR - Please insert number of WAL to keep after recycle\n";
                exit(1);

        }

        @list=`/bin/ls -t $wal_path`;
        @list2=`/usr/bin/pg_rman show -B $backup_catalog`;

        # -- CHECK first WAL backup --- #
        foreach(@list){

                chomp($_);
                if($_ =~ ".backup"){

                        @stat=`/usr/bin/stat $wal_path/$_`;
                        foreach(@stat){chomp($_);if($_ =~ m/^Modify: (.+) [0-9].+$/){$lastbkp=$1;last;}}
                        print "BACKUP LOCATED $wal_path/$_ - done in '$lastbkp'\n";
                        $pointrecycle=$_;
                        last;

                }

        }

        # --- CHECK last backup done with success --- #
        foreach(@list2){

                chomp($_);
                if($_ =~ $lastbkp and $_ =~ "OK"){

                        print "LAST VALIDATED BACKUP IS '$_'\n";
                        $flagok++;
                        last;

                }

        }

        # --- Thresholds --- #
        if($flagok>0){

                # --- Remove old WALs --- #
                foreach(@list){

                        chomp($_);
                        if($flag == 1){$counter++;}
                        if($_ =~ $pointrecycle){$flag++;}
                        if($flag == 1 and $counter > 0 and $counter <= $opt_date){print "OLD WAL '$_' PRESERVED\n";}
                        if($flag == 1 and $counter > 0 and $counter > $opt_date){print "OLD WAL '$_' REMOVED\n"; $cmd=`/bin/rm -f $wal_path/$_`; sleep(01);}

                }

        }

        else{

                print "LAST BACKUP RUN WITH ERRORS\n - WALS FILES NOT REMOVED\n";

        }



# EOF

Nenhum comentário:

Postar um comentário