Xtrabackup每周增量备份脚本程序(含附件)

HH MySQL926,03528字数 5980阅读19分56秒阅读模式

程序描述

本程序是一个对percona xtrabackup使用的脚本,它完成了MySQL每周的备份。

程序结构

此程序包含了4个目录(bin、conf、log、var):文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

  • bin:存放运行备份的主脚本程序(*.sh)。
  • conf:存放着程序运行的配置文件变量(*.conf)。
  • log:存放的是备份时xtrabackup的输出内容(*.log)。
  • var:存放了索引文件(*.index)和错误记录文件(*.err)。
  1. *.index:每当备份成功后都会记录一条信息到此文件中,此文件也是增量备份的一个基础文件,程序会用过此文件判断是增量备份还是全量备份。
  2. *.err:每当备份出错了会记录一条数据到此文件。如果需要对备份成功与否进行监控,可以通过此文件的变化来判断是否备份成(文件无变化就是备份成功了)。

程序流程图

程序流程图

先决条件

确保你的xtrabackup 程序在机器上已经可以正确使用。文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

注意事项

为了安全请使用root以外的用户来使用本程序,本人专门使用了一个mysql用户来执行mysql相关的操作。文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

使用方式

  • 执行
#你的程序路径
/bin/bash /tmp/xtrabackup_cron/bin/mysql_increment_hot_backup.sh
  • 备份成功索引文件内容
# 备份成功 索引文件内容
{week_day:3,          dir:full_2015-12-30_21-45-53_3,          type:full,          date:2015-12-30}
{week_day:3,          dir:incr_2015-12-30_22-09-23_3,          type:incr,          date:2015-12-30}
  • 备份失败错误文件内容
# 备份失败 索引文件内容
{week_day:3,          dir:full_2015-12-30_21-45-53_3,          type:full,          date:2015-12-30}
{week_day:3,          dir:incr_2015-12-30_22-09-23_3,          type:incr,          date:2015-12-30}

(提示:其实索引文件的内容格式和错误文件的一样)文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

程序展示

以下主要展示了程序文件中的内容。附件将会在文章尾部附上文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

  • 配置文件 mysql_increment_hot_backup.conf
# mysql 用户名
user=root
 
# mysql 密码
password=root
 
# 备份路劲
backup_dir=/tmp/backup
 
# percona-xtrabackup 备份软件路径
xtrabackup_dir=/usr/local/percona-xtrabackup
 
# 全备是在一周的第几天
full_backup_week_day=2
 
# 全量备信息名称 前缀
full_backup_prefix=full
 
# 增量备信息名称 前缀
increment_prefix=incr
 
# mysql配置文件
mysql_conf_file=/etc/my.cnf
 
# 错误日志文件(更具此文件知道备份是否成功)
# format:
# {week_day:1,dir:full/incr_2015-12-29_00-00-00_7,type:full/incr,date:2015-12-30}
error_log=mysql_increment_hot_backup.err
 
# 索引文件
# format:
# {week_day:1,dir:full/incr_2015-12-29_00-00-00_7,type:full/incr,date:2015-12-30}
index_file=mysql_increment_hot_backup.index
  • 主程序说明

程序说明这里分4个模块来看(主逻辑、变量初始化、检测文件正确性、使用的其他方法)文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

  1. 主逻辑
function run() {
  # 检测配置文件值
  test_conf_file
 
  # 判断是执行全备还是曾量备份
  get_backup_type
  backup_type=$?
  case $backup_type in
    0 )
      # 全量备份
      full_backup 
      backup_ok=$?
      if [ 0 -eq "$backup_ok" ]; then
      # 全备成功
        # # 打包最新备份
        # tar_backup_file $full_backup_prefix
        # # 将tar备份发送到远程
        # send_backup_to_remote $full_backup_prefix
        # 备份索引文件
        backup_index_file
        # # 发送索引文件到远程
        # send_index_file_to_remote
        # 清除之前的备份
        delete_before_backup
        # 清除索引文件
        purge_index_from_file
        # 添加索引, 索引记录了当前最新的备份
        append_index_to_file $full_backup_prefix
      else
      # 全备失败
        # 删除备份目录
        rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
        # 记录错误日志
        logging_backup_err $full_backup_prefix
      fi
      ;;
    1 )
      # 增量备份
      increment_backup
      backup_ok=$?
      if [ 0 -eq "$backup_ok" ]; then
      # 增量备份成功
        # # 打包最新备份
        # tar_backup_file $increment_prefix
        # # 将tar备份发送到远程
        # send_backup_to_remote $increment_prefix
        # 添加索引, 索引记录了当前最新的备份
        append_index_to_file $increment_prefix
      else
      # 增量备份失败
        # 删除备份目录
        rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
        # 记录错误日志
        logging_backup_err $increment_prefix
      fi
      ;;
  esac
}
 
