MYSQL-innobackupex备份脚本

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

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

 --parallel 参数,开启多并行度备份,但会增加服务器负荷。

以下是我写的备份脚本,要求备份目录的磁盘容量至少是数据文件的3倍以上。

#每天备份一次。一次全量,与两次增量,循环备份。备份保留三天。
#!/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

#全量、增量备份
#如果今天有full,则创建incr1
if [ -d "$backdir"_full ];then
(echo "#####开始今日一次增量备份 at $BEGINTIME " ) && >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf  --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$backdir"_full "$backdir"_incr1 1> $out_log 2>&1
tar -czvf ${redo}/redofile_"$time"_full.tar.gz "$backdir"_full >/dev/null  2>&1;
rm -rf "$backdir"_full;
break;

#如果今天有incr1,则创建incr2
elif [ -d "$backdir"_incr1 ];then
(echo "#####开始今日第2次增量备份  at $BEGINTIME " ) && >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf  --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$backdir"_incr1 "$backdir"_incr2 1> $out_log 2>&1
tar -czvf ${redo}/redofile_"$time"_incr1.tar.gz "$backdir"_incr1 >/dev/null  2>&1
rm -rf "$backdir"_incr1;
break;

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

#如果昨天有incr2,则创建full
elif [ -d "$old_dir"_incr2 ];then
(echo "#####覆盖[旧]备份,创建[新]全量备份 at $BEGINTIME " ) && >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --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 ") && >>$time_cost
$backupbin/innobackupex --defaults-file=$file_cnf  --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$old_dir"_full "$backdir"_incr1 1> $out_log 2>&1
break;

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

fi

#对昨天的文件压缩归档,删除三天前的文件

a=`ls /mysql_backup|grep "$time_old"_*`;

if [ -d "$old_dir"_* ];then
tar -czvf ${redo}/redofile_${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 {} ;


#输出时间变量
b=`(ls /mysql_backup/${*} |grep ''-'')`
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 "耗时 $spendtime sec 用于创建备份文件 $b") && >>$time_cost

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

30 23 * * * /root/innobackupex.sh

注意脚本的执行权限

恢复的脚本预计下周写完。

原文地址:https://www.cnblogs.com/shc336/p/10077027.html