01
前言
有时候做数据库备份时将磁盘空间占满导致后续备份异常,因此基于之前的备份脚本进行完善加入了邮件通知。
该脚本是一个用于 MySQL数据库全量备份的自动化工具,基于 Percona XtraBackup 实现。它不仅可以完成数据库备份,还可以对备份文件进行压缩、清理旧备份,并通过邮件通知备份结果。以下是脚本的主要功能和特点:
1.核心功能
·数据库备份:
使用 Percona XtraBackup 工具对 MySQL 数据库进行全量备份。
支持压缩备份文件以节省存储空间。
备份文件以日期时间命名,便于管理和查找。
·备份文件压缩:
将备份目录打包为 tar.gz 文件,进一步减少存储占用。
压缩成功后,删除原始备份目录以释放磁盘空间。
·磁盘空间检查:
在备份前后分别检查磁盘空间使用情况,并将结果记录到日志和邮件通知中。
·清理旧备份:
自动清理超过 7 天的旧备份文件和日志文件,避免磁盘空间被占满。
·邮件通知:
备份成功后,发送简洁的成功通知。
备份或压缩失败时,发送详细的失败信息,包括关键日志和磁盘空间情况。
2.脚本特点
·自动化:
所有操作(备份、压缩、清理、通知)均自动化完成,无需人工干预。
·日志记录:
所有操作步骤和结果都会记录到日志文件中,便于排查问题。
·灵活的配置:
通过变量配置数据库连接信息、备份目录、临时目录等,便于根据实际环境调整。
·友好的通知:
成功时仅发送简洁通知,失败时提供详细日志,避免信息过载。
3.脚本流程
1.初始化:
创建备份目录和日志目录。
检查备份前的磁盘空间。
2.备份数据库:
使用 XtraBackup 进行全量备份。
如果备份失败,记录日志并发送失败通知。
3.压缩备份文件:
将备份目录打包为 tar.gz 文件。
如果压缩失败,记录日志并发送失败通知。
4.清理旧备份:
删除超过 7 天的旧备份文件和日志文件。
5.发送邮件通知:
根据备份和压缩结果,发送成功或失败的通知。
02
功能实现
首先安装邮箱服务软件包
yum -y install pcp-pmda-sendmail pcp-pmda-mailq mailx procmail mailcap
编辑邮箱配置(本次实验配置163邮箱):
/etc/mail.rcset smtp=smtps://smtp.163.com:465 # 邮箱域名,注意端口号可以修改的,465或587set smtp-auth=loginset smtp-auth-user=******** # 邮箱账号set smtp-auth-password=***** # 邮箱授权码set ssl-verify=ignore # 忽略SSL证书验证(根据实际情况可能需要调整)set nss-config-dir=/etc/pki/nssdbset from=***** # 发送邮件的邮箱
CREATE USER 'mydbbkpuser'@'localhost' IDENTIFIED BY '*****';GRANT ALL PRIVILEGES ON *.* to 'mydbbkpuser'@'localhost';FLUSH PRIVILEGES;
mkdir -p data/mysqlbak/scripts
其余所需要路径在备份脚本中创建:
编辑备份脚本:
# 变量配置DB_USER="mydbbkpusr"DB_PASSWORD="******"DB_DATA_DIR=/data/mysql/dataBACKUP_BASE_DIR="/data/mysqlbak/data"BACKUP_BASE_TMP_DIR=/data/mysqlbak/tmpBACKUP_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_DIRmkdir -p "$BACKUP_BASE_DIR/../logs"mkdir -p data/mysqlbak/tmp# 检查备份前的磁盘空间echo "Checking disk space before backup..." >> $LOG_FILEDISK_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.shBackup process completed. Log file: /data/mysqlbak/data/logs/backup_log_20250312165319.log



本次我做了一个路径不存在的模拟:
[root@shanjia mysqlbak]# mv tmp tmp.bak[root@shanjia mysqlbak]# sh scripts/mysql_bk.shBackup process completed. Log file: /data/mysqlbak/data/logs/backup_log_20250312165914.log[root@shanjia mysqlbak]# tail -10f /data/mysqlbak/data/logs/backup_log_20250312165914.log2025-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/data2025-03-12T16:59:14.453780+08:00 0 [Note] [MY-011825] [Xtrabackup] open files limit requested 65535, set to 65535xtrabackup: 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 数据库备份工具,适用于生产环境中需要定期备份和监控的场景。通过自动化备份、压缩、清理和通知功能,可以显著提高数据库备份的效率和可靠性,同时减少运维人员的工作负担。




