基于Innobackupex的MySQL备份脚本

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:     Innobackupex是Xtrabackup的一部分,其实质也是调用xtrabackup。主要的不同是Xtrabackup除了支持innodb引擎外还支持xtradb引擎。

    Innobackupex是Xtrabackup的一部分,其实质也是调用xtrabackup。主要的不同是Xtrabackup除了支持innodb引擎外还支持xtradb引擎。本文主要封装了Innobackupex到shell脚本进行定期备份,供大家参考。

 

1、脚本描述
a、支持增量备份以及全备
b、需要传递到备份脚本(如备份路径,连接相关参数等)
c、基于周日,周三的全量备份,其他增量备份
d、可根据需要调整脚本,比如压缩备份的文件夹以及rsync等

 

2、脚本内容

################################################################################
# File     : innobk.sh                                                         # 
# Author   : Leshami                                                           #     
# Blog     : http://blog.csdn.net/leshami                                      #
# Date     : 20141113                                                          #
# Description :                                                                #
#    The script will call innobackupex to                                      #
#    take a full or increment backup for mysql db.                             #
#    Currently it will take follow principal to backup:                        #
#       Sun,Wend take full backup.                                             #  
#       Mon,Tue,Thur,Fri,Sat take incremental backup.                          #
#                                                                              #
# Usage Example:                                                               #
#     innobk.sh --help|-?                                                      #
#     innobk.sh --backup-dir=/dbbak --defaults-file=/inst3606/my3606.cnf \     #
#                   --host=127.0.0.1 --port=3606 --user=xxx --password=xxx     #
#		                                                                       #
################################################################################
# Change History:                                                              #
# --------------------------------------------------                           #     
# Init Development	Leshami		2014-11-13                                     #
################################################################################

#!/bin/bash
#set -x

# Get the key value of input arguments format like '--args=value'.
function get_key_value()
{
    echo "$1" | sed 's/^--[a-zA-Z_-]*=//' 
}

# Usage will be helpful when you need to input the valid arguments.
function usage()
{
cat <<EOF
Usage: $0 [configure-options]
  -?, --help                Show this help message.
  --backup-dir=<>           Set backup directory
  --defaults-file=[]        Set mysql configuration file directory
  --host=<>                 Set mysql host
  --port=<>                 Set mysql port
  --user=<>                 Set mysql user name
  --password=<>             Set mysql user password
EOF
}

# Parse the input arguments and get the value of the input argument.
if [ $# -eq 0 ];then
      usage
#      print_default
      exit 0;
fi

function parse_options()
{
  while test $# -gt 0
  do
    case "$1" in
    --backup-dir=*)
      backupDir=`get_key_value "$1"`;;
    --defaults-file=*)
      defaultFile=`get_key_value "$1"`;;
    --host=*)
      Host=`get_key_value "$1"`;;
    --port=*)
      mysqlPort=`get_key_value "$1"`;;
    --user=*)
      mysqlUser=`get_key_value "$1"`;;
    --password=*)
      mysqlPassword=`get_key_value "$1"`;;
    -? | --help )
      usage
#      print_default
      exit 0;;
    *)
      echo "Unknown option '$1'"
      exit 1;;
    esac
    shift
  done
}

# Call the parse_options function to parse the input arguments and initialisze env.
parse_options "$@"
physicalBackupDir=${backupDir}/physical
logDir=${backupDir}/log
checkPointDir=${backupDir}/checkpoint
cmdInno=/usr/bin/innobackupex
sock=/tmp/mysql.sock

day=`date +%w`
lastday=`date -d '1 days ago' +%Y%m%d`
dt=`date +%Y%m%d`
ts=`date +%Y%m%d%H%M%S`
logFile=${backupDir}/log/innobak_${ts}.log

if [ "${day}" -eq 0 ] || [ "${day}" -eq 3 ];then
   if [ ! -d "$physicalBackupDir/$dt" ];then
      echo "mkdir -p $physicalBackupDir/$dt"
      mkdir -p $physicalBackupDir/$dt    
   fi
fi

if [ -z "$defaultFile" ]; then
    defaultFile=/etc/my.cnf
fi

