分享(4)一个使用 mysqlbackup 备份 MySQL 数据库的脚本

本文分享了一组用于MySQL数据库备份的脚本,包括mysqldump、xtrabackup、mysqlbackup和mysqlshell,支持在线备份和轮转策略。作者提供了脚本的功能概述和执行顺序,强调了脚本的可复用性和简单性,并给出了不同备份工具在相同数据量下的性能对比。建议用户根据自己的环境测试和调整脚本。
摘要由CSDN通过智能技术生成

编写目的

使用 mysqlbackup 对 MySQL 数据库进行在线备份,并指定轮转次数

说明

因为个人原因,有点强迫症, 喜欢编写能够复用且使用简单的脚本,提供简单的功能, 先是写的oracle备份脚本, 后来陆续写了其他数据库和操作系统的脚本

MySQL 备份先是用的 mysqldump 备份, 后来又写了xtrabackup, mysqlbackup, mysql shell的一共4个 shell 脚本和一个windows bat的脚本, 基本流程大同小异

能看懂脚本的花几分钟基本上也就明白了, 也都在测试环境和生产环境用过,但还是建议根据你的环境测试一下 也许有bug我没测出来,哈哈

为了节省大家时间,也能放心使用,把大概功能略述一下

一 使用时只需要提供备份目的地和轮转次数

备份目的地就不说了

轮转次数. 有点像logrotate,每次备份会在备份目的地生成一个序号命名的子文件夹, 到指定的轮转次数再从头开始

二 临时文件

记录上次备份状态的文件, 主要用于防止上一次备份未结束,定时任务又启动了下一次任务。

记录轮转序号的隐藏文件, 决定下次备份到哪儿,每次备份结束+1, 到最大了再从0开始

日志文件,记录了备份的开始时间,每个库的开始备份时间,结束时间

数据库列表文件,先查询数据库名称并记录于这个文件, 然后挨个备份。 不喜欢整个实例一起备份, 还是分数据库一个一个的好, 个人习惯。

三 执行顺序

先查询数据库, 再挨个备份数据库, 备份完成了,再删除或覆盖废弃的备份(删除写死的15天,可以自己改,覆盖则根据轮转次数)。

四 备份时间

后台备份的话可以看日志文件减一下, 前台执行的话脚本运行结束也会计算运行了多久(开始,结束时间减了一下)

五 速度比较

测试数据库 73G

mysqldump: 花了 34 分钟 备份输出10G

myshell dump 默认压缩 线程4(默认): 花了 30 分钟 备份输出 10G

myshell dump 默认压缩 线程8: 花了 5 分钟 输出 备份输出10G

myshell dump 默认压缩 线程12: 花了 5 分钟 输出 备份输出10G

xtrabackup 默认并行度1: 花了 34 分钟输出73G

合集地址

分享(1)一个 MySQL Shell 备份数据库的脚本

分享(2)一个 mysqldump 备份 MySQL 数据库的脚本

分享(3)一个 xtrabackup 备份MySQL数据库的脚本

分享(4)一个 mysqlbackup 备份MySQL数据库的脚本

分享(5) 一个windows平台 mysqldump 备份MySQL数据库的脚本

#!/bin/bash

# =========================================================================
# (C) Copyright 2003-2033 hoplite
# =========================================================================
# Script Purpose : backup mysql database by mysqlbackup
# -------------------------------------------------------------------------
# instructions
# 1.setup login-path
#   create a login-ptah: mysql_config_editor set --login-path=bak -h localhost -P 3306 -uroot -p
#   list login-path: mysql_config_editor print --all
#   login test: mysql --login-path=bak
# 2.setup cron job
#   example: full backup on Sunday,incremental backup on Mon/Wed/Fri,differential backup on Tues/Thur/Sat
#   0 1 * * 0     /u01/scripts/mysql_backup.sh bak /u01/backup/ebackup full
#   0 1 * * 1,3,5 /u01/scripts/mysql_backup.sh bak /u01/backup/ebackup incremental
#   0 1 * * 2,4,6 /u01/scripts/mysql_backup.sh bak /u01/backup/ebackup differential

# -------------------------------------------------------------------------
# Version Date      Description
# -------------------------------------------------------------------------
# V1.0              Initial version
# V1.1 2023-02-14   fix bug
# =========================================================================

[ -f ~/.bash_profile ] && . ~/.bash_profile
set -e -u -o pipefail

