如何备份MySQL数据?

Bash

1 基础知识

MySQL如果是非企业版本,一般情况下使用MySQL进行全备份,但是binlog却可以作为良好的增量备份数据。
本文基于此概念设计出一套可用的备份脚本用于在生产环境中备份以及分享(只做参考,风险自行承担)。

2 最佳实践

2.1 软件环境

本章基于CentOS 7.x x86_64 + mysql 8.x的软件环境测试并通过,如果你没有此环境,请参阅以下章节,

如何yum部署MySQL 8?


本章备份设计到binlog的备份,如有需要请参阅以下章节设置,

如何开启Mariadb或MySQL Binlog?

2.2 配置存储

2.2.1 存储方法介绍

– 此案例使用廉价的NFS和Samba作为后端的存储
– 存储统一使用autofs自动挂载(基于稳定性考量)
– 方案将准备日备份将MySQL binglog数据备份到目录“/backup/dailyBackup”
– 方案将准备周备份将MySQLDump(全备)数据备份到目录“/backup/weeklyBackup”

2.2.2 NFS自动挂载的配置

如果你尚未配置,请参阅以下链接配置,

如何配置nfs客户端挂载?

2.2.3 Samba自动挂载的配置

如果你尚未配置,请参阅以下链接配置,

如何配置samba客户端挂载?

2.3 创建备份的计划任务

2.3.1 创建备份脚本存放目录

mkdir ~/scripts/

2.3.2 创建备份脚本

vim ~/scripts/mysqlBackup.sh

加入如下内容,

#!/bin/bash

bakDIR='/data/mysql'
dailyBakDIR='/backup/dailyBackup'
weeklyBakDIR='/backup/weeklyBackup'
logFile='/var/log/mysqlbackup.log'
mysqlUser='root'
mysqlPwd='rootpassword'
mysqlHost='hd18.cmdschool.org'
dailyBakKeeptime='+7'
weeklyBakKeeptime='+30'

Today="`date +%a`"
dailyBackup="dailyBackup-"$mysqlHost"-`date +%Y%m%d`.tar.gz"
weeklyBackup="weeklyBackup-"$mysqlHost"-`date +%Y%m%d`.sql.gz"

#########begin###############
case $Today in
Mon|Tue|Wed|Thu|Fri|Sat)
     echo "`date +'%Y-%m-%d %H:%M:%s'` dailyBackup start" | tee -a $logFile
     for ((i=1;i<10;i++))
     do
         if [ $i -ge 5 ]; then
             echo "`date +'%Y-%m-%d %H:%M:%s'` dailyBackupStorage is unavailable!" | tee -a $logFile
             exit 1
         fi
         cd $dailyBakDIR
         if [ $? = 0 ]; then
              break
         fi
         sleep 2
     done

     #echo find $dailyBakDIR -mtime $dailyBakKeeptime -type f -name "dailyBackup-"$mysqlHost\*.gz -exec ls -l {} \;
     find $dailyBakDIR -mtime $dailyBakKeeptime -type f -name "dailyBackup-"$mysqlHost\*.gz -exec rm -f {} \;
     rsync -avP --include "binlog.*" --exclude="*" --delete $bakDIR"/" $dailyBakDIR"/binlog-"$mysqlHost"/"
     tar -zcf $dailyBakDIR"/"$dailyBackup $dailyBakDIR"/binlog-"$mysqlHost"/binlog."* 2> /dev/nul
     if [ $? = 0 ]; then
         echo "`date +'%Y-%m-%d %H:%M:%s'` dailyBackup finished" | tee -a $logFile
         exit 0
     fi
;;
Sun)
     echo "`date +'%Y-%m-%d %H:%M:%s'` weeklyBackup start" | tee -a $logFile
     for ((i=1;i<10;i++))
     do
         if [ $i -ge 5 ]; then
             echo "`date +'%Y-%m-%d %H:%M:%s'` dailyBackupStorage is unavailable!" | tee -a $logFile
             exit 1
         fi
         cd $weeklyBakDIR
         if [ $? = 0 ]; then
              break
         fi
         sleep 2
     done

     #find $weeklyBakDIR -mtime $weeklyBakKeeptime -type f -name "weeklyBackup-"$mysqlHost\*.gz -exec ls -l {} \;
     find $weeklyBakDIR -mtime $weeklyBakKeeptime -type f -name "weeklyBackup-"$mysqlHost\*.gz -exec rm -f {} \;
     mysqldump -u$mysqlUser -p$mysqlPwd -h$mysqlHost --single-transaction --all-databases | gzip &gt $weeklyBakDIR"/"$weeklyBackup
     if [ $? = 0 ]; then
         echo "`date +'%Y-%m-%d %H:%M:%s'` weeklyBackup finished" | tee -a $logFile
         exit 0
     fi
;;
esac
########end######################

注:
– 变量“bakDIR”定义备份的目录为MySQL的binlog数据目录“/data/mysql”
– 变量“dailyBakDIR”定义日备的目录为“/backup/dailyBackup”
– 变量“weeklyBakDIR”定义周备的目录为“/backup/weeklyBackup”
– 变量“logFile”定义备份的日志文件路径为“/var/log/mysqlbackup.log”
– 变量“dailyBakKeeptime”定义日备份的保留时间为“+7”,即7天以外的备份数据删除
– 变量“weeklyBakKeeptime”定义周备份的保留时间为“+30”,即30天以外的备份数据删除

2.3 创建备份计划任务

crontab -e

加入如下内容

#############################data backup###############################
0 2 * * * sh ~/scripts/mysqlBackup.sh
没有评论

发表回复

Bash
如何实现文件夹路径转纯数字符串?

1 前言 一个问题,一篇文章,一出故事。 由于由于需要设置某目录的配额,配额要求为每个目录指定一个项 …

Bash
如何统计Linux打开文件前10进程?

1 前言 一个问题,一篇文章,一出故事。 笔者生产环境有台服务最近压力比较大,打开的文件数量不断地往 …

Bash
如何获取VSFTP昨天活跃和有效用户?

1 前言 一个问题,一篇文章,一出故事。 笔者生产环境有台老旧的FTP服务器,用户众多。笔者希望每天 …