暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

快速上手 Mysql 基于 Percona XtraBackup全备加邮件告警通知

山佳数峰寻道 2025-03-13
180

01



前言

有时候做数据库备份时将磁盘空间占满导致后续备份异常,因此基于之前的备份脚本进行完善加入了邮件通知。

该脚本是一个用于 MySQL数据库全量备份的自动化工具,基于 Percona XtraBackup 实现。它不仅可以完成数据库备份,还可以对备份文件进行压缩、清理旧备份,并通过邮件通知备份结果。以下是脚本的主要功能和特点:

1.核心功能

·数据库备份

使用 Percona XtraBackup 工具对 MySQL 数据库进行全量备份。

支持压缩备份文件以节省存储空间。

备份文件以日期时间命名,便于管理和查找。

·备份文件压缩

将备份目录打包为 tar.gz 文件,进一步减少存储占用。

压缩成功后,删除原始备份目录以释放磁盘空间。

·磁盘空间检查

在备份前后分别检查磁盘空间使用情况,并将结果记录到日志和邮件通知中。

·清理旧备份

自动清理超过 天的旧备份文件和日志文件,避免磁盘空间被占满。

·邮件通知

备份成功后,发送简洁的成功通知。

备份或压缩失败时,发送详细的失败信息,包括关键日志和磁盘空间情况。

2.脚本特点

·自动化

所有操作(备份、压缩、清理、通知)均自动化完成,无需人工干预。

·日志记录

所有操作步骤和结果都会记录到日志文件中,便于排查问题。

·灵活的配置

通过变量配置数据库连接信息、备份目录、临时目录等,便于根据实际环境调整。

·友好的通知

成功时仅发送简洁通知,失败时提供详细日志,避免信息过载。

3.脚本流程

1.初始化

创建备份目录和日志目录。

检查备份前的磁盘空间。

2.备份数据库

使用 XtraBackup 进行全量备份。

如果备份失败,记录日志并发送失败通知。

3.压缩备份文件

将备份目录打包为 tar.gz 文件。

如果压缩失败,记录日志并发送失败通知。

4.清理旧备份

删除超过 7 天的旧备份文件和日志文件。

5.发送邮件通知

根据备份和压缩结果,发送成功或失败的通知。

02



功能实现

1.安装及配置mailx

