在Docker环境中备份MySQL并发送邮件

整体思路

  • 备份数据库
  • 发送备份文件至邮件
  • 清理30天前的备份

前置处理(邮件服务准备)

mailx 在CentOS中一般是安装好的, ~/.certs 针对SSL协议的邮件服务需要下载对应的邮件服务的证书

  1. 检测并安装邮件服务

     # 检测是否安装了邮件服务
     mail
     # 或
     mailx
    
     # 安装mail
     yum install -y mailx
     yum install -y nss-tools
  2. 下载邮件证书

     mkdir -p ~/.certs
     echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
     certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
     certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
     certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs/./ -i qq.crt
     certutil -L -d ~/.certs
  3. 编辑配置文件

    1. 编辑邮件配置文件

       vim /etc/mail.rc
    2. 追加以下内容,根据实际情况变动

       set from=example@qq.com
       set smtp=smtps://smtp.qq.com:465                                              
       set smtp-auth-user=example@qq.com
       set smtp-auth-password=**************
       set smtp-auth=login
       set ssl-verify=ignore
       set nss-config-dir=/root/.certs
      示例 含义
      set from=example@qq.com 发送邮箱
      set smtp=smtps://smtp.qq.com:465 发件服务器
      set smtp-auth-user=example@qq.com 发件用户名
      set smtp-auth-password=** 邮箱密码或授权码
      set smtp-auth=login 连接方式,用login即可
      set ssl-verify=ignore 启用ssl
      set nss-config-dir=/root/.certs 证书位置
  1. 测试发送邮件

     echo "邮件正文" | mail -s "邮件主题" example@qq.com

在Docker中备份MySQL

  1. 备份脚本

    1. 创建脚本

      copy以下内容,创建备份脚本backup.sh

       #!/bin/bash
       # 变量
       env_name="xxxx环境"
       docker_name="dockerId_forMySQL"
       base_data_dir="/home/backup/mysql/"
      
       date_str="`date +%Y%m%d`"
       base_name="data_`date +%Y%m%d`"
       data_dir="$base_data_dir/$base_name"
       file_path="$data_dir/data_`date +%Y%m%d`.sql"
      
       if [ ! -d $data_dir ]; then
           mkdir $data_dir
       fi
      
       # 备份操作
       docker exec -it ${docker_name} mysqldump -uroot -proot --all-databases > $file_path
       if [ $? -ne 0 ];then
           # 任务失败,发送邮件
           echo -e $env_name$date_str"备份失败" | mailx -s $env_name$date_str'备份失败' example@qq.com
           exit -1
       fi
      
       echo "备份完成"
      
       cd $data_dir
       zip $base_name.zip -r $data_dir
       zip -s 45m $base_name.zip --out s_$base_name.zip
       echo "分卷完成"
       find $base_data_dir -name 's_data_[1-9]*'
      
       # 获取分卷的压缩包集合
       for file in $data_dir/s_*
       do
           echo $file
           # 任务成功,发送邮件
           echo -e $env_name$date_str"备份成功\n"$file | mailx -s $env_name$date_str'备份成功' -a $file example@qq.com
           echo "发件完成"
       done
      
       # 清理30天前的备份
       find $base_data_dir -mtime +30 -name 'data_[1-9]' -exec rm -rf {} \;
       echo "清理完成"
    2. 测试脚本

       sh backup.sh
  2. 编辑定时任务

    1. 进入编辑页面
       crontab -e
    2. 追加定时执行
       # 不带日志
        0 4 * * * sh /path/backup.sh
       # 带日志
       0 4 * * * sh /path/backup.sh > /path/backup.log 2>&1

亲,做好被邮件轰炸的准备吧,因为到这里,你已经配置完成,每天接收 N 份的邮件,(#^.^#)