MYSQL-innobackupex备份脚本

自动化运维,是数据库管理员的不懈追求。目前出现了一些数据库自动管理平台,但出现时间较短,不够稳定。最常用的工具依然是shell脚本。

现在需要管理的某mysql数据库,数据量在800G,使用dump备份时间过长,从而使用了网上推荐的innobackupex方式。影响备份速率的因素很多,这里就不一一讨论。

以下是我写的一个备份脚本,欢迎大佬指正

#每天备份一次。第一天全量,之后两天增量,循环备份。备份保留三天。
#!/bin/bash
# 定义变量
user_name=root
password="123456"
socket="/mysqldb/home/mysql.sock"
file_cnf=/mysqldb/config/my.cnf

BEGINTIME=`date +"%Y-%m-%d %H:%M:%S"`
format_time=`date +"%Y-%m-%d_%H:%M:%S"`
#week=`date +%Y-%m-%d -d "-24hour"`
time=`date +"%Y-%m-%d"`
time_old=$( date +"%Y-%m-%d" -d "-24hour" )
backupbin=/usr/bin

backdir=/mysql_backup/$time   #备份目录,数据文件形式,保留一天,第二天压缩
old_dir=/mysql_backup/$time_old  
redo=/mysql_backup/redofile   #留存目录,tar.gz格式
out_log=/mysql_backup/info/xtrabackup_log_$format_time     #innobackupex输出信息日志
time_cost=/mysql_backup/info/xtrabackup_time.txt           #innobackupex记录

#创建目录
if [ ! -d "/mysql_backup/redofile" ];
then 
mkdir -p /mysql_backup/redofile
fi

if [ ! -f "/mysql_backup/info/xtrabackup_time.txt" ];
then
mkdir -p /mysql_backup/info/
touch /mysql_backup/info/xtrabackup_time.txt
fi

#创建今日备份目录
/usr/bin/mkdir -p $backdir;
chown -R mysql.mysql $backdir;

#全量、增量备份
#如果昨天没有文件,则创建全量
if [ ! -d "$old_dir"_* ];then
echo "#####创建[新]全量备份 at $BEGINTIME to directory $backdir" >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket  $backdir 1> $out_log 2>&1
mv "$backdir" "$backdir"_full
break;

#如果昨天有incr2,则创建full
elif [ -d "$old_dir"_incr2 ];then
echo "#####覆盖[旧]备份,创建[新]全量备份 at $BEGINTIME to directory $backdir" >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --socket=$socket  $backdir 1> $out_log 2>&1
mv "$backdir" "$backdir"_full
break;


#如果昨天有full,则创建incr1
elif [ -d "$old_dir"_full ];then
echo "#####开始第1次增量备份  at $BEGINTIME to directory $backdir" >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf  --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$old_dir"_full $backdir 1> $out_log 2>&1
mv "$backdir" "$backdir"_incr1
break;

#如果昨天有incr1,则创建incr2
elif [ -d "$old_dir"_incr1 ];then
echo "#####开始第2次增量备份  at $BEGINTIME to directory $backdir" >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf  --no-timestamp --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$old_dir"_incr1 $backdir 1> $out_log 2>&1
mv "$backdir" "$backdir"_incr2
break;
fi
#对昨天的文件压缩归档,删除三天前的文件 a
=`ls /mysql_backup|grep "$time_old"_*`; if [ -d "$old_dir"_* ];then tar -czvf ${redo}\/redofile_${time_old}_${a}.tar.gz "$old_dir"_* >/dev/null 2>&1 #删除已归档文件夹 rm -rf "$old_dir"_* && echo "#####删除已归档的数据文件"$old_dir"" 1>>$time_cost break; fi #删除3天前的归档文件 find /mysql_backup/redofile/ -mtime +3 -name "redofile_*" && echo "#####删除3天前的归档文件">>$time_cost; find /mysql_backup/redofile/ -mtime +3 -name "redofile_*" -exec rm -rf {} \; #输出时间变量 ENDTIME=`date +"%Y-%m-%d %H:%M:%S"` begin_data=`date -d "$BEGINTIME" +%s` end_data=`date -d "$ENDTIME" +%s` spendtime=`expr $end_data - $begin_data` echo "it takes $spendtime sec for packing the data directory" >>$time_cost

脚本写完后,加入crontab中,我设置的是每天23点30份执行

30 23 * * * /root/innobackupex.sh

注意脚本的执行权限

innobackupex自动恢复的脚本,逻辑相对复杂,预计下周写完,欢迎关注

猜你喜欢

转载自www.cnblogs.com/shc336/p/10077027.html