百度网盘提供免费的存储空间,上传下载速度尚可,且作为国内主流服务,访问相对稳定。对于个人站长或开发者,将其作为网站文件和数据库的异地备份目的地,是一种低成本的数据安全方案。
本文将介绍一个自动化的 Shell 脚本,用于将 VPS 上的 Nginx/Apache 配置文件、网站目录及 MySQL 数据库打包,并上传至百度网盘进行备份。
脚本功能与原理
该脚本主要执行以下步骤:
- 定义变量:设置数据库凭据、备份目录、待备份的网站及配置目录路径。
- 创建本地备份目录:确保用于临时存储备份文件的目录存在。
- 备份 MySQL 数据库:导出所有用户数据库(排除系统库),并分别压缩。
- 打包网站文件与配置:将指定的网站目录和 Web 服务器配置文件打包压缩。
- 上传至百度网盘:调用上传工具将备份文件上传到网盘的指定目录。
- 清理本地临时文件:上传完成后删除本地备份,释放磁盘空间。
准备工作
在运行脚本前,你需要完成以下准备工作:
- 在百度网盘创建用于存放备份的目录。
- 在 VPS 上配置好百度网盘的上传工具(例如基于官方 API 的第三方命令行客户端)。
- 确保脚本中定义的备份目录、网站路径、数据库密码等与实际环境一致。
备份脚本(2024 更新版)
以下脚本已进行优化和错误修正,请根据注释修改配置:
#!/bin/bash
# ==================== 用户配置区域 ====================
# MySQL 数据库凭据
MYSQL_USER="root"
MYSQL_PASS="your_mysql_password" # 请替换为你的数据库密码
# 百度网盘上的目标目录,按日期创建子文件夹
BAIDUPAN_BASE_DIR="/VPS_Backup"
BAIDUPAN_DIR="$BAIDUPAN_BASE_DIR/$(date +%Y-%m-%d)"
# 本地临时备份目录
LOCAL_BACKUP_DIR="/tmp/vps_backup_$(date +%Y%m%d)"
# 需要备份的目录(请根据你的实际路径修改)
WEB_SERVER_CONFIG="/etc/nginx" # Nginx 配置目录
# WEB_SERVER_CONFIG="/etc/apache2" # 如果是 Apache,请取消注释此行并注释上一行
WEBSITE_DIR="/var/www/html" # 网站根目录
# 定义备份文件名(包含日期)
MYSQL_BACKUP_FILE="mysql_$(date +%Y%m%d).tar.gz"
WEBSITE_BACKUP_FILE="website_$(date +%Y%m%d).tar.gz"
CONFIG_BACKUP_FILE="config_$(date +%Y%m%d).tar.gz"
# 百度网盘上传工具的路径(请根据你的安装路径修改)
UPLOADER_SCRIPT="/path/to/your/bpcs_uploader.php"
# ==================== 配置结束 ====================
# 创建本地临时备份目录
mkdir -p "$LOCAL_BACKUP_DIR"
cd "$LOCAL_BACKUP_DIR" || exit 1
# 1. 备份 MySQL 数据库
# 获取所有用户数据库(排除系统数据库)
DATABASES=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PASS" -B -N -e "SHOW DATABASES" | grep -Ev '^(information_schema|performance_schema|mysql|sys)$')
for DB in $DATABASES; do
echo "正在备份数据库: $DB"
mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASS" --single-transaction --quick "$DB" | gzip -9 > "${DB}.sql.gz"
if [ $? -ne 0 ]; then
echo "警告: 数据库 $DB 备份失败,请检查权限或连接。"
fi
done
# 打包所有数据库备份文件
if ls *.sql.gz >/dev/null 2>&1; then
tar -zcvf "$MYSQL_BACKUP_FILE" *.sql.gz
echo "数据库打包完成: $MYSQL_BACKUP_FILE"
else
echo "未找到任何数据库备份文件,跳过打包。"
MYSQL_BACKUP_FILE=""
fi
# 2. 备份网站文件
if [ -d "$WEBSITE_DIR" ]; then
tar -zcvf "$WEBSITE_BACKUP_FILE" -C "$(dirname "$WEBSITE_DIR")" "$(basename "$WEBSITE_DIR")"
echo "网站文件打包完成: $WEBSITE_BACKUP_FILE"
else
echo "警告: 网站目录 $WEBSITE_DIR 不存在,跳过备份。"
WEBSITE_BACKUP_FILE=""
fi
# 3. 备份 Web 服务器配置文件
if [ -d "$WEB_SERVER_CONFIG" ]; then
# 仅备份 .conf 文件,可根据需要调整
tar -zcvf "$CONFIG_BACKUP_FILE" -C "$WEB_SERVER_CONFIG" ./*.conf 2>/dev/null
echo "配置文件打包完成: $CONFIG_BACKUP_FILE"
else
echo "警告: 配置目录 $WEB_SERVER_CONFIG 不存在,跳过备份。"
CONFIG_BACKUP_FILE=""
fi
# 4. 上传到百度网盘
# 确保上传工具存在且可执行
if [ ! -x "$UPLOADER_SCRIPT" ]; then
echo "错误: 上传工具 $UPLOADER_SCRIPT 不存在或不可执行。"
exit 1
fi
# 上传每个备份文件(如果文件存在)
for BACKUP_FILE in "$MYSQL_BACKUP_FILE" "$WEBSITE_BACKUP_FILE" "$CONFIG_BACKUP_FILE"; do
if [ -n "$BACKUP_FILE" ] && [ -f "$BACKUP_FILE" ]; then
echo "正在上传 $BACKUP_FILE 到百度网盘..."
php "$UPLOADER_SCRIPT" upload "$BACKUP_FILE" "$BAIDUPAN_DIR/$BACKUP_FILE"
if [ $? -eq 0 ]; then
echo "上传成功: $BACKUP_FILE"
else
echo "上传失败: $BACKUP_FILE"
fi
fi
done
# 5. 清理本地临时文件
echo "清理本地临时备份目录..."
rm -rf "$LOCAL_BACKUP_DIR"
echo "备份流程全部完成!"
exit 0
使用与自动化
首次运行
- 将脚本保存至 VPS,例如
/usr/local/bin/backup_to_baidu.sh。 - 使用
chmod +x /usr/local/bin/backup_to_baidu.sh赋予执行权限。 - 编辑脚本,根据注释修改所有配置项(数据库密码、目录路径、上传工具路径)。
- 手动执行一次脚本,测试备份和上传功能是否正常:
bash /usr/local/bin/backup_to_baidu.sh。
设置定时任务(Cron)
要实现每日自动备份,可以使用 Crontab。执行 crontab -e 添加以下行(例如每天凌晨 3 点执行):
# 每天凌晨 3 点执行备份脚本
0 3 * * * /usr/local/bin/backup_to_baidu.sh >> /var/log/vps_backup.log 2>&1
这会将脚本的输出(包括错误信息)记录到 /var/log/vps_backup.log 文件中,便于排查问题。
注意事项与优化建议
- 安全性:脚本中包含数据库密码。建议将敏感信息存储在单独的环境变量文件或使用更安全的配置管理方式。
- 备份验证:定期检查百度网盘中的备份文件是否完整、可下载,并尝试恢复测试。
- 存储空间:百度网盘对免费用户可能有流量或存储限制,请关注其政策变化。
- 增量备份:当前脚本为全量备份。如需增量备份,可考虑使用
rsync或专门工具先创建本地增量快照,再上传。 - 错误处理:脚本已加入基础错误判断,但生产环境建议增加更完善的日志和邮件/通知告警功能。
通过以上步骤,你可以建立一个低成本、自动化的 VPS 数据备份方案,有效防范数据丢失风险。
不错~~~我正需要~~~网站在国外主机上~~还是随时备份到国内稳当
这必须的~~~国外的其实也可以考虑Dropbox,可能备份速度更快,而且很多程序都有Dropbox的插件,Dropbox是建立在Amazon S3云存储上的,数据可靠性比百度云还要好,主要是没政策风险啊~
还没用过vps!
你网站不一定要搬到vps上来,但是可以买台来玩玩~~~学习知识
兄台,脚本我已经更新了!更精炼了!