首先安装邮箱服务软件包

    yum -y  install pcp-pmda-sendmail pcp-pmda-mailq mailx procmail mailcap

    编辑邮箱配置(本次实验配置163邮箱):

      /etc/mail.rc
      set smtp=smtps://smtp.163.com:465            # 邮箱域名,注意端口号可以修改的,465或587
      set smtp-auth=login
      set smtp-auth-user=********   # 邮箱账号
      set smtp-auth-password=*****  # 邮箱授权码
      set ssl-verify=ignore            # 忽略SSL证书验证(根据实际情况可能需要调整)
      set nss-config-dir=/etc/pki/nssdb
      set from=*****      # 发送邮件的邮箱
      2.数据库配置备份用户
        CREATE USER 'mydbbkpuser'@'localhost' IDENTIFIED BY '*****';
        GRANT ALL PRIVILEGES ON  *.* to 'mydbbkpuser'@'localhost';
        FLUSH PRIVILEGES;
        3.编辑备份脚本
        创建备份脚本路径:
          mkdir -p data/mysqlbak/scripts

          其余所需要路径在备份脚本中创建:

          编辑备份脚本:

          /data/mysqlbak/scripts/mysql_bk.sh
            # 变量配置
            DB_USER="mydbbkpusr"
            DB_PASSWORD="******"
            DB_DATA_DIR=/data/mysql/data
            BACKUP_BASE_DIR="/data/mysqlbak/data"
            BACKUP_BASE_TMP_DIR=/data/mysqlbak/tmp
            BACKUP_DIR_NAME=`date '+%Y%m%d%H%M%S'`_mysqlbak # 以日期命名备份目录
            BACKUP_DIR="$BACKUP_BASE_DIR/$BACKUP_DIR_NAME"  # 备份目录路径
            LOG_FILE="$BACKUP_BASE_DIR/../logs/backup_log_`date '+%Y%m%d%H%M%S'`.log"
            EMAIL="**********"
            EMAIL_SUBJECT="MySQL XtraBackup Report - `date '+%Y%m%d%H%M%S'`"


            # 创建备份目录
            mkdir -p $BACKUP_DIR
            mkdir -p "$BACKUP_BASE_DIR/../logs"
            mkdir -p data/mysqlbak/tmp


            # 检查备份前的磁盘空间
            echo "Checking disk space before backup..." >> $LOG_FILE
            DISK_SPACE_BEFORE=$(df -h $BACKUP_BASE_DIR)
            echo "$DISK_SPACE_BEFORE" >> $LOG_FILE


            # 开始备份
            echo "Starting MySQL full database backup using XtraBackup on `date '+%Y%m%d%H%M%S'`" >> $LOG_FILE
            /data/mysqlbak/percona-xtrabackup/bin/xtrabackup --backup --user=$DB_USER --password=$DB_PASSWORD --compress --compress-threads=4 --tmpdir=$BACKUP_BASE_TMP_DIR --socket=$DB_DATA_DIR/mysql.sock --no-server-version-check --target-dir=$BACKUP_DIR >> $LOG_FILE 2>&1


            *******************************************
            *******************************************
            本次脚本不做过多展示,如有需要可以联系作者进行获取脚本。

            变量解释:

            DB_USER="*****"    #传入数据库备份用户

            DB_PASSWORD="******"     #传入数据库备份用户密码

            DB_DATA_DIR=/data/mysql/data     #传入数据库data路径

            BACKUP_BASE_DIR="/data/mysqlbak/data"   #传入数据库备份路径

            BACKUP_BASE_TMP_DIR=/data/mysqlbak/tmp   #传入备份临时路径

            BACKUP_DIR_NAME=`date '+%Y%m%d%H%M%S'`_mysqlbak # 以日期命名备份目录

            BACKUP_DIR="$BACKUP_BASE_DIR/$BACKUP_DIR_NAME"  # 备份目录路径

            LOG_FILE="$BACKUP_BASE_DIR/../logs/backup_log_`date '+%Y%m%d%H%M%S'`.log"

            EMAIL="**********"      #结果通知 收件人邮箱

            EMAIL_SUBJECT="MySQL XtraBackup Report - `date '+%Y%m%d%H%M%S'`"

            #邮件主题可以根据实际情况进行修改和调整

            03



            执行备份脚本和邮件内容查看

            1、备份脚本测试及运行结果:

            ---正常备份结果和邮件通知:

              [root@shanjia scripts]# sh mysql_bk.sh
              Backup process completed. Log file: /data/mysqlbak/data/logs/backup_log_20250312165319.log

              如图可以看到备份正常完成,同时也检查了磁盘空间大小,服务器本地同样保存了对应日志文件,接下来看下邮件内容:
              可以看到正常发出邮件,并且暂时备份是否正常,以及暂时备份前后的磁盘空间大小(本次实验是使用一个新部署的mysql进行测试)
              ---错误备份结果和邮件通知:

              本次我做了一个路径不存在的模拟:

                [root@shanjia mysqlbak]# mv tmp tmp.bak
                [root@shanjia mysqlbak]# sh scripts/mysql_bk.sh
                Backup process completed. Log file: /data/mysqlbak/data/logs/backup_log_20250312165914.log
                [root@shanjia mysqlbak]# tail -10f /data/mysqlbak/data/logs/backup_log_20250312165914.log
                2025-03-12T16:59:14.453699+08:00 0 [Note] [MY-011825] [Xtrabackup] uses posix_fadvise().
                2025-03-12T16:59:14.453760+08:00 0 [Note] [MY-011825] [Xtrabackup] cd to /data/mysql/data
                2025-03-12T16:59:14.453780+08:00 0 [Note] [MY-011825] [Xtrabackupopen files limit requested 65535set to 65535
                xtrabackup: Can't get stat of '/data/mysqlbak/tmp' (OS errno 2 - No such file or directory)
                Backup failed!
                Checking disk space after backup...
                Filesystem      Size  Used Avail Use% Mounted on
                /dev/sda1        50G   22G   29G  43% /
                Sending email notification...
                Cleaning up old backups...

                可以看 tmp目录不存在而报错

                接下来 我们看下邮件通知内容:

                总结:

                该脚本是一个功能完善、易于使用的 MySQL 数据库备份工具,适用于生产环境中需要定期备份和监控的场景。通过自动化备份、压缩、清理和通知功能,可以显著提高数据库备份的效率和可靠性,同时减少运维人员的工作负担。


                文章转载自山佳数峰寻道,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论