XtraBackup全量和增量备份shell脚本
生产上的mysql要做数据备份,使用Percona XtraBackup进行热备份,本来想偷懒去网上找一个,找来找去没找到太合适的,自己写了个Percona XtraBackup的全备份和增量备份shell脚本,用法:
全备份: ./backup.sh full
增量备份: ./backup.sh inc
配合crond job 执行,很方便
脚本内容:
#!/bin/sh
#percona-xtrabackup全量和增量备份脚本
#Author :Will
#WebSite : www.nixops.me
#date : 2015/10/21
#usage: 1. full backup : ./backup.sh full
# 2. incremental backup : ./backup.sh inc
Innobackupex_Path=/usr/bin/innobackupex
Mysql_Client=/usr/bin/mysql
Bak_Time=`date +%Y%m%d_%H%M%S`
#请勿在Incrbackup_Path及下属文件夹创建或写入内容,否则可能导致增量备份不成功
Backup_Dir=/opt/backup #备份主目录
#Backup_Dir=/opt/backup/data/`data -I` #按日期生成备份主目录
Fullbackup_Path=$Backup_Dir/full # 全库备份的目录
Incrbackup_Path=$Backup_Dir/incr # 增量备份的目录
Log_Path=$Backup_Dir/logs #日志文件目录
Keep_Fullbackup=5 #保留的全备份数量,此处要加1; 如要保留2个,此处要写3
Mysql_Conf=/etc/my.cnf #mysql配置文件
Mysql_Opts='--socket=/opt/mysql/mysql.sock --host=localhost --user=root --password=9hb1a$OCinbl' #mysql的连接配置,按需修改
Error()
{
echo -e "\e[1;31m$1\e[0m" 1>&2
exit 1
}
Backup()
{
#两个参数为全量备份,第一个参数为备份目录,第二个参数为日志全路径
if [ $# = 2 ] ; then
$Innobackupex_Path --defaults-file=$Mysql_Conf $Mysql_Opts --no-timestamp $1/full_$Bak_Time>$2 2>&1
#三个参数为增量备份,第一个为增量备份目录,第二个为上个增量备份目录,第三个为日志全路径
elif [ $# = 3 ];then
$Innobackupex_Path --defaults-file=$Mysql_Conf $Mysql_Opts --no-timestamp --incremental $1/incr_$Bak_Time --incremental-basedir $2 >$3 2>&1
else
Error "Backup(): 参数不正确"
fi
}
#获得某个目录下,最近修改的目录
Lastest_Dir()
{
if [ -d $1 ]; then
path=`ls -t $1 |head -n 1`
if [ $path ]; then
echo $path
else
Error "Lastest_Diri(): 目录为空,没有最新目录"
fi
else
Error "Latest_Dir(): 目录不存在或者不是目录"
fi
}
#进行增量备份
Do_Inc()
{
if [ "$(ls -A $Incrbackup_Path)" ] ; then
#不是第一次增量备份,以最新的增量备份目录为base_dir
Backup $Incrbackup_Path $Incrbackup_Path/`Lastest_Dir $Incrbackup_Path` $Log_Path/incr_$Bak_Time.log
else
#第一次增量备份要先全量备份
Backup $Incrbackup_Path $Log_Path/incr_full_$Bak_Time.log
fi
}
#进行全量备份
Do_Full()
{
Backup $Fullbackup_Path $Log_Path/full_$Bak_Time.log
cd $Fullbackup_Path
ls -t |tail -n +$Keep_Fullbackup |xargs rm -rf
}
#环境和配置检查
Check()
{
#检查目录和创建目录
if [ ! -d $Fullbackup_Path ];then
mkdir -p $Fullbackup_Path
fi
if [ ! -d $Incrbackup_Path ];then
mkdir -p $Incrbackup_Path
fi
if [ ! -d $Log_Path ];then
mkdir -p $Log_Path
fi
#检测所需的软件
if [ ! -f $Innobackupex_Path ];then
Error "未安装xtradbbackup或xtradbbackup路径不正确"
fi
if [ ! -f $Mysql_Client ];then
Error "未安装mysql客户端"
fi
if [ ! -f $Mysql_Conf ];then
Error "mysql配置文件路径不正确"
fi
#检查mysql的运行状态
if [ `netstat -tlnp |grep mysqld |wc -l` = 0 ];then
Error "MySQL没有运行"
fi
#验证mysql的用户和密码是否正确
if ! `echo 'exit' | $Mysql_Client -s $Mysql_Opts >/dev/null 2>&1` ; then
Error "提供的数据库连接配置不正确!"
fi
}
case $1 in
full)
Check
Do_Full
;;
inc)
Check
Do_Inc
;;
*)
echo "full 全量备份"
echo "inc 增量备份"
;;
esac