在 Ubuntu 上为 LNMP 配置自动备份
一 准备与原则
二 安装与准备
三 备份脚本示例
#!/usr/bin/env bash
set -Eeuo pipefail
# 配置区
BACKUP_ROOT="/backup"
MYSQL_OPTS="--single-transaction --routines --triggers --hex-blob --set-gtid-purged=OFF"
RETENTION_DAYS=7
DATE=$(date +"%Y%m%d%H%M%S")
LOG_FILE="$BACKUP_ROOT/backup_$DATE.log"
# 目录
mkdir -p "$BACKUP_ROOT/mysql" "$BACKUP_ROOT/www" "$BACKUP_ROOT/nginx" "$BACKUP_ROOT/ssl"
log() { echo "[$(date '+%F %T')] $*" | tee -a "$LOG_FILE"; }
# 1) MySQL
DB_LIST=$(mysql -sN -e "SHOW DATABASES;" | grep -Ev "^(information_schema|performance_schema|mysql|sys)$" || true)
if [[ -n "$DB_LIST" ]]; then
for DB in $DB_LIST; do
mysqldump $MYSQL_OPTS -u"$(grep -E '^user=' ~/.my.cnf | cut -d= -f2)" "$DB" \
| gzip > "$BACKUP_ROOT/mysql/${DB}_${DATE}.sql.gz"
log "MySQL 备份完成: ${DB}_${DATE}.sql.gz"
done
else
log "未找到需要备份的数据库。"
fi
# 2) 网站文件
WEBSITE_ROOT="/var/www/html"
if [[ -d "$WEBSITE_ROOT" ]]; then
tar czf "$BACKUP_ROOT/www/www_${DATE}.tar.gz" -C "$WEBSITE_ROOT" .
log "网站文件备份完成: www_${DATE}.tar.gz"
fi
# 3) Nginx 配置
if [[ -d /etc/nginx ]]; then
tar czf "$BACKUP_ROOT/nginx/nginx_${DATE}.tar.gz" -C /etc/nginx .
log "Nginx 配置备份完成: nginx_${DATE}.tar.gz"
fi
# 4) SSL 证书
if [[ -d /etc/letsencrypt/live ]]; then
tar czf "$BACKUP_ROOT/ssl/letsencrypt_${DATE}.tar.gz" -C /etc/letsencrypt/live .
log "SSL 证书备份完成: letsencrypt_${DATE}.tar.gz"
fi
# 5) 清理旧备份
find "$BACKUP_ROOT/mysql" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_ROOT/www" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_ROOT/nginx" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_ROOT/ssl" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
log "已清理 $RETENTION_DAYS 天前的旧备份。"
exit 0
四 配置定时任务
五 远程备份与恢复演练