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;
}