前言
对于使用小内存 VPS 的用户,定期备份至关重要。这不仅能防范服务商(IDC)意外终止服务,也能应对老旧硬件故障导致的数据丢失风险。本文将介绍一个通过 cron 定时任务,自动备份网站文件与 MySQL 数据库并上传至 FTP 服务器的脚本方案。
准备工作
在部署脚本前,请确保完成以下准备工作:
- 安装 lftp:脚本使用功能强大的
lftp进行 FTP 传输。- CentOS/RHEL 系统:
yum install lftp - Debian/Ubuntu 系统:
apt-get install lftp
- CentOS/RHEL 系统:
- 创建目录:
- 在 VPS 本地创建备份暂存目录,例如:
/home/backup/ - 在 FTP 服务器上创建用于存放备份的目录,例如:
backup
- 在 VPS 本地创建备份暂存目录,例如:
- FTP 存储:可以选择合适的 FTP 空间。对于数据量不大的备份,一些服务商提供的免费空间(如伴随域名注册赠送的空间)即可满足需求。
备份脚本详解
以下是一个功能完整的备份脚本,已添加详细注释。请根据您的实际环境修改脚本中的配置值。
#!/bin/bash
# Function: Backup website and mysql database
# Author: licess
# Website: http://lnmp.org
# IMPORTANT!!! Please Setting the following Values!
######~Set Directory you want to backup~######
# 将下面的目录修改成自己要备份的目录,通常网站目录位于 /home/wwwroot/
# 可以继续添加:Backup_Dir5="your_directory",数字依次递增。
# 如果不足4个,直接删除不需要的行,并同步修改下方的 tar 命令部分。
Backup_Dir1="vpser.net"
Backup_Dir2="lnmp.org"
Backup_Dir3="licess.org"
Backup_Dir4="jungehost.com"
######~Set MySQL UserName and password~######
# 设置MySQL用户名和密码,建议使用root用户以确保有完整导出权限。
MYSQL_UserName="root"
MYSQL_PassWord="yourmysqlrootpassword"
######~Set MySQL Database you want to backup~######
# 设置要备份的数据库,可以继续添加:Backup_Database_Name5="database_name"
Backup_Database_Name1="vpser"
Backup_Database_Name2="licess"
Backup_Database_Name3="junge"
Backup_Database_Name4="vpserorg"
######~Set FTP Information~######
# 设置FTP服务器信息
FTP_HostName="184.168.192.43" # FTP服务器的IP或域名
FTP_UserName="vpsernet" # FTP用户名
FTP_PassWord="yourftppassword" # FTP密码
FTP_BackupDir="backup" # FTP上的备份目录,需提前创建
#Values Setting END!
TodayWWWBackup="www-*-$(date +"%Y%m%d").tar.gz"
TodayDBBackup="db-*-$(date +"%Y%m%d").sql"
OldWWWBackup="www-*-$(date -d -3day +"%Y%m%d").tar.gz"
OldDBBackup="db-*-$(date -d -3day +"%Y%m%d").sql"
# 备份网站文件
# 使用 --exclude 参数可以排除不需要备份的子目录
# 如果添加了 Backup_Dir5,请在此处补充对应的 tar 命令
# 如果目录数量减少,请删除多余的 tar 命令
tar zcf /home/backup/www-$Backup_Dir1-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir1 --exclude=soft
tar zcf /home/backup/www-$Backup_Dir2-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir2
tar zcf /home/backup/www-$Backup_Dir3-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir3 --exclude=test
tar zcf /home/backup/www-$Backup_Dir4-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir4
# 备份MySQL数据库
# 请根据您的MySQL安装路径调整 mysqldump 命令的路径,常见路径为 /usr/bin/mysqldump 或 /usr/local/mysql/bin/mysqldump
# 如果添加了 Backup_Database_Name5,请在此处补充对应的 mysqldump 命令
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name1 > /home/backup/db-$Backup_Database_Name1-$(date +"%Y%m%d").sql
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name2 > /home/backup/db-$Backup_Database_Name2-$(date +"%Y%m%d").sql
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name3 > /home/backup/db-$Backup_Database_Name3-$(date +"%Y%m%d").sql
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name4 > /home/backup/db-$Backup_Database_Name4-$(date +"%Y%m%d").sql
# 删除本地3天前的备份文件
rm -f /home/backup/$OldWWWBackup
rm -f /home/backup/$OldDBBackup
# 切换到本地备份目录
cd /home/backup/
# 使用 lftp 上传备份文件到FTP服务器,并删除FTP上3天前的旧备份
lftp $FTP_HostName -u $FTP_UserName,$FTP_PassWord << EOF
cd $FTP_BackupDir
mrm $OldWWWBackup
mrm $OldDBBackup
mput $TodayWWWBackup
mput $TodayDBBackup
bye
EOF
脚本使用说明
- 下载与编辑:将脚本保存至服务器,例如
/root/backup.sh。使用文本编辑器(如vi,nano或通过 SFTP 客户端)打开,根据注释仔细修改所有配置项(目录、数据库、FTP信息等)。 - 赋予执行权限:执行命令
chmod +x /root/backup.sh。 - 添加定时任务:执行
crontab -e编辑当前用户的 cron 计划。添加如下一行,表示每天凌晨3点执行备份:0 3 * * * /root/backup.sh - 测试:建议先手动执行一次脚本 (
/root/backup.sh),检查本地备份文件是否生成,以及是否成功上传至 FTP,并观察日志是否有报错。
注意事项与优化建议
- 路径检查:请确认脚本中的
mysqldump路径与您服务器上的实际路径一致。可以使用which mysqldump命令查找。 - 密码安全:脚本中包含明文密码。在安全要求较高的环境中,建议考虑使用配置文件(设置严格权限)或 MySQL 的
.my.cnf安全文件来管理凭证。 - 备份保留策略:当前脚本仅保留最近3天的备份。您可以根据存储空间和需求,调整
date -d -3day中的数字。 - 错误处理:生产环境建议在脚本中添加更完善的错误判断和日志记录功能,例如记录每次备份的成功与否。
- 存储多样性:除了 FTP,也可以考虑将备份同步到云存储(如 S3、OSS)或其它服务器,实现异地容灾。
通过以上步骤,您可以建立一个简单可靠的自动备份机制,有效保障 VPS 上数据的安全。