if [ ! -d "${logDir}" ]; then
    mkdir -p ${logDir}
fi

if [ ! -d "${checkPointDir}" ]; then
    mkdir -p ${checkPointDir}
fi  

echo "Start innobackup at `date`."               >>${logFile} 
echo "Current defaults file is : ${defaultFile}" >>${logFile}
echo "Current host is : ${Host}"                 >>${logFile}
echo "Current port is : ${mysqlPort}"            >>${logFile}   
echo "Current mysql user is : ${mysqlUser}"      >>${logFile}    
echo "Current password is : ${mysqlPassword}"    
echo "Current log directory is : ${logDir}"      >>${logFile}
echo "Current log file is : ${logFile}"          >>${logFile}

# Define backup function for full and incremental backup type.
function back_full()
{
echo "$cmdInno --user=$mysqlUser --password=$mysqlPassword  --no-timestamp \
      --defaults-file=$defaultFile $physicalBackupDir/$dt/base_${dt} \
      --socket=$sock 2> ${logDir}/bak_$ts.log" >>${logFile}

   $cmdInno --user=$mysqlUser --password=$mysqlPassword  --no-timestamp \
   --defaults-file=$defaultFile $physicalBackupDir/$dt/base_$dt --socket=$sock 2> ${logDir}/bak_${ts}.log
   grep to_lsn $physicalBackupDir/$dt/base_$dt/xtrabackup_checkpoints|cut -b 10- >$checkPointDir/ckp_${dt} 
}            #将grep last_lsn改成grep to_lsn @20150203  #更正cut后位数12到10 @20150212

function back_inc()
{
echo "   $cmdInno --user=$mysqlUser --password=$mysqlPassword --socket=$sock --no-timestamp \  
   --defaults-file=$defaultFile --incremental $basedir/inc_$dt \
   --incremental-lsn=`cat $checkPointDir/ckp_$lastday` 2>${logDir}/bak_${ts}.log " >>${logFile}

  $cmdInno --user=$mysqlUser --password=$mysqlPassword --port=${mysqlPort} --socket=$sock --no-timestamp \
 --defaults-file=$defaultFile --incremental $basedir/inc_$dt \
 --incremental-lsn=`cat $checkPointDir/ckp_$lastday` 2>${logDir}/bak_${ts}.log
  grep to_lsn $basedir/inc_$dt/xtrabackup_checkpoints|cut -b 10- >$checkPointDir/ckp_$dt 
}           #将grep last_lsn改成grep to_lsn @20150203  #更正cut后位数12到10 @20150212

case $day in
    0)
        # Sunday Full backup
        back_full
        ;;
    1)
        # Monday Relatively Sunday's incremental backup
        basedir=$physicalBackupDir/`date -d "1 days ago" +%Y%m%d` 
        back_inc
        ;;
    2)
        # Tuesday Compared with Monday's incremental backup
        basedir=$physicalBackupDir/`date -d "2 days ago" +%Y%m%d`
        back_inc
        ;;
    3)
        # Wednesday Full backup
        back_full
        ;;
    4)
        # Thursday  Relatively Wednesday's incremental backup
        basedir=$physicalBackupDir/`date -d "1 days ago" +%Y%m%d`
        back_inc
        ;;
    5)
        # Friday Compared with Thursday's incremental backup
        basedir=$physicalBackupDir/`date -d "2 days ago" +%Y%m%d`
        back_inc
        ;;
    6)
        # Saturday Compared with Friday's incremental backup
         basedir=$physicalBackupDir/`date -d "3 days ago" +%Y%m%d`
        back_inc
        ;;
esac

# Check backup log ,remove history logfile and bacupset.
retention=5

find ${physicalBackupDir} -type f -mtime +$retention -exec rm {} \;
find ${logDir} -type f -mtime +$retention -exec rm {} \;

# Send mail for backup result.
echo "" >>${logFile}
echo "Below is detail log for current innobackup.">>${logFile}
cat ${logDir}/bak_${ts}.log >>${logFile}
mailadd='jack@12306.cn,ww@12306.cn'

