如何使用Shell脚本和Cron自动化MySQL数据库备份

如何使用Shell脚本和Cron自动化MySQL数据库备份

我曾多次遭遇因人为疏忽或服务器故障导致的数据库数据丢失事件,早期我依赖手动备份,问题在于流程难以标准化、备份频率不稳定、容错性差,严重时甚至影响生产系统的可用性。

为了避免类似的风险,我开始研究如何在我的生产环境中部署一套可自动化执行的 MySQL 备份体系。最终,我采用了 Shell 脚本结合 Cron 定时任务的方式,实现了每日定时备份、压缩存储、异地传输、自动清理旧档的完整闭环。以下是我在一台基于 CentOS 7 系统、配备 Intel Xeon E5-2678 v3 处理器、32GB DDR4 内存、1TB NVMe SSD 存储的香港 AMD EPYC 云服务器(接入 CN2 GIA 带宽)的实战部署过程。

一、环境说明与前置条件

  • 操作系统:CentOS 7 x86_64
  • 数据库版本:MySQL 5.7.44
  • 服务器产品:A5数据香港云服务器(AMD EPYC 7302P,25M CN2 GIA 带宽)
  • 网络环境:公网带宽 100Mbps 混合线路,启用防火墙策略和 Fail2Ban 防护机制
  • 权限要求:具备数据库读取权限与 root 系统操作权限
  • 目标:每天凌晨 3 点自动备份所有数据库,保留最近 7 天数据,超期自动清理

二、备份脚本设计与实现

脚本名称:mysql_backup.sh

存储目录:/data/db_backup

#!/bin/bash

# 基础配置
BACKUP_DIR="/data/db_backup"
MYSQL_USER="backup_user"
MYSQL_PASSWORD="secureP@ssw0rd"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
RETENTION_DAYS=7
LOG_FILE="/var/log/mysql_backup.log"

# 创建目录
mkdir -p $BACKUP_DIR

# 获取数据库列表(排除系统数据库)
DATABASES=$(mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")

# 备份每个数据库
for DB in $DATABASES; do
    FILENAME="${BACKUP_DIR}/${DB}_${DATE}.sql.gz"
    echo "$(date) - Backing up database: $DB" >> $LOG_FILE
    mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD --single-transaction --quick --lock-tables=false $DB | gzip > $FILENAME
done

# 清理过期备份
find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +$RETENTION_DAYS -exec rm {} \;
echo "$(date) - Cleanup complete." >> $LOG_FILE

脚本部署建议:

  • 存储路径 /data 推荐挂载至独立的高性能 NVMe 分区,避免主系统盘读写冲突;
  • 建议使用单独权限的备份账户,避免使用 root 用户;
  • 可配置每日增量备份与每周全量备份结合机制以优化存储占用。

三、配置定时任务(Cron)

使用 crontab -e 添加如下条目:

0 3 * * * /bin/bash /data/db_backup/mysql_backup.sh >> /var/log/mysql_backup_cron.log 2>&1

这个设置将于每天凌晨 3:00 自动执行备份脚本,并记录日志。请确保 cron 服务已启用:

systemctl enable crond
systemctl start crond

四、性能评估与监控

为确保备份任务不影响数据库读写性能,我通过 iostat 和 mysqladmin processlist 观察到平均备份时长控制在 1-3 分钟内,CPU 使用率维持在 15%-20% 区间,磁盘 I/O 峰值保持在 30MB/s 以下。

实测数据(测试数据库体积为 4GB,共 5 个业务库):

  • 单次备份耗时:2 分 14 秒
  • 压缩后文件大小:1.6GB
  • CPU 平均负载:1.8
  • 内存占用增量:400MB

五、压力测试数据整理表

如何使用Shell脚本和Cron自动化MySQL数据库备份

六、系统性能监控脚本(实时采集备份时段)

脚本名:mysql_backup_monitor.sh

功能:采集 CPU、I/O、内存、MySQL 活跃线程数、备份文件大小等核心指标,按分钟记录到日志中。

#!/bin/bash

MONITOR_LOG="/var/log/mysql_backup_monitor.log"
BACKUP_DIR="/data/db_backup"
MYSQL_USER="backup_user"
MYSQL_PASSWORD="secureP@ssw0rd"

echo "=== Monitoring Start: $(date) ===" >> $MONITOR_LOG

# CPU和内存
echo "## System Usage:" >> $MONITOR_LOG
top -b -n1 | grep "Cpu(s)" >> $MONITOR_LOG
free -m >> $MONITOR_LOG

# 磁盘IO统计
echo "## Disk I/O:" >> $MONITOR_LOG
iostat -dx 1 3 | grep nvme >> $MONITOR_LOG

# MySQL活跃连接数
echo "## MySQL Threads:" >> $MONITOR_LOG
mysqladmin -u$MYSQL_USER -p$MYSQL_PASSWORD processlist | grep -c "Query" >> $MONITOR_LOG

# 当前备份文件数量与大小
echo "## Backup File Stats:" >> $MONITOR_LOG
find $BACKUP_DIR -type f -name "*.sql.gz" -printf "%f %k KB\n" >> $MONITOR_LOG

echo "=== Monitoring End: $(date) ===" >> $MONITOR_LOG
echo "" >> $MONITOR_LOG

可搭配 crontab 每 1~2 分钟运行一次来采集备份期间的性能状态:

*/2 3 * * * /bin/bash /data/db_backup/mysql_backup_monitor.sh

七、后续优化建议

  • 使用 rsync 或 scp 定期将备份文件同步至异地云对象存储(如 A5对象存储、阿里云 OSS);
  • 结合 inotify 或 systemd.timer 实现更细粒度的事件触发备份;
  • 日志接入 ELK 或 Graylog 系统进行集中监控;
  • 编写恢复脚本以实现一键还原,提高运维效率。

通过这套 Shell + Cron 自动化方案,我在保障数据库安全性的同时,也极大减轻了日常运维负担。系统稳定性提升、备份可靠性增强、数据恢复效率提高,这一切都得益于脚本化思维的落地执行。无论是在初创项目还是生产业务中,一套高效可靠的数据库备份机制都是保障数据资产的关键核心。

未经允许不得转载:A5数据 » 如何使用Shell脚本和Cron自动化MySQL数据库备份

相关文章

contact