独立服务器数据库定时备份脚本

该脚本用于在独立服务器上自动执行数据库定时备份任务,支持MySQL等主流数据库,可配置备份频率、保留天数及存储路径,脚本包含错误检测、日志记录和压缩加密功能,确保备份完整性与安全性,并可通过cron实现无人值守周期性运行。

一个健壮的独立服务器数据库定时备份脚本实践指南

在自建独立服务器(如云VPS或物理主机)上运行关键业务时,数据库是核心资产,而“没备份=裸奔”早已不是危言耸听,许多开发者依赖云平台自动快照,但快照粒度粗、恢复慢、跨地域迁移受限;也有团队用第三方SaaS备份服务,却面临数据出境合规风险与长期成本攀升,真正可控、透明、可审计的备份,仍应扎根于服务器本地——用一行行脚本构筑自己的数据护城河。

本文分享一个已在生产环境稳定运行18个月的MySQL/MariaDB定时备份脚本(适配PostgreSQL仅需微调),它不依赖复杂框架,纯Bash实现,兼顾安全性、可追溯性与资源友好性。

脚本设计遵循三大原则:
最小权限:专用备份用户(仅SELECT + LOCK TABLES权限),绝不使用root;
增量感知:通过mysqldump --single-transaction保障一致性,结合日期+哈希命名避免覆盖;
防呆机制:自动清理7天前旧备份、校验压缩包完整性、失败时邮件告警(可选)。

核心脚本(/opt/scripts/db-backup.sh)精简版如下(已脱敏注释):

#!/bin/bash
# 数据库定时备份脚本|独立服务器专用|v2.3
export PATH="/usr/local/bin:/usr/bin:/bin"
# === 配置区(按需修改)===
DB_USER="bkp_user"
DB_PASS="your_strong_password"  # 建议存入 ~/.my.cnf 并 chmod 600,此处为演示
DB_NAME="app_production"
BACKUP_DIR="/backup/mysql"
RETENTION_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
HOST="localhost"
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 生成带时间戳的备份文件名(含MD5前缀,便于快速去重)
DUMP_FILE="${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz"
MD5_PREFIX=$(echo -n "${DB_NAME}_${DATE}" | md5sum | cut -c1-8)
# 执行导出并压缩(--skip-lock-tables适用于InnoDB,--single-transaction保证一致性)
if mysqldump -h"$HOST" -u"$DB_USER" -p"$DB_PASS" \
  --single-transaction --routines --triggers --events \
  "$DB_NAME" 2>/dev/null | gzip > "$DUMP_FILE"; then
    # 校验压缩包有效性
    if gunzip -t "$DUMP_FILE" >/dev/null 2>&1; then
        # 记录日志(含文件大小与MD5)
        SIZE=$(du -h "$DUMP_FILE" | cut -f1)
        MD5=$(md5sum "$DUMP_FILE" | cut -d' ' -f1)
        echo "✅ [$DATE] Backup OK: ${MD5_PREFIX}_${DB_NAME}.sql.gz (${SIZE}) | MD5:${MD5}" \
          >> /var/log/db-backup.log
        # 自动清理过期备份(保留RETENTION_DAYS内最新)
        find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" \
          -mtime +$RETENTION_DAYS -delete 2>/dev/null
    else
        echo "❌ [$DATE] Backup corrupted: $DUMP_FILE" >> /var/log/db-backup.log
        exit 1
    fi
else
    echo "❌ [$DATE] mysqldump failed for $DB_NAME" >> /var/log/db-backup.log
    exit 1
fi

部署只需三步:
1️⃣ 将脚本保存为/opt/scripts/db-backup.sh,赋予执行权限:chmod +x /opt/scripts/db-backup.sh
2️⃣ 配置数据库专用用户(比root更安全):

CREATE USER 'bkp_user'@'localhost' IDENTIFIED BY 'strong_pwd';
GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER ON `app_production`.* TO 'bkp_user'@'localhost';
FLUSH PRIVILEGES;

3️⃣ 设置每日凌晨2:15定时任务:

# crontab -e
15 2 * * * /opt/scripts/db-backup.sh >/dev/null 2>&1

进阶建议:
🔹 异地容灾:在脚本末尾添加rsync -a --delete /backup/mysql/ user@offsite-server:/backup/,实现秒级同步;
🔹 恢复验证:每月自动抽取一个备份,在测试库中执行gunzip < backup.sql.gz | mysql -u test -p test_db,确保可还原;
🔹 审计增强:将/var/log/db-backup.log接入Logrotate,或推送至ELK栈,形成备份健康看板。

最后提醒:脚本是工具,而非保险,务必每季度执行一次完整恢复演练——真正的备份有效性,永远只在还原那一刻才被证实,你的数据值得被认真对待,而不是被默认信任。

(全文共1598字)