if [ -e "${logFile}" ]; then
   status=`grep -i "innobackupex: completed OK!" ${logFile}`
   if [ -n "${status}" ]; then
      cat ${logFile} |mutt -s "Successful backup for MySQL hotbackup on `hostname`." $mailadd
   else 
      cat ${logFile} |mutt -s "Failed backup for MySQl hotbackup on `hostname`." $mailadd
   fi
else
   echo "The hotbackup logfile was not found on `hostname`." | \   
   mutt -s "Failed backup for MySQl hotbackup on `hostname`." $mailadd
fi
   
exit

3、调用示例

SHELL> more call_innobk.sh 
#!/bin/bash
/db_scripts/innobk.sh --backup-dir=/data/backup --host=127.0.0.1 --port=3306 --user=innobk --password=xxx

SHELL> crontab -l
0 3 * * * /db_scripts/call_innobk.sh

SHELL> cd /data/backup
SHELL> ls
checkpoint  log  physical
SHELL> cd physical/
SHELL> ls
20141228  20141231  20150104  20150107  
SHELL> cd 20150107
SHELL> ls -hltr
total 16K
drwxr-xr-x 9 root root 4.0K Jan  7 03:05 base_20150107    #全备
drwxr-xr-x 9 root root 4.0K Jan  8 03:04 inc_20150108     #增备
drwxr-xr-x 9 root root 4.0K Jan  9 03:03 inc_20150109     #增备
drwxr-xr-x 9 root root 4.0K Jan 10 03:03 inc_20150110     #增备

鹏城DBA总群

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
12天前
|
关系型数据库 MySQL Shell
备份 MySQL 的 shell 脚本(mysqldump版本)
【4月更文挑战第28天】
23 0
|
2天前
|
关系型数据库 MySQL Shell
在Centos7中利用Shell脚本:实现MySQL的数据备份
在Centos7中利用Shell脚本:实现MySQL的数据备份
|
4天前
|
关系型数据库 MySQL 数据管理
MySQL通过 bin-log 恢复从备份点到灾难点之间数据
MySQL通过 bin-log 恢复从备份点到灾难点之间数据
|
4天前
|
存储 安全 关系型数据库
MySQL中使用percona-xtrabackup工具 三种备份及恢复 (超详细教程)
MySQL中使用percona-xtrabackup工具 三种备份及恢复 (超详细教程)
|
5天前
|
SQL 关系型数据库 MySQL
【简单无脑】自动化脚本一键安装虚拟机下的MySQL服务
该文章提供了在虚拟机上安装MySQL服务的简化方法,特别是针对新手。作者提供了一个自动化脚本`install_mysql.sh`,使得安装过程更简单。用户需要下载`install.rpm`资源,将其放在指定目录下,然后创建并编辑脚本文件,将提供的代码粘贴进去,通过`chmod u+x`授权,最后运行脚本`./install_mysql.sh [rpm文件路径]`来安装MySQL。文章还附有相关图片说明。
15 1
【简单无脑】自动化脚本一键安装虚拟机下的MySQL服务
|
5天前
|
SQL 缓存 关系型数据库
MySQL常见问题解决和自动化安装脚本
这篇内容包含了两个主要部分:解决MySQL登录问题和处理GPG密钥问题。当MySQL密码正确但无法登录时,可以通过执行SQL命令`ALTER USER`和`flush privileges`来修改和重置密码。对于MySQL安装时的GPG密钥错误,首先需要强制删除旧的MySQL仓库包,导入新的GPG公钥,然后安装MySQL服务器。如果遇到GPG检查错误,可以使用`--nogpgcheck`参数忽略检查来安装。最后,提供了一个自动化安装MySQL的脚本,用于检查旧版本、卸载残留、安装MySQL8并启动服务。
21 1
MySQL常见问题解决和自动化安装脚本
|
10天前
|
弹性计算 关系型数据库 MySQL
|
11天前
|
弹性计算 关系型数据库 MySQL
离线安装二进制Mysql脚本
【4月更文挑战第30天】
10 1
|
11天前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之在 DataWorks 中使用数据集成从 MySQL 导入数据到 GDB 执行同步任务脚本的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
21 0
|
11天前
|
弹性计算 关系型数据库 MySQL
备份MySQL(mysqldump 版本)
【4月更文挑战第29天】
18 0