run

2. 变量初始化文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

# 获得程序路径名
program_dir=`dirname $0`/..
# 读取配置文件中的所有变量值, 设置为全局变量
# 配置文件
conf_file="$program_dir/conf/mysql_increment_hot_backup.conf"
# mysql 用户
user=`sed '/^user=/!d;s/.*=//' $conf_file`
# mysql 密码
password=`sed '/^password=/!d;s/.*=//' $conf_file`
# mysql 备份目录
backup_dir=`sed '/^backup_dir=/!d;s/.*=//' $conf_file`
# percona-xtrabackup 备份软件路径
xtrabackup_dir=`sed '/^xtrabackup_dir=/!d;s/.*=//' $conf_file`
# 全备是在一周的第几天
full_backup_week_day=`sed '/^full_backup_week_day=/!d;s/.*=//' $conf_file`
# mysql 全备前缀标识
full_backup_prefix=`sed '/^full_backup_prefix=/!d;s/.*=//' $conf_file`
# mysql 增量备前缀标识
increment_prefix=`sed '/^increment_prefix=/!d;s/.*=//' $conf_file`
# mysql 配置文件
mysql_conf_file=`sed '/^mysql_conf_file=/!d;s/.*=//' $conf_file`
# 备份错误日志文件
error_log=$program_dir/var/`sed '/^error_log=/!d;s/.*=//' $conf_file`
# 备份索引文件
index_file=$program_dir/var/`sed '/^index_file=/!d;s/.*=//' $conf_file`
 
# 备份日期
backup_date=`date +%F`
# 备份日期
backup_time=`date +%H-%M-%S`
# 备份日期
backup_week_day=`date +%u`
 
# 创建相关目录
log_dir=$program_dir/log
var_dir=$program_dir/var
mkdir -p $backup_dir
mkdir -p $log_dir
mkdir -p $var_dir

3. 检测配置文件正确性文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

4. 使用的其他方法文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

# 全量备份
function full_backup() {
  backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
 
  mkdir -p $backup_dir/$backup_folder
  $xtrabackup_dir/bin/innobackupex \
    --defaults-file=$mysql_conf_file \
    --user=$user \
    --password=$password \
    --no-timestamp \
    $backup_dir/$backup_folder > $log_dir/${backup_folder}.log 2>&1
  return $?
}
 
# 增量备份
function increment_backup() {
  backup_folder=${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}
  incr_base_folder=`sed -n '$p' $index_file | \
                   awk -F '[, {}]*' '{print $3}' | \
                   awk -F ':' '{print $2}'`
 
  mkdir -p $backup_dir/$backup_folder
  $xtrabackup_dir/bin/innobackupex \
    --defaults-file=$mysql_conf_file \
    --user=$user \
    --password=$password \
    --no-timestamp \
    --incremental \
    $backup_dir/$backup_folder \
    --incremental-basedir=$backup_dir/$incr_base_folder > $log_dir/${backup_folder}.log 2>&1
  return $?
}
 
# 删除之前的备份(一般在全备完成后使用)
function delete_before_backup() {
  cat $index_file | awk -F '[, {}]*' '{print $3}' | \
    awk -v backup_dir=$backup_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s\n", backup_dir, $2)}}' | \
    /bin/bash
   
  cat $index_file | awk -F '[, {}]*' '{print $3}' | \
    awk -v log_dir=$log_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s.log\n", log_dir, $2)}}' | \
    /bin/bash
}
 
