博客 / Others/ Linux自动备份网站文件和数据库上传到FTP空间同时发送到Email脚本

Linux自动备份网站文件和数据库上传到FTP空间同时发送到Email脚本

本脚本的主要功能如下:

  • 自动定时备份指定的网站文件与数据库,并上传至指定的 FTP 空间。
  • 自动删除旧的备份文件,可自定义保留天数。
  • 数据库备份采用多重保险:除上传至 FTP 外,还会通过邮件发送备份文件(作为附件),实现双重备份。

准备工作

在开始之前,请确保完成以下准备工作:

  1. 创建备份目录:mkdir -p /home/backup
  2. 安装邮件发送组件:yum install sendmail mutt
  3. 安装 zip 压缩工具:yum install zip
  4. 安装 crontab(如果尚未安装):yum -y install gcc gcc-c++ autoconf vixie-cron crontabs

脚本配置

请根据您的实际情况修改以下脚本中的配置项。脚本的核心配置部分如下:

# 要修改的配置开始
MYSQL_USER=root                     # MySQL 用户名
MYSQL_PASS=123456                   # MySQL 密码
MAIL_TO=whhack@whhack.com           # 接收备份的邮箱地址
FTP_USER=whhack                     # FTP 用户名
FTP_PASS=123456                     # FTP 密码
FTP_IP=whhack.com                   # FTP 服务器地址
FTP_backup=backup                   # FTP 上存放备份的目录(需预先创建)
WEB_DATA=/home/www                  # 要备份的网站数据目录
# 要修改的配置结束

完整备份脚本

将以下脚本保存为 autoback.sh(注意文件名拼写)。

#!/bin/bash

# 要修改的配置开始
MYSQL_USER=root                     # MySQL 用户名
MYSQL_PASS=123456                   # MySQL 密码
MAIL_TO=whhack@whhack.com           # 接收备份的邮箱地址
FTP_USER=whhack                     # FTP 用户名
FTP_PASS=123456                     # FTP 密码
FTP_IP=whhack.com                   # FTP 服务器地址
FTP_backup=backup                   # FTP 上存放备份的目录(需预先创建)
WEB_DATA=/home/www                  # 要备份的网站数据目录
# 要修改的配置结束

# 定义备份文件名(基于日期)
DataBakName=Data_$(date +"%Y%m%d").tar.gz
WebBakName=Web_$(date +%Y%m%d).tar.gz
OldData=Data_$(date -d -5day +"%Y%m%d").tar.gz
OldWeb=Web_$(date -d -5day +"%Y%m%d").tar.gz

# 删除本地 3 天前的备份文件
rm -rf /home/backup/Data_$(date -d -3day +"%Y%m%d").tar.gz /home/backup/Web_$(date -d -3day +"%Y%m%d").tar.gz

cd /home/backup

# 导出所有数据库,每个数据库一个 .sql.gz 文件
for db in `/usr/local/mysql/bin/mysql -u$MYSQL_USER -p$MYSQL_PASS -B -N -e 'SHOW DATABASES' | xargs`; do
    (/usr/local/mysql/bin/mysqldump -u$MYSQL_USER -p$MYSQL_PASS ${db} | gzip -9 - > ${db}.sql.gz)
done

