pg_dump & rotate script


5分で作った。動いた。わーい。

#!/usr/bin/perl
use strict;
use FindBin;
use File::Spec;
use Data::Dumper;
use DateTime;
use Getopt::Long;

my $dir         = '/tmp';
my $keep_count  = 5;
my $database    = 'foo';
my $pg_user     = 'foo';
my $pg_password = '';
my $host        = 'localhost';

my $result 
    = GetOptions(
        "dir=s"         => \$dir,
        "keep_count=i"  => \$keep_count,
        "database=s"    => \$database,
        "host=s"        => \$host,
        "pg_user=s"     => \$pg_user,
        "pg_password=s" => \$pg_password,
    );

# 多分これでOK。今パスワード使ってないので、テストしてない。
$ENV{PG_PASSWORD} = $pg_password;

my $dt = DateTime->now( time_zone => 'local' );
my $file = File::Spec->catfile( $dir , $database . '_' .  $dt->ymd() . '_' . $dt->hms . '.dump');

# ダンプする
`pg_dump -Fc -f $file $database -h $host -U $pg_user`;

# 古い順
my @files = `ls -h $dir | grep '.dump\$'`;

# 改行取る
for(@files){ chomp; }

if( scalar @files > $keep_count ) {
    unlink  File::Spec->catfile( $dir , $files[0] );
}

1;

=head1 NAME

pg_dump.pl - pg_dumpスクリプト

=head1 DESCRIPTION

ダンプとローテションをします。これをローテーションというかは、微妙ですが。

=head1 SYNOPSYS

 perl pg_dump.pl --dir '/tmp' --keep_count=5 --host='localhost' --database=foo pg_user=foo pg_password=hacker

=cut