本脚本的主要功能如下:
- 自动定时备份指定的网站文件与数据库,并上传至指定的 FTP 空间。
- 自动删除旧的备份文件,可自定义保留天数。
- 数据库备份采用多重保险:除上传至 FTP 外,还会通过邮件发送备份文件(作为附件),实现双重备份。
准备工作
在开始之前,请确保完成以下准备工作:
- 创建备份目录:
mkdir -p /home/backup - 安装邮件发送组件:
yum install sendmail mutt - 安装 zip 压缩工具:
yum install zip - 安装 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),请根据存储空间和保留需求调整删除天数(修改
OldData和OldWeb变量中的数字)。
示例: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