
#!/bin/bash # 此文件为备份 VPS 数据库和 WEB 目录,使用密钥登录到 VPS 服务器。 # 每月 1 日打包 web 目录备份,导出数据库存为 sql 文件备份,保留最新的 12 个月 # 每星期二用 rsyc 进行增量备份 # 远程服务器为 debian ,本地 nas 为 debian DB_USER="root" DB_PASS="$MYSQL_PASSWORD" # 使用环境变量存储密码,设置方法见下文 Local_dir="/mnt/Public/HomeFiles/mysite" # 本地 NAS 备份服务器目录 BACKUP_DIR="/root/backup" # 远程 VPS 备份目录 DATE_ALL=$(date +%Y%m%d_%H%M%S) # 格式如 20250820_1738 DATE_DAY=$(date +%d) # 获取系统日期 DATE_WEEK=$(date +%A) # 获取系统星期 LOG_FILE="${Local_dir}/backup_log_${DATE_ALL}.log" # 本地日志文件 MYSQL_PATH="/var/lib/mysql" # mysql 数据库路径 DATA_FILE=`ls -l $MYSQL_PATH | awk '{ print $9 ; }'` # 数据库目录 WEB_PATH="/var/www" # web 路径 WEB_FILE=`ls -l $WEB_PATH | awk '{ print $9 ; }'` # web 目录 Remote_IP=(8.8.8.8) # vps IP Remote_Port=22 #--->vps Port 端口 # 创建本地 NAS 备份目录 mkdir -p "$Local_dir/backup/$(date +%Y%m%d)" 2>> "$LOG_FILE" # 记录开始时间 echo "$DATE_ALL 开始备份" >> "$LOG_FILE" # 检查是否为 1 号 (全量备份) if [ "$DATE_DAY" -eq 1 ]; then echo "$DATE_ALL 全量备份开始" >> "$LOG_FILE" echo "$DATE_ALL 开始登录远程 vps" >> "$LOG_FILE" # 一次性登录 VPS 执行所有备份命令 ssh -p $Remote_Port root@${Remote_IP[0]} << "EOF" 2>> "$LOG_FILE" #echo "$DATE_ALL 已登录远程 vps" >> "$LOG_FILE" #按数据库名导出 sql 格式 BACKUP_TEMP_DIR=/root/backup mkdir -p $BACKUP_TEMP_DIR cd $BACKUP_TEMP_DIR for DataName in ${DATA_FILE} ; do if [ -d $MYSQL_PATH/$DataName ];then /usr/bin/mysqldump --databases $DataName -u$DB_USER -p$DB_PASS | gzip > $DataName\_$DATE_ALL.sql.gz 2>> "$LOG_FILE" echo "$DATE_ALL 数据库:${DataName}_${DATE_ALL}.sql.gz 备份已完成" >> "$LOG_FILE" fi done # 备份 web 目录,打包为 tar.gz for WebName in ${WEB_FILE} ; do if [ -d $WEB_PATH/$WebName ];then tar -zcf $WebName_$(DATE_ALL).tar.gz $WEB_PATH/$WebName 2>> "$LOG_FILE" echo "$DATE_ALL 网页:$WebName ${WebName}_${DATE_ALL}.tar.gz 备份已完成" >> "$LOG_FILE" fi done EOF # 备份传回 NAS 目录 echo "$DATE_ALL 开始向 nas 传输备份文件" >> "$LOG_FILE" rsync -avz --delete -e "ssh -p $Remote_Port" root@${Remote_IP[0]}:$BACKUP_TEMP_DIR/* $Local_dir/backup_$(date +%Y%m%d) 2>> "$LOG_FILE" echo "$DATE_ALL 备份文件已全部传回到 nas" >> "$LOG_FILE" else exit 0 fi if [ "$DATE_WEEK" = "Tuesday" ]; then #如果今天是星期二,就增量备份数据库和 web 目录 for VPS_IP in "${Remote_IP[@]}"; do rsync -avz --delete -e "ssh -p $Remote_Port" root@$VPS_IP:/var/www $Local_dir/$VPS_IP rsync -avz --delete -e "ssh -p $Remote_Port" root@$VPS_IP:/etc/nginx/sites-enabled $Local_dir/$VPS_IP rsync -avz --delete -e "ssh -p $Remote_Port" root@$VPS_IP:/var/lib/mysql $Local_dir/$VPS_IP # rsync -avz --delete -e "ssh -p $Remote_Port" root@$VPS_IP:/root/aaa $Local_dir/$VPS_IP done else exit 0 fi