独立服务器数据库定时备份脚本
该脚本用于在独立服务器上自动执行数据库定时备份任务,支持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字)
热门产品
弹性云服务器
强悍硬件配置结合弹性云服务器采用纯SSD架构硬件设备,只需几分钟,便可轻松云端获取和启用,实现您的计算需求。
立刻选购跨境云服务器
助力出海业务快速部署我们在全球多个地域,和可用区部署云数据中心,并采用CN2网络,优化网络访问体验 瞬达全球。
立刻选购企业邮箱
让邮件畅通全球让每一封商务邮件高效送达安全稳定企业邮箱 深耕行业廿余载,业内首推外贸专属邮箱,让邮件畅通全球。
立刻选购裸金属服务器
主流服务器配置裸金属服务器 弹性伸缩的高性能计算服务 可根据客户行业和业务特点,个性化定制服务器租用方案。
立刻选购