show_usage ()
{
  echo "usage: `basename $0` login-path target-basedir backuplevel"
  echo "eg.    `basename $0` bak /u01/backup/ebackup full|incremental|differential"
}

if [ $# -lt 3 ] || [ $# -gt 3 ]; then
   show_usage
   exit 0
else
  start_time=`date +%F" "%T`

  p_loginpath=$1
  p_targetbasedir=$2
  p_backuplevel=$3

  v_id=`date +%Y%m%d%H%M%S`
  v_hash=`echo -n ${p_loginpath}|md5sum|cut -f1 -d" "`
  [ -d ${p_targetbasedir} ] || mkdir -p ${p_targetbasedir}

  stusfile=${p_targetbasedir}/.status.${v_hash}
  log_file=${p_targetbasedir}/backup.log

  #check last backup result
  if [ -f ${stusfile} ]; then
    if [ `cat ${stusfile}` = "running" ]; then
      loginfo="`date +%F" "%T` ...ERROR:last backup fail, check it,then drop status file and rerun." ; echo ${loginfo} ; echo ${loginfo} >> ${log_file}
      exit 1
    fi
  else
    echo "running" > ${stusfile}
  fi 

  if [ "${p_backuplevel}" = "full" ]; then
    v_backuplevel="full"
  elif [ "${p_backuplevel}" = "incremental" ]; then
    v_backuplevel="incr"
  elif [ "${p_backuplevel}" = "differential" ]; then
    v_backuplevel="diff"  
  else
    show_usage
    exit 1
  fi
  v_targetdir=${p_targetbasedir}/${v_backuplevel}.${v_id}
  loginfo="`date +%F" "%T` ...start backup to ${v_targetdir}" ; echo ${loginfo} ; echo ${loginfo} >> ${log_file}

  if [ "${p_backuplevel}" = "full" ]; then
    mysqlbackup --login-path=${p_loginpath} --skip-binlog --compress --compress-level=1 --backup-dir=${v_targetdir} --backup-image=${v_targetdir}.mbi --force backup-to-image
  elif [ "${p_backuplevel}" = "incremental" ]; then
    mysqlbackup --login-path=${p_loginpath} --skip-binlog --compress --compress-level=1 --incremental=optimistic --incremental-base=history:last_backup --backup-dir=${v_targetdir} --backup-image=${v_targetdir}.mbi --force backup-to-image
  elif [ "${p_backuplevel}" = "differential" ]; then
    mysqlbackup --login-path=${p_loginpath} --skip-binlog --compress --compress-level=1 --incremental=optimistic --incremental-base=history:last_full_backup --backup-dir=${v_targetdir} --backup-image=${v_targetdir}.mbi --force backup-to-image
  fi
  echo "completed" > ${stusfile}
  loginfo="`date +%F" "%T` ...end backup to ${v_targetdir}" ; echo ${loginfo} ; echo ${loginfo} >> ${log_file}

  tmpfile=/tmp/.tmpfile.`basename $0`.${v_hash}.${v_id}
  find ${p_targetbasedir} -mtime +15 \( -name "full.20????????????" -o -name "incr.20????????????" -o -name "diff.20????????????" \) -type d > ${tmpfile}
  #eg. /u01/backup/ebackup/full.20230214180029
  while read foldername
  do
    rm -rf "${foldername:-unset}"
    echo "deleted backup folder : ${foldername}"
  done < ${tmpfile}
  find ${p_targetbasedir} -mtime +15 \( -name "full.20????????????.mbi" -o -name "incr.20????????????.mbi" -o -name "diff.20????????????.mbi" \) -type f > ${tmpfile}
  #eg. /u01/backup/ebackup/full.20230214180029.mbi
  while read filename
  do
    rm -f "${filename:-unset}"
    echo "deleted backup file : ${filename}"
  done < ${tmpfile}

  end_time=`date +%F" "%T`
  t_start_time=`date -d "${start_time}" +%s`
  t_end_time=`date -d "${end_time}" +%s`
  t_diff_secs=$((${t_end_time} - ${t_start_time}))
  t_hours=$((${t_diff_secs}/3600))
  t_mins=$(($((${t_diff_secs}-${t_hours}*3600))/60))
  t_secs=$((${t_diff_secs}%60))

  echo
  echo ==================================================
  echo "File Name:`basename $0`    Start Time:${start_time}    End Time:${end_time}    Total Cost:${t_hours}:${t_mins}:${t_secs}"
  echo ==================================================
  echo
fi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贺浦力特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值