# 备份索引文件
function backup_index_file() {
  cp $index_file ${index_file}_$(date -d "1 day ago" +%F)
}
 
# 备份索引文件
function send_index_file_to_remote() {
  echo 'send index file ok'
}
 
# 添加索引, 索引记录了当前最新的备份
function append_index_to_file() {
  echo "{week_day:$backup_week_day, \
         dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \
         type:${1}, \
         date:${backup_date}}" >> $index_file
}
 
# 记录 错误消息到文件
function logging_backup_err() {
  echo "{week_day:$backup_week_day, \
         dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \
         type:${1}, \
         date:${backup_date}}" >> $error_log
}
 
# 清空索引
function purge_index_from_file() {
  > $index_file
}
 
# 清空错误日志信息
function purge_err_log() {
  > $error_log
}
 
# 打包备份
function tar_backup_file() {
  echo "tar $1 ok"
}
 
# 发送备份到远程
function send_backup_to_remote() {
  echo "send $1 remote ok"
}
  
# 判断是应该全备还是增量备份
# 0:full, 1:incr
function get_backup_type() {
  full_backup_week_day=`sed '/^full_backup_week_day=/!d;s/.*=//' $conf_file`
  backup_type=0
  if [ "$full_backup_week_day" -eq `date +%u` ]; then
    backup_type=0
  else
    backup_type=1
  fi
  if [ ! -n "`cat $index_file`" ]; then
    backup_type=0
  fi
  return $backup_type
}

(提示:其实在程序中的有关将备份成功的文件打包步骤和远程传输步骤还没有实现,有兴趣的可以自行处理。当然,熟练使用xtrabackup的可以直接使用xtrabackup中的--stream 和 --remote-host 参数来进行远程备份。这样貌似自己实现将备份传输到远端有点多余。 :) )文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

作者联系方式

谢谢作者的投稿,如有任何疑问可以直接联系作者,以下为联系方式:文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

昵称:HH文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

QQ:275258836文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

附件

xtrabackup_cron文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

 文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

感觉本文内容不错,读后有收获?文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

逛逛衣服店,鼓励作者写出更好文章。文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/ 文章源自运维生存时间-https://www.ttlsa.com/mysql/xtrabackup-daily-backup/

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
HH
  • 本文由 发表于 01/01/2016 14:23:31
  • 转载请务必保留本文链接:https://www.ttlsa.com/mysql/xtrabackup-daily-backup/
评论  9  访客  9
    • chengrowe
      chengrowe 0

      谢谢,这个很详细,不错

      • 匿名
        匿名 9

        非常好,感谢, 希望再出个恢复脚本

        • 匿名
          匿名 9

          没有还原脚本?

          • 运维小伙伴
            运维小伙伴 0

            使用楼主提供的脚本,发现一个问题:mkdir -p $backup_dir/$backup_folder和–no-timestamp 似乎是冲突的,直接运行脚本,会报错:“innobackupex: Error: Failed to create backup directory /XXXXX/incr_2016-05-07_18-12-45_6: 文件已存在 at /usr/bin/innobackupex line 4027”,注释掉其中的一个即可正常。我使用的Xtrabackup版本是percona-xtrabackup-2.2.9-5067.el6.x86_64。

            经实际测试, percona-xtrabackup-2.3.4-1.el6.x86_64版本下上述程序功能正常。请小伙伴们注意自己的软件版本哦,谢谢

            • Giving丶
              Giving丶 1

              不错,谢谢!

              • chen_hao
                chen_hao

                由于有些用户说需要在备份的时候加上压缩命令方便恢复使用,这边我就添加上了
                在tar_backup_file方法中添加上如下代码
                cd $backup_dir
                tar -jcf ${1}_${backup_date}_${backup_time}_${backup_week_day}.tar.bz2
                ${1}_${backup_date}_${backup_time}_${backup_week_day}
                cd – > /dev/null
                新的程序我放在网盘上 https://yunpan.cn/crF25kgIJWuXS 访问密码 724f

                • 到此一游
                  到此一游 9

                  辛苦了

                  • Koma
                    Koma 9

                    这个很好

                    • 游客
                      游客 9

                      很好!

                    评论已关闭!