MySQL 使用XtraBackup的shell脚本介绍
mysql_backup.sh是关于MySQL的一个使用XtraBackup做备份的shell脚本,实现了简单的完整备份和增量备份、以及邮件发送备份信息等功能。功能目前还比较简单,后续将继续完善和增加相关功能。参考了网上MySQL备份的脚本,如有不足的地方,欢迎大家拍砖!
1: 使用前,请先做一些配置选项修改,例如备份路径设置、连接数据库的账号密码等等。
2: 在BACKUP_DIR目录下,创建full、incr、logs、scripts四个目录,将mysql_backup.sh放置在scripts目录下。
#!/bin/bash
###################################################################################
# This script is used for MySQL daily backup. it is a package of Xtrabackup shell # script #
# #
# #################################################################################
# #
# ScriptName : mysql_backup.sh #
# Author : 潇湘隐者 #
# CerateDate : 2016-04-24 #
# Blogs : www.cnblogs.com/kerrycode #
# @author : kerry2008code@qq.com #
#*********************************************************************************#
# Version Modified Date Description #
#*********************************************************************************#
# V.1.0 2016-04-24 create the script for mysql daily backup #
###################################################################################
BACKUP_DATE=$(date +%Y-%m-%d_%H_%M_%S)
BACKUP_DIR=/backup/mysql
FULLBACKUP_PATH=$BACKUP_DIR/full
INCRBACKUP_PATH=$BACKUP_DIR/incr
BACKUP_LOG_PATH=$BACKUP_DIR/logs
BACKUP_KEEP_DAY=7
MYSQL_CONF=/usr/my.cnf
INNOBACKUPEX=/usr/bin/innobackupex
MYSQL_CMD=/usr/bin/mysql
MYSQL_CONNECT="--host=127.0.0.1 --user=root --password=123456 --port=3306"
MAIL_FROM="root@`hostname`"
MAIL_TO=konglb@xxx.com
error()
{
echo "$1" 1>&2
exit 1
}
#before the backup, check the system enviroment setting and mysql status and so on
mysql_backup_check()
{
if [ ! -d $FULLBACKUP_PATH ];then
mkdir -p $FULLBACKUP_PATH
fi
if [ ! -d $INCRBACKUP_PATH ];then
mkdir -p $INCRBACKUP_PATH
fi
if [ ! -d $BACKUP_LOG_PATH ];then
mkdir -p $BACKUP_LOG_PATH
fi
if [ ! -x $INNOBACKUPEX ];then
error "$INNOBACKUPEX did not exists"
fi
if [ ! -x $MYSQL_CMD ];then
error "mysql client did not exists!"
fi
mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'`
if [ "$mysql_status" != "Yes" ];then
error "MySQL did not start. please check it"
fi
if ! `echo 'exit' | $MYSQL_CMD -s $MYSQL_CONNECT` ; then
error "please check the user and password is correct!"
fi
}
xtra_backup()
{
if [ $# = 2 ];then
$INNOBACKUPEX --defaults-file=$MYSQL_CONF $MYSQL_CONNECT --no-timestamp $1/full_$BACKUP_DATE>$2 2>&1
elif [ $# = 3 ];then
$INNOBACKUPEX --defaults-file=$MYSQL_CONF $MYSQL_CONNECT --no-timestamp --incremental $1/incr_$BACKUP_DATE --incremental-basedir $2 >$3 2>&1
else
error "the parameter is not correct"
fi
}
lastest_fullback_dir()
{
if [ -d $1 ]; then
path=`ls -t $1 |head -n 1`
if [ $path ]; then
echo $path
else
error "lastest_fullback_dir(): 目录为空,没有最新目录"
fi
else
error "lastest_fullback_dir(): 目录不存在或者不是目录"
fi
}
mysql_full_backup()
{
xtra_backup $FULLBACKUP_PATH $BACKUP_LOG_PATH/full_$BACKUP_DATE.log
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
(echo "Subject: MySQL Backup Failed: MySQL Backup failed on `hostname`";
cat ${BACKUP_LOG_PATH}/full_${BACKUP_DATE}.log;
) | /usr/sbin/sendmail -O NoRecipientAction=add-to -f${MAIL_FROM} ${MAIL_TO}
else
(echo "Subject: MySQL Backup Success: MySQL Backup failed on `hostname`";
cat ${BACKUP_LOG_PATH}/full_${BACKUP_DATE}.log;
) | /usr/sbin/sendmail -O NoRecipientAction=add-to -f${MAIL_FROM} ${MAIL_TO}
fi
cd $FULLBACKUP_PATH
ls -t | tail -n +$BACKUP_KEEP_DAY | xargs rm -rf
}
mysql_incr_backup()
{
LATEST_FULL_BACKUP=`find $FULLBACKUP_PATH -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
LATEST_FULL_BACKUP_TIME=`stat -c %Y $FULLBACKUP_PATH/$LATEST_FULL_BACKUP`
if [ $LATEST_FULL_BACKUP ];then
#
xtra_backup $INCRBACKUP_PATH $FULLBACKUP_PATH/`lastest_fullback_dir $FULLBACKUP_PATH` $BACKUP_LOG_PATH/incr_$BACKUP_DATE.log
else
# the first incremental backup need do full backup first
xtra_backup $FULLBACKUP_PATH $BACKUP_LOG_PATH/full_$BACKUP_DATE.log
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
(echo "Subject: MySQL Backup Failed: MySQL Backup failed on `hostname`";
cat ${BACKUP_LOG_PATH}/incr_${BACKUP_DATE}.log;
) | /usr/sbin/sendmail -O NoRecipientAction=add-to -f${MAIL_FROM} ${MAIL_TO}
fi
fi
}
case $1 in
full)
mysql_backup_check
mysql_full_backup
;;
incr)
mysql_backup_check
mysql_incr_backup
;;
*)
echo "full backup parameter missed!"
echo "incr backup parameter missed!"
;;
esac
然后根据备份策略设置crontab作业,例如如下所示

-----------------------------------------------------------------分割线------------------------------------------------------------------------------
在使用这个脚本中,发现了一个小bug,没有定期清理增量备份的历史备份,修正后的脚本如下所示.
#!/bin/bash
#################################################################################
# #
# This script is used for MySQL daily backup. it is a package of Xtrabackup shell script #
# #
# ################################################################################
# #
# ScriptName : mysql_backup.sh #
# Author : Kerry #
# CerateDate : 2016-04-24 #
# Blogs : www.cnblogs.com/kerrycode #
# @author : kerry2008code@qq.com #
#********************************************************************************#
# Version Modified Date Description #
#********************************************************************************#
# V.1.0 2016-04-24 create the script for mysql daily backp #
# V.1.1 2016-07-26 fix the bug increase backup did not rm the old backupset#
##################################################################################
BACKUP_DATE=$(date +%Y-%m-%d_%H_%M_%S)
BACKUP_DIR=/backup/mysql/mysql_db_backup
FULLBACKUP_PATH=$BACKUP_DIR/full
INCRBACKUP_PATH=$BACKUP_DIR/incr
BACKUP_LOG_PATH=$BACKUP_DIR/logs
BACKUP_KEEP_DAY=30
MYSQL_CONF=/usr/my.cnf
INNOBACKUPEX=/usr/bin/innobackupex
MYSQL_CMD=/usr/bin/mysql
MYSQL_CONNECT="--host=127.0.0.1 --user=root --password=xxx--port=3306"
MAIL_FROM="root@`hostname`"
MAIL_TO="xxx@xxxx.com"
MAIL_TO_ERROR="xxxx@xxxx.com"
error()
{
echo "$1" 1>&2
exit 1
}
#before the backup, check the system enviroment setting and mysql status and so on
mysql_backup_check()
{
if [ ! -d $FULLBACKUP_PATH ];then
mkdir -p $FULLBACKUP_PATH
fi
if [ ! -d $INCRBACKUP_PATH ];then
mkdir -p $INCRBACKUP_PATH
fi
if [ ! -d $BACKUP_LOG_PATH ];then
mkdir -p $BACKUP_LOG_PATH
fi
if [ ! -x $INNOBACKUPEX ];then
error "$INNOBACKUPEX did not exists"
fi
if [ ! -x $MYSQL_CMD ];then
error "mysql client did not exists!"
fi
mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'`
if [ "$mysql_status" != "Yes" ];then
error "MySQL did not start. please check it"
fi
if ! `echo 'exit' | $MYSQL_CMD -s $MYSQL_CONNECT` ; then
error "please check the user and password is correct!"
fi
}
xtra_backup()
{
if [ $# = 2 ];then
$INNOBACKUPEX --defaults-file=$MYSQL_CONF $MYSQL_CONNECT --no-timestamp $1/full_$BACKUP_DATE>$2 2>&1
elif [ $# = 3 ];then
$INNOBACKUPEX --defaults-file=$MYSQL_CONF $MYSQL_CONNECT --no-timestamp --incremental $1/incr_$BACKUP_DATE --incremental-basedir $2 >$3 2>&1
else
error "the parameter is not correct"
fi
}
lastest_fullback_dir()
{
if [ -d $1 ]; then
path=`ls -t $1 |head -n 1`
if [ $path ]; then
echo $path
else
error "lastest_fullback_dir(): 目录为空,没有最新目录"
fi
else
error "lastest_fullback_dir(): 目录不存在或者不是目录"
fi
}
mysql_full_backup()
{
xtra_backup $FULLBACKUP_PATH $BACKUP_LOG_PATH/full_$BACKUP_DATE.log
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
(echo "Subject: MySQL Backup Failed: MySQL Backup failed on `hostname`";
cat ${BACKUP_LOG_PATH}/full_${BACKUP_DATE}.log;
) | /usr/sbin/sendmail -O NoRecipientAction=add-to -f${MAIL_FROM} ${MAIL_TO}
else
(echo "Subject: MySQL Backup Success: MySQL Backup Succeed on `hostname`";
cat ${BACKUP_LOG_PATH}/full_${BACKUP_DATE}.log;
) | /usr/sbin/sendmail -O NoRecipientAction=add-to -f${MAIL_FROM} ${MAIL_TO}
fi
#cd $FULLBACKUP_PATH
#ls -t | tail -n +$BACKUP_KEEP_DAY | xargs rm -rf
find ${FULLBACKUP_PATH} -mtime +$BACKUP_KEEY_DAY -name "*" -exec rm -rf {} \;
}
mysql_incr_backup()
{
LATEST_FULL_BACKUP=`find $FULLBACKUP_PATH -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
LATEST_FULL_BACKUP_TIME=`stat -c %Y $FULLBACKUP_PATH/$LATEST_FULL_BACKUP`
if [ $LATEST_FULL_BACKUP ];then
#不是第一次增量备份,以最新的增量备份目录为base_dir
xtra_backup $INCRBACKUP_PATH $FULLBACKUP_PATH/`lastest_fullback_dir $FULLBACKUP_PATH` $BACKUP_LOG_PATH/incr_$BACKUP_DATE.log
else
# the first incremental backup need do full backup first
xtra_backup $FULLBACKUP_PATH $BACKUP_LOG_PATH/full_$BACKUP_DATE.log
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
(echo "Subject: MySQL Backup Failed: MySQL Backup failed on `hostname`";
cat ${BACKUP_LOG_PATH}/incr_${BACKUP_DATE}.log;
) | /usr/sbin/sendmail -O NoRecipientAction=add-to -f${MAIL_FROM} ${MAIL_TO}
fi
fi
#cd ${INCRBACKUP_PATH}
#ls -t | tail -n +$BACKUP_KEEP_DAY | xargs rm -rf
find ${INCRBACKUP_PATH} -mtime +$BACKUP_KEEY_DAY -name "*" -exec rm -rf {} \;
}
case $1 in
full)
mysql_backup_check
mysql_full_backup
;;
incr)
mysql_backup_check
mysql_incr_backup
;;
*)
echo "full backup"
echo "incr backup"
;;
esac
MySQL 使用XtraBackup的shell脚本介绍的更多相关文章
- CentOS6.7下使用非root用户(普通用户)编译安装与配置mysql数据库并使用shell脚本定时任务方式实现mysql数据库服务随机自动启动
CentOS6.7下使用非root用户(普通用户)编译安装与配置mysql数据库并使用shell脚本定时任务方式实现mysql数据库服务随机自动启动1.关于mysql?MySQL是一个关系型数据库管理 ...
- shell脚本介绍、shell脚本结构和执行、date命令用法、shell脚本中的变量
7月11日任务 20.1 shell脚本介绍20.2 shell脚本结构和执行20.3 date命令用法20.4 shell脚本中的变量 20.1 shell脚本介绍 1.shell脚本语言是linu ...
- Linux centosVMware shell脚本介绍、shell脚本结构和执行、date命令用法、shell脚本中的变量
一. shell脚本介绍 shell是一种脚本语言 aming_linux blog.lishiming.net 可以使用逻辑判断.循环等语法 可以自定义函数 shell是系统命令的集合 shell脚 ...
- 可以自动安装mysql数据库的一个shell脚本
发布:thatboy 来源:脚本学堂 [大 中 小] 分享一例shell脚本,可以实现mysql数据库的自动安装,脚本写的不错,无论是用来学习,还是生产环境中应用,都是不错的,有需要的朋友 ...
- 一个备份MySQL数据库的简单Shell脚本(转)
Shell脚本是我们写不同类型命令的一种脚本,这些命令在这一个文件中就可以执行.我们也可以逐一敲入命令手动执行.如果我们要使用shell脚本就必须在一开始把这些命令写到一个文本文件中,以后就可以随意反 ...
- [转]一个备份MySQL数据库的简单Shell脚本
本文翻译自 iSystemAdmin 的 <A Simple Shell Script to Backup MySQL Database> Shell脚本是我们写不同类型命令的一种脚本,这 ...
- shell脚本介绍以及常用命令
Shell脚本 Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的 ...
- mysql自动备份维护shell脚本 (copy)
#!/bin/bash #Mysql 自动备份 压缩并上传到 指定ftp #设想每天凌晨3点备份mysql #编辑crontab配置文件 # * * * backupmysql.sh #压缩并以&qu ...
- linux中备份mysql数据库的一个shell脚本
#!/bin/bash #FileName:select_into_bak.sh #Desc:Use select into outfile to backup db or tables #Creat ...
随机推荐
- mysql表名查询sql
select table_schema,table_name,engine from information_schema.tables where table_schema not in('info ...
- Hammer.js分析(四)——recognizer.js
不同识别器会使用不同逻辑,根据从相关Input类获取到的事件对象和事件,实现自定义的触屏事件,例如tap.pinch等. 一.继承关系 Recognizer与前面的Input一样,也相当于是个抽象类. ...
- lamp 环境搭建
LAMP指的Linux(操作系统).ApacheHTTP 服务器,MySQL(数据库软件)和PHP语言 使用wampserver软件,搭建环境.如下图: 双击程序包,安装最后一步随便选择一个浏览器打开 ...
- 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)
一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...
- jQuery-1.9.1源码分析系列(十六)ajax——ajax框架
ajax的介绍就不多说了,点击可看. 既然是ajax框架,那么闲谈一谈jQuery的ajax处理思路. 现在的浏览器都支持ajax,只不过不同的浏览器使用方法可能有不同(IE使用new window. ...
- 基于python的七种经典排序算法
参考书目:<大话数据结构> 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. ...
- scikit-learn一般实例之一:保序回归(Isotonic Regression)
对生成的数据进行保序回归的一个实例.保序回归能在训练数据上发现一个非递减逼近函数的同时最小化均方误差.这样的模型的好处是,它不用假设任何形式的目标函数,(如线性).为了比较,这里用一个线性回归作为参照 ...
- LINQ to SQL语句(16)之对象标识
对象标识 运行库中的对象具有唯一标识.引用同一对象的两个变量实际上是引用此对象的同一实例.你更改一个变量后,可以通过另一个变量看到这些更改. 关系数据库表中的行不具有唯一标识.由于每一行都具有唯一的主 ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)
Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...
- 背水一战 Windows 10 (14) - 动画: 线性动画, 关键帧动画
[源码下载] 背水一战 Windows 10 (14) - 动画: 线性动画, 关键帧动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 线性动画 - ColorAnimatio ...