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脚本介绍的更多相关文章

  1. CentOS6.7下使用非root用户(普通用户)编译安装与配置mysql数据库并使用shell脚本定时任务方式实现mysql数据库服务随机自动启动

    CentOS6.7下使用非root用户(普通用户)编译安装与配置mysql数据库并使用shell脚本定时任务方式实现mysql数据库服务随机自动启动1.关于mysql?MySQL是一个关系型数据库管理 ...

  2. shell脚本介绍、shell脚本结构和执行、date命令用法、shell脚本中的变量

    7月11日任务 20.1 shell脚本介绍20.2 shell脚本结构和执行20.3 date命令用法20.4 shell脚本中的变量 20.1 shell脚本介绍 1.shell脚本语言是linu ...

  3. Linux centosVMware shell脚本介绍、shell脚本结构和执行、date命令用法、shell脚本中的变量

    一. shell脚本介绍 shell是一种脚本语言 aming_linux blog.lishiming.net 可以使用逻辑判断.循环等语法 可以自定义函数 shell是系统命令的集合 shell脚 ...

  4. 可以自动安装mysql数据库的一个shell脚本

    发布:thatboy   来源:脚本学堂     [大 中 小] 分享一例shell脚本,可以实现mysql数据库的自动安装,脚本写的不错,无论是用来学习,还是生产环境中应用,都是不错的,有需要的朋友 ...

  5. 一个备份MySQL数据库的简单Shell脚本(转)

    Shell脚本是我们写不同类型命令的一种脚本,这些命令在这一个文件中就可以执行.我们也可以逐一敲入命令手动执行.如果我们要使用shell脚本就必须在一开始把这些命令写到一个文本文件中,以后就可以随意反 ...

  6. [转]一个备份MySQL数据库的简单Shell脚本

    本文翻译自 iSystemAdmin 的 <A Simple Shell Script to Backup MySQL Database> Shell脚本是我们写不同类型命令的一种脚本,这 ...

  7. shell脚本介绍以及常用命令

    Shell脚本 Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的 ...

  8. mysql自动备份维护shell脚本 (copy)

    #!/bin/bash #Mysql 自动备份 压缩并上传到 指定ftp #设想每天凌晨3点备份mysql #编辑crontab配置文件 # * * * backupmysql.sh #压缩并以&qu ...

  9. linux中备份mysql数据库的一个shell脚本

    #!/bin/bash #FileName:select_into_bak.sh #Desc:Use select into outfile to backup db or tables #Creat ...

随机推荐

  1. 改写yii2的listview功能

    在vendor\yiisoft\yii2\widgets路径下新增文件ListViewtest,将下列代码粘贴并保存 <?php namespace yii\widgets; use Yii;u ...

  2. 前端项目构建之yeoman

    各位好啊,我又和大家见面了,也许你已经不记得大明湖畔的容嬷嬷,但是只要记得博客园中的我就好,希望我的博客能像一股清风,为你驱散炎热的酷暑,好了,废话不多说,开始上干货,我今天带给大家的是前端工程化开发 ...

  3. 相克军_Oracle体系_随堂笔记010-SCN

    1.SCN的意义?system change number     时间    先后.新旧 select dbms_flashback.get_system_change_number, SCN_TO ...

  4. mysql数据库去重复

    参考:http://www.cnblogs.com/duanjie/archive/2011/08/13/2136862.html 说到去重复,感觉逻辑很简单.但动手写起来却并不是那么容易.面试的时候 ...

  5. jQuery-1.9.1源码分析系列(五) 回调对象

    jQuery.Callbacks()提供的回调函数队列管理本来是延时回调处理的一部分,但是后面将其独立出来作为一个模块.jQuery就是这样,各个模块间的代码耦合度是处理的比较好的,值得学习.虽然是从 ...

  6. Mac OS X平台下QuickLook开发教程

    一.引言 Quick Look技术是Apple在Mac OS X 10.5中引入的一种用于快速查看文件内容的技术.用户只需要选中文件单击空格键即可快速查看文件内容,可以在不打开文件的情况下快速浏览内容 ...

  7. 从零开始,搭建博客系统MVC5+EF6搭建框架(2),测试添加数据、集成Autofac依赖注入

    一.测试仓储层.业务层是否能实现对数据库表的操作 1.创建IsysUserInfoRepository接口来继承IBaseRepository父接口 namespace Wchl.WMBlog.IRe ...

  8. 和JavaScript家的闭包玩玩捉迷藏

    JavaScript的闭包 首先声明,这是一篇面向小白的博客,不过也欢迎各位大牛批评指正,谢谢.   其实关于闭包各个论坛社区里都有很多的文章来讲它,毕竟闭包是JavaScript中一个特色,也正因为 ...

  9. jquery制作论坛或社交网站的每天打卡签到特效

    效果:http://hovertree.com/texiao/jquery/50/ 现在许多社区,购物等网站都设置签到功能,打开可以收获经验.虚拟币等,提高用户粘性,增加浏览量,是一个不错的功能.本文 ...

  10. EntityFrame Work 6 Code First 配置字段为varchar 类型

    EntityFrame Work 6 配置字符串属性是否支持Unicode 内容 默认情况下,字符串为Unicode(SQLServer 中的nvarchar).您可以使用IsUnicode 方法指定 ...