【perl】innobackupex 备份脚本

#!/usr/bin/perl -w 
use strict;

#  print to screen
my $LOG_OUT  = *STDOUT;

# backup dir
my $BAK_DIR = qq{/data/bak/inno};
# bak dir pre name
my $BAK_DIR_PRE_ALL = 'all_';
my $BAK_DIR_PRE_INC = 'inc_';


# innobackupex log filename
my $DATE_STR_LOG = `date '+%Y%m%d_%H%M%S'`;
chomp($DATE_STR_LOG);
#$DATE_STR =~ s/[\r\n]$//;
my $BAK_LOG_INNO = qq{$BAK_DIR/logs/inno_$DATE_STR_LOG.log};


# mysql :my.cnf user password
my $MYSQL_CNF = qq(/etc/my.cnf);
my $MYSQL_USER = qq(ubak);
my $MYSQL_PWD= qq(ubak);
# innobackupex
my $INNOBACKUPEX = qq{innobackupex --user=$MYSQL_USER --password=$MYSQL_PWD --defaults-file=$MYSQL_CNF --no-timestamp --slave-info};


# ----------------------------------------------------------------------------------------
# Main()
# ----------------------------------------------------------------------------------------
sub main(){
        # bakcup inno
        &do_innobackupex($BAK_DIR);
}


&main();


# ----------------------------------------------------------------------------------------
# Func :  use innobackupex
#   monday backup all  
# note:my.cnf must have some config
# [xtrabackup]
# datadir = innodb_data_home_idr
# ----------------------------------------------------------------------------------------
sub do_innobackupex{
        # 
        my ($m_bakdir_root) = @_; 


        # day of week(0..6),0 is sunday
        my $m_weekday = `date '+%w'`;


        # monday
        if ($m_weekday == 1) {
                # full backup name
                &do_innobackupex_all($m_bakdir_root);
        # other
        } else{
                #  increment backup name
                 &do_innobackupex_inc($m_bakdir_root);
        }


}




# ----------------------------------------------------------------------------------------
# Func :  innobackupex all
# ----------------------------------------------------------------------------------------
sub do_innobackupex_all{
        # 
        my ($m_bakdir_root) = @_; 


        # full backup name
        my $m_date_str = &get_date_str('0');
        my $m_target_dir = qq{$m_bakdir_root/$BAK_DIR_PRE_ALL$m_date_str};


        # backup shell
        $inno_shell = "$INNOBACKUPEX $m_target_dir 2>$BAK_LOG_INNO";


        # print "$inno_shell\n";
        my $res= `$inno_shell`;
}


# ----------------------------------------------------------------------------------------
# Func :  innobackupex increment
# ----------------------------------------------------------------------------------------
sub do_innobackupex_inc{
        # 
        my ($m_bakdir_root) = @_; 


        # bak all dir base:yesterday
        my $m_date_str = &get_date_str('-1');
        my $m_bak_base = qq{$m_bakdir_root/$BAK_DIR_PRE_ALL$m_date_str};


        # check ALL backup file is exists.if not ,do backup all
        if -e '$m_bak_base' {
            &do_innobackupex_all($m_bakdir_root);
        }
        #  increment backup  dir name
        else {
            $m_date_str = &get_date_str('0');
            my $m_target_dir = qq{$m_bakdir_root/$BAK_DIR_PRE_INC$m_date_str};


            # backup shell
            $inno_shell = "$INNOBACKUPEX --incremental $m_target_dir --incremental-basedir=$m_bak_base 2>$BAK_LOG_INNO";


            #print "$inno_shell\n";
            my $res= `$inno_shell`;
        }


}


# ----------------------------------------------------------------------------------------
# Func :  get date string
# ----------------------------------------------------------------------------------------
sub get_date_str{
        # 
        my ($m_date_dif) = @_; 
        my $m_date_str = `date --date="$m_date_dif day" '+%Y%m%d'`;
        chomp($m_date_str);
      
        return $m_date_str;
}

请使用浏览器的分享功能分享到微信等