脚本特点:
- 根据设定(参照脚本备注进行对应设定)自动化备份网站web文件和相关数据库到对应目录;
- 通过命令调用一键还原网站web文件和数据库;
- 文件压缩策略采取相对路径;
- 仅保留最近7天的备份文件,超过该时间的备份文件自动删除,达到节省空间的目的(如需要延长保留时间,修改脚本中对备份文件的保存天数参数即可,在脚本
第21行
); - 备份文件命名添加日期标注,方便筛选文件;
- 通过参数传递方式来实现备份、还原功能,eg:
bash backup.sh -z
实现一键备份,bash backup.sh -u 20220606
实现一键还原,20220606
为备份文件的备份日期(文件名中包含); - 脚本兼容mysql、mariadb数据库。
使用方法:
- 在vps上的/root目录创建backup.sh文件,复制下方代码;
- 参照脚本备注进行对应设定,保存文件。
脚本代码如下:
#!/bin/bash
# 使用方法
# 备份:bash backup.sh -z
# 还原:bash backup.sh -u 20220606 (20220606为备份文件的日期)
back(){
# 数据库账号信息
DB_USER="" # 数据库用户名
DB_PWD="" # 数据库密码
DB_HOST="" # 主机地址
DB_PORT="3306" #数据库端口号,默认3306
# MYSQL所在目录
MYSQL_DIR="/usr/local/mysql"
# 备份文件存放目录
BAK_DIR="/home/bak"
# 需要备份的网站目录
WEB_DIR="/home/wwwroot"
# 时间格式化,如 20200902
DATE=`date +%Y%m%d`
# 备份脚本保存的天数
DEL_DAY=7
# 要备份的数据库,空格分隔
DATABASES=("typehco" "git")
# 创建日期目录
if [[ ! -d ${BAK_DIR}/${DATE} ]]; then
mkdir -p $BAK_DIR/$DATE
fi
# echo "-------------------$(date +%F_%T) start ---------------" >>${BAK_DIR}/db_backup.log
for database in "${DATABASES[@]}"
do
# 执行备份命令
$MYSQL_DIR/bin/mysqldump --defaults-extra-file=/etc/my.cnf ${database} > $BAK_DIR/$DATE/${database}.sql
done
# echo "--- backup file created: $BAK_DIR/db_backup_$DATE.tar.gz" >>${BAK_DIR}/db_backup.log
# 将备份好的sql脚本压缩到db_backup_yyyyMMdd.tar.gz
cd $BAK_DIR/$DATE
tar -Pczf $BAK_DIR/db_backup_$DATE.tar.gz ./
# 将Blog的usr目录压缩到web_backup_yyyyMMdd.tar.gz
cd $WEB_DIR
tar -Pczf $BAK_DIR/web_backup_$DATE.tar.gz --exclude=.user.ini ./
# 压缩后,删除压缩前的备份文件和目录
rm -f $BAK_DIR/$DATE/*
rmdir $BAK_DIR/$DATE
# 遍历备份目录下的压缩文件
LIST=$(ls ${BAK_DIR}/*_backup_*)
# LISt1=$(ls ${BAK_DIR}/web_backup_*)
# 获取7天前的时间,用于作比较,早于该时间的文件将删除
SECONDS=$(date -d "$(date +%F) -${DEL_DAY} days" +%s)
for index in ${LIST}
do
# 对文件名进行格式化,取命名末尾的时间,格式如 20200902
timeString=$(echo ${index} | egrep -o "?[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]")
if [ -n "$timeString" ]
then
indexDate=${timeString//./-}
indexSecond=$( date -d ${indexDate} +%s )
# 与当天的时间做对比,把早于7天的备份文件删除
if [ $(( $SECONDS- $indexSecond )) -gt 0 ]
then
rm $index
# echo "---- deleted old backup file : $index " >>${BAK_DIR}/db_backup.log
fi
fi
done
# 此处根据自己rclone config的配置进行修改
rclone sync /home/bak nongjiale:blog-bak -v -P
}
restore(){
# 数据库目录
MYSQL_DIR="/usr/local/mysql"
# 数据库账户信息
DB_USER="" # 数据库用户名
DB_PWD="" # 数据库密码
DB_HOST="" # 主机地址
DB_PORT="3306" # 数据库端口,默认3306
DATABASES="" # 要还原的数据库名
# 备份文件路径
BAK_DIR=""
# 要还原网站所在路径
WEB_DIR=""
# 还原网站备份
tar -xzf $BAK_DIR/web_backup_$DATE.tar.gz -C $WEB_DIR
if [[ "$?" -eq 0 ]]; then
echo "网站数据恢复成功。"
else
echo "出现错误,网站数据恢复失败。"
fi
# 还原数据库备份
tar -xzf $BAK_DIR/db_backup_$DATE.tar.gz -C ./
mysql -h$DB_HOST -u$DB_USER -p$DB_PWD ${DATABASES} < ./${DATABASES}.sql
# 如您在使用过程中出现mysqldump: [Warning] Using a password on the command line interface can be insecure这条错误,请参阅这个文章进行设置:https://blog.csdn.net/qq_31851107/article/details/102578183,然后将上面命令行注释注释掉,取消下面行的注释,原因是mysql自5.7版本开始,考虑到mysql的安全性而更改对保护机制,在mysqldump备份数据库对时候不能直接在命令行上书写数据库的密码
# mysql --defaults-extra-file=/etc/my.cnf ${DATABASES} < ./${DATABASES}.sql
rm *.sql
if [[ "$?" -eq 0 ]]; then
echo "数据库恢复成功。"
else
echo "出现错误,数据库恢复失败。"
fi
}
if [[ $# > 0 ]];then
key="$1"
DATE="$2"
case $key in
-z|--back)
back
;;
-u|--restore)
restore
;;
esac
else
echo "出错了,请注意传参····"
fi
创建定时任务
0 0 * * * /root/backup.sh -z
- 保存任务,完成定时任务创建。以上任务含义:每天0点进行备份,也可根据自己需要修改上面的定时时间。
数据还原指令:
bash backup.sh -u 20220606
20220606
为备份文件的备份日期(对应备份文件中日期格式);
评论 (0)