V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nbweb
V2EX  ›  问与答

写了一个 shell 脚本备份网站,帮看看,谢谢!

  •  
  •   nbweb · 13 天前 · 268 次点击
    #!/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
    
    目前尚无回复
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5837 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 03:01 · PVG 11:01 · LAX 20:01 · JFK 23:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.