博客 / Others/ 自动备份Linux VPS/服务器网站/数据库并上传到FTP的脚本

自动备份Linux VPS/服务器网站/数据库并上传到FTP的脚本

自动备份Linux VPS/服务器网站/数据库并上传到FTP的脚本

前言

对于使用小内存 VPS 的用户,定期备份至关重要。这不仅能防范服务商(IDC)意外终止服务,也能应对老旧硬件故障导致的数据丢失风险。本文将介绍一个通过 cron 定时任务,自动备份网站文件与 MySQL 数据库并上传至 FTP 服务器的脚本方案。

准备工作

在部署脚本前,请确保完成以下准备工作:

  • 安装 lftp:脚本使用功能强大的 lftp 进行 FTP 传输。
    • CentOS/RHEL 系统:yum install lftp
    • Debian/Ubuntu 系统:apt-get install lftp
  • 创建目录
    • 在 VPS 本地创建备份暂存目录,例如:/home/backup/
    • 在 FTP 服务器上创建用于存放备份的目录,例如:backup
  • 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

脚本使用说明

  1. 下载与编辑:将脚本保存至服务器,例如 /root/backup.sh。使用文本编辑器(如 vi, nano 或通过 SFTP 客户端)打开,根据注释仔细修改所有配置项(目录、数据库、FTP信息等)。
  2. 赋予执行权限:执行命令 chmod +x /root/backup.sh
  3. 添加定时任务:执行 crontab -e 编辑当前用户的 cron 计划。添加如下一行,表示每天凌晨3点执行备份:
    0 3 * * * /root/backup.sh
  4. 测试:建议先手动执行一次脚本 (/root/backup.sh),检查本地备份文件是否生成,以及是否成功上传至 FTP,并观察日志是否有报错。

注意事项与优化建议

  • 路径检查:请确认脚本中的 mysqldump 路径与您服务器上的实际路径一致。可以使用 which mysqldump 命令查找。
  • 密码安全:脚本中包含明文密码。在安全要求较高的环境中,建议考虑使用配置文件(设置严格权限)或 MySQL 的 .my.cnf 安全文件来管理凭证。
  • 备份保留策略:当前脚本仅保留最近3天的备份。您可以根据存储空间和需求,调整 date -d -3day 中的数字。
  • 错误处理:生产环境建议在脚本中添加更完善的错误判断和日志记录功能,例如记录每次备份的成功与否。
  • 存储多样性:除了 FTP,也可以考虑将备份同步到云存储(如 S3、OSS)或其它服务器,实现异地容灾。

通过以上步骤,您可以建立一个简单可靠的自动备份机制,有效保障 VPS 上数据的安全。

发表评论

您的邮箱不会公开。必填项已用 * 标注。