LNMP自动备份实现方案
一 备份范围与准备
二 一键脚本示例与说明
#!/usr/bin/env bash
set -Eeuo pipefail
# ========== 用户可配置 ==========
BACKUP_DIR="/backup" # 本地备份目录
MYSQL_USER="root" # 数据库用户
MYSQL_PASS="YourStrongPass!" # 数据库密码(生产建议用 ~/.my.cnf)
DB_NAME="--all-databases" # 备份全部库;如单库:DB_NAME="your_db"
NGINX_CONF="/etc/nginx" # Nginx 配置目录
WEBSITE_ROOT="/var/www/html" # 网站根目录
RETENTION_DAYS=7 # 保留天数
REMOTE_USER="backup" # 远程备份用户(可选)
REMOTE_HOST="192.0.2.10" # 远程主机(可选)
REMOTE_DIR="/remote/backup" # 远程备份目录(可选)
USE_SSH=true # true: SCP/RSYNC;false: 禁用远程
# ========== 初始化 ==========
DATE=$(date +"%Y%m%d%H%M%S")
mkdir -p "$BACKUP_DIR"
# 日志函数
log() { echo "[$(date '+%F %T')] $*"; }
# ========== 备份 MySQL ==========
log "开始备份 MySQL ..."
MYSQL_FILE="$BACKUP_DIR/mysql_${DATE}.sql.gz"
mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASS" $DB_NAME \
--single-transaction --routines --triggers --hex-blob \
| gzip > "$MYSQL_FILE"
[[ $? -eq 0 ]] && log "MySQL 备份完成: $MYSQL_FILE" \
|| { log "MySQL 备份失败"; exit 1; }
# ========== 备份网站文件 ==========
log "开始备份网站文件 ..."
WEB_FILE="$BACKUP_DIR/www_${DATE}.tar.gz"
tar -czf "$WEB_FILE" -C "$WEBSITE_ROOT" .
[[ $? -eq 0 ]] && log "网站文件备份完成: $WEB_FILE" \
|| { log "网站文件备份失败"; exit 1; }
# ========== 备份 Nginx 配置 ==========
log "开始备份 Nginx 配置 ..."
NGINX_FILE="$BACKUP_DIR/nginx_${DATE}.tar.gz"
tar -czf "$NGINX_FILE" -C "$(dirname "$NGINX_CONF")" "$(basename "$NGINX_CONF")"
[[ $? -eq 0 ]] && log "Nginx 配置备份完成: $NGINX_FILE" \
|| { log "Nginx 配置备份失败"; exit 1; }
# ========== 远程备份(可选) ==========
if [[ "$USE_SSH" == "true" ]]; then
log "开始同步到远程 $REMOTE_HOST:$REMOTE_DIR ..."
rsync -avz --remove-source-files "$BACKUP_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" \
&& log "远程同步完成" \
|| log "远程同步失败"
fi
# ========== 清理过期备份 ==========
log "清理 $RETENTION_DAYS 天前的备份 ..."
find "$BACKUP_DIR" -type f \( -name "*.sql.gz" -o -name "*.tar.gz" \) -mtime +$RETENTION_DAYS -delete
log "清理完成"
exit 0
三 定时任务与远程备份
四 校验与恢复演练
五 进阶与可选方案