# 将数据库文件打包压缩
zip -r /home/backup/data.zip /usr/local/mysql/var/    # 直接打包数据库目录,可选择性地修改
zip -r /home/backup/sqldata.zip /home/backup/*.sql.gz
tar zcf /home/backup/$DataBakName  /home/backup/*.zip
rm -rf /home/backup/*.zip
rm -rf /home/backup/*.sql.gz

# 将数据库备份发送到邮箱(如果文件过大,请注释此行)
echo "主题:数据库备份" | mutt -a /home/backup/$DataBakName -s "内容:数据库备份" $MAIL_TO

# 压缩网站数据
tar zcf /home/backup/$WebBakName $WEB_DATA

# 上传到 FTP 空间,并删除 FTP 上 5 天前的备份
ftp -v -n $FTP_IP << END
user $FTP_USER $FTP_PASS
type binary
cd $FTP_backup
delete $OldData
delete $OldWeb
put $DataBakName
put $WebBakName
bye
END

脚本使用说明

1. 保存与权限设置

将脚本保存为 autoback.sh,并赋予执行权限:

chmod +x autoback.sh

注意:如果在执行时遇到类似 /bin/sh^M: bad interpreter: No such file or directory 的错误,是因为文件格式问题(通常是从 Windows 系统复制过来导致的)。可以使用 vim 进行修正:

:set fileformat=unix
:wq

2. 设置定时任务

使用 crontab 设置自动备份。例如,设置为每天凌晨 4 点执行:

crontab -e

在打开的编辑器中添加以下行:

00 4 * * * /home/autoback.sh

实用技巧与建议

  • 精细化数据库备份:如果只想备份特定数据库,可以创建一个仅对该数据库有权限的 MySQL 用户,并在脚本中使用该用户。
  • 选择性备份网站文件:如果网站数据量过大,可以只备份核心数据(如上传目录、附件等),而非整个网站程序,以缩短备份时间并减少存储压力。请根据实际情况修改 WEB_DATA 变量或调整压缩命令。
  • 备份文件管理:脚本中已包含删除旧备份的逻辑(本地和 FTP),请根据存储空间和保留需求调整删除天数(修改 OldDataOldWeb 变量中的数字)。

示例:Discuz X2 备份脚本

以下是一个针对 Discuz X2 论坛的备份脚本示例,它展示了如何备份特定的附件目录。您可以根据自己的目录结构进行调整。

#!/bin/bash

MYSQL_USER=webback
MYSQL_PASS=123456
MAIL_TO=whhack.com@gmail.com
FTP_USER=whhack
FTP_PASS=123456
FTP_IP=whhack.com
FTP_backup=web.com/day

DataBakName=Data_$(date +"%Y%m%d").tar.gz
WebBakName=Web_$(date +%Y%m%d).tar.gz
OldData=Data_$(date -d -5day +"%Y%m%d").tar.gz
OldWeb=Web_$(date -d -32day +"%Y%m%d").tar.gz

rm -rf /home/backup/day/Data_$(date -d -3day +"%Y%m%d").tar.gz /home/backup/day/Web_$(date -d -3day +"%Y%m%d").tar.gz
cd /home/backup/day

for db in `/usr/local/mysql/bin/mysql -u$MYSQL_USER -p$MYSQL_PASS -B -N -e 'SHOW DATABASES' | xargs`; do
    (/usr/local/mysql/bin/mysqldump -u$MYSQL_USER -p$MYSQL_PASS ${db} --skip-lock-tables | gzip -9 - > ${db}.sql.gz)
done

zip -r /home/backup/day/web001.zip /usr/local/mysql/var/web/
zip -r /home/backup/day/sql000.zip /home/backup/day/*.sql.gz
tar zcf /home/backup/day/$DataBakName  /home/backup/day/*.zip
rm -rf /home/backup/day/*.zip
rm -rf /home/backup/day/*.sql.gz

echo "数据库:web-mysql-beifen_$(date +"%Y%m%d")" | mutt -a /home/backup/day/$DataBakName -s "数据库:web-mysql-beifen_$(date +"%Y%m%d")" $MAIL_TO

WEB_DATA1=/home/wwwroot/web.com/data/attachment/forum/$(date -d -1day +"%Y%m/%d")/
WEB_DATA2=/home/wwwroot/web.com/data/attachment/album/$(date -d -1day +"%Y%m/%d")/
WEB_DATA3=/home/wwwroot/web.com/data/attachment/portal/$(date -d -1day +"%Y%m/%d")/
zip -r /home/backup/day/forum.zip $WEB_DATA1
zip -r /home/backup/day/album.zip $WEB_DATA2
zip -r /home/backup/day/portal.zip $WEB_DATA3

tar zcf /home/backup/day/$WebBakName /home/backup/day/*.zip
rm -rf /home/backup/day/*.zip

echo "每日附件:web-web-beifen_$(date +"%Y%m%d")" | mutt -a /home/backup/day/$WebBakName -s "每日附件:web-web-beifen_$(date +"%Y%m%d")" $MAIL_TO

/usr/local/php/sbin/php-fpm restart

ftp -v -n $FTP_IP << END
user $FTP_USER $FTP_PASS
type binary
cd $FTP_backup
delete $OldData
delete $OldWeb
put $DataBakName
put $WebBakName
bye
END

发表评论

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