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

18 天前
 nbweb
#!/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
276 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1154063

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX