网站文件、数据库一键定时备份脚本
侧边栏壁纸
  • 累计撰写 32 篇文章
  • 累计收到 11 条评论

网站文件、数据库一键定时备份脚本

翔翎
2022-06-06 / 0 评论 / 62 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年07月15日,已超过860天没有更新,若内容或图片失效,请留言反馈。

脚本特点:

  • 根据设定(参照脚本备注进行对应设定)自动化备份网站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

创建定时任务

  • 使用crontab -e 添加如下指令:
0 0 * * * /root/backup.sh -z
  • 保存任务,完成定时任务创建。以上任务含义:每天0点进行备份,也可根据自己需要修改上面的定时时间。

数据还原指令:

bash backup.sh -u 20220606
  • 20220606为备份文件的备份日期(对应备份文件中日期格式);
0

评论 (0)

取消