标签 脚本 下的文章

按月全量备份/按天增量备份 脚本

backup.sh 月初全量备份,之后按天增量备份。建议将历年附件等归档内容下载备份后,线上不再备份此数据。每月备份目录可自动上传到OSS中。

    #!/bin/bash
    
    # 整站文件按月备份并同步到oss
    # 按天增量备份
    # /web仅保存增量备份
    
    tar=/bin/tar
    projectPath=/web_lv/
    project=folderName
    #增量备份存放位置
    bakPath=/web/site/"$project"
    #全量备份存在位置
    fullPath=/web_lv/full_bak
    
    ym=`date +%Y%m`
    ymd=`date +%Y%m%d`
    nowMonth=`date +%Y%m01`
    last=`date -d"$nowMonth last month" +%Y%m`
    monthBakPath=$fullPath/$ym
    gidShot=Gid$project$ym
    fullName=$ym
    dailyName=$ymd
    log=$bakPath/$project.log
    
    chk_month()
    {
      if [ -e "$monthBakPath"/"$project"_"$ym"_month.tar.gz ];then
        echo ""$project"_"$ym"_month.tar.gz file exist!! ====`date +%Y-%m-%d-%T` " >>$log
      else
        tar_month
      fi
    }
    
    chk_daily()
    {
      while [ -e "$bakPath"/"$ym"/"$project"_"$dailyName"_daily.tar.gz ]
        do
          dailyName=`echo "$dailyName + 0.1" | bc `
        done
    }
    
    #增量备份
    tar_daily()
    {
      cd $projectPath
      echo "START=====`date +%Y-%m-%d-%T` ==== CREATE "$project"_"$dailyName"_daily.tar.gz" >> $log
      sleep 3
      $tar -g $fullPath/$gidShot -zcf $bakPath/$ym/"$project"_"$dailyName"_daily.tar.gz --exclude=runtime --exclude=app --exclude=sensen --exclude=vendor --exclude=public/tmp --exclude=public/uploads/tmp --exclude=public/uploads/attach/2021 $project
      echo "END========`date +%Y-%m-%d-%T` ==== CREATE "$project"_"$dailyName"_daily.tar.gz" >> $log
    }
    
    #全量备份
    tar_month()
    {
      touch $fullPath/$gidShot
      cd $projectPath
      echo "START=====`date +%Y-%m-%d-%T` ==== CREATE "$project"_"$fullName"_month.tar.gz" >> $log
      $tar -g $fullPath/$gidShot -zcf $monthBakPath/"$project"_month.tar.gz --exclude=runtime --exclude=app --exclude=sensen --exclude=vendor --exclude=public/tmp --exclude=public/uploads/tmp --exclude=public/uploads/attach/2021 $project
      echo "END========`date +%Y-%m-%d-%T` ==== CREATE "$project"_"$fullName"_month.tar.gz" >> $log
    }
    
    # 废弃方法,直接将全量及增量数据备份到指定目录
    move_full()
    {
      echo "start----move" >> $log
      mv -f $monthBakPath/"$project"_month.tar.gz /web/site/full/
      echo "end----move" >> $log
    }
    
    backup()
    {
      if [ -d $monthBakPath ]; then
        #chk_month
        chk_daily
        tar_daily
      else
        #delete last month
        echo "start----delete last month data" >> $log
        rm -rf $bakPath/$last
        rm -rf $fullPath/*
        mkdir -p $fullPath/$ym
        mkdir -p $bakPath/$ym
        tar_month
        #move_full
      fi
    }
    
    if [ -d $bakPath ];then
      backup
    else
      mkdir -p $bakPath
      backup
    fi

从备份数据中恢复脚本

recover.sh
backup.sh脚本备份后的数据进行恢复(恢复前需先确保已部署系统)

#!/bin/bash

#---------------------------------------
# 从备份数据中恢复OA数据
# author: SenSen 1050575278
# date: 2022/04/13
# 需先创建完oa系统后方可使用
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

read -p "Warning! Enter 'recover' to continue : " input

if [ "$input" == 'recover' ]; then
  oaDir='/web/oa/'
  backDir='/bak_oa/'
  sysDir=`ls /web/oa`

  for f in ${sysDir}
    do
      if [ ! -f "${backDir}${f}.tar.gz" ]; then
        echo "${f}.tar.gz not found" >> /backup/recover.log
        continue
      fi
      curtime=`date +"%Y/%m/%d %H:%M:%S"`
      tar -zxf ${backDir}${f}.tar.gz -C ${oaDir}${f}
      echo "${curtime} ${f} done" >> /backup/recover.log
    done
else
  echo "Error: invalid input"
fi

批量备份数据到指定目录脚本

backup.sh 后期数据量增大可考虑调整为增量备份(指定备份目录)

#!/bin/bash

#---------------------------------------
# 备份oa数据到指定目录下
# author: SenSen 1050575278
# date: 2022/04/13
# todo 调整为增量备份(当前数据量有限,暂不处理)
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

#所在目录
dir='/web/oa/'
dist='/bak_oa/'
#指定天开始备份
backDay=(06 14 21 28)
dayNum=`date +"%d"`
#单次备份的oa数量
perNum=10
day=`date +"%Y%m%d"`
dayFile='/backup/'${day}
#自动获取系统目录文件 仅可包含oa系统文件
sysDir=`ls /web/oa`
num=0
tmp=()

for i in "${backDay[@]}"
  do
    if [[ "${i}" == "${dayNum}" ]]; then

      if [ ! -f "${dayFile}" ]; then
        touch ${dayFile}
      fi

      #获取指定数量的未备份oa
      for f in ${sysDir}
        do
          #判断是否今日已执行备份
          if [ `grep -c ${f} ${dayFile}` -eq 0 ];then
            #记入到新数组
            tmp[${num}]=${f}
            ((num++))
            if [ ${num} -eq ${perNum} ]; then
              break
            fi
          fi
        done

      #执行备份
      for f in "${tmp[@]}"
        do
          curtime=`date +"%Y/%m/%d %H:%M:%S"`
          cd ${dir}${f}
          echo "${f}" >> ${dayFile}
          tar -zcf ${dist}/${f}.tar.gz public/uploads/attach public/uploads/seal_apply public/uploads/ueditor public/uploads/work .env
          echo "${curtime} ${f} done" >> /backup/site.log
        done
    fi
  done

批量导入数据库脚本

import.sh
将宝塔面板自动备份的数据库文件批量创建数据库并导入。

#!/bin/bash

#---------------------------------------
# 批量导入数据库
# author: SenSen 1050575278
# date: 2022/03/28
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

read -p "Warning! Enter 'y' to continue : " input

#判断是否存在参数,不存在则取消
if [ "$input" == 'y' ] || [ "$input" == 'Y' ]; then

  #连接数据库
  mysqlPath=`which mysql`
  db_con="${mysqlPath} -uroot -pxxx"

  #获取备份数据所在目录
  dir=/backup/mysql/
  cd /backup/mysql

  #自动获取系统目录文件 仅可包含oa系统文件
  sysDir=`ls /backup/mysql`

  for db in ${sysDir}
    do
      #获取db的名字 db_t002_20220327_223004.sql.gz
      ext=${db##*.}
      if [ "${ext}" != "sql" ]; then
        dbName=${db:3:4}
        sqlName=${db:0:27}
        gzip -d ${db}
        ${db_con} -e "create database ${dbName} default character set utf8mb4 default collate utf8mb4_general_ci;"
        ${db_con} -e "use ${dbName}; source ${dir}${sqlName};"
        echo "${dbName} done" >> import.txt
      fi
    done
else
  echo "Error: invalid input"
fi

批量替换文件内容脚本

sed.sh
脚本功能:可批量对系统中指定文件替换内容

#!/bin/bash

#---------------------------------------
# 批量替换文件内容
# author: SenSen 1050575278
# date: 2022/03/28
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

read -p "Warning! Enter 'y' to continue : " input

#判断是否存在参数,不存在则取消
if [ "$input" == 'y' ] || [ "$input" == 'Y' ]; then
  #所在目录
  dir='/web/oa/'

  #自动获取系统目录文件 仅可包含oa系统文件
  sysDir=`ls /web/oa`

  #排除目录
  excluded=()

  for f in ${sysDir}
    do
      #获取当前时间
      curtime=`date +"%Y/%m/%d %H:%M:%S"`

      #排除指定目录
      if [[ ${excluded[@]/${f}/} != ${excluded[@]} ]]; then
        echo "jump"
        continue
      fi

      #进入目录
     cd ${dir}${f}
     #备份
     cp .env .env.bak
     #执行对应操作
     #sed -i "8s/127.0.0.1/localhost/" .env

      echo "${curtime} ${f} done"
    done
else
  echo "Error: invalid input"
fi

批量获取或更新数据库中的业务数据脚本

mysql_bat.php 用于获取线上数据库中的数据或批量更新数据库中的数据。

    <?php
    
    //演示脚本 用于查询线上系统数据库问题
    $dbs = ['x001', 'x002', 'x003'];
    
    file_put_contents('mysql_bat.txt', '');
    
    foreach ($dbs as $v) {
        $mysql_conf = array('host' => 'localhost', 'db' => $v, 'db_user' => 'xxx', 'db_pwd'  => 'xxx');
        
        $mysqli = new mysqli($mysql_conf['host'], $mysql_conf['db_user'], $mysql_conf['db_pwd']);
        $mysqli->query("set names 'utf8';");//编码转化
        $select_db = mysqli_select_db($mysqli, $mysql_conf['db']);
        if ($select_db) {
            //查询律所部门名称
            $deptName = $configName = '';
            $sql1 = "select name from {$v}.lawfirm_dept where id=1;";
            $res1 = $mysqli->query($sql1);
        
            while ($row = $res1->fetch_assoc()) {
                $deptName = $row['name'];
            }
        
            file_put_contents('mysql_bat.txt', '[new] '.$deptName.PHP_EOL, FILE_APPEND);
        
            $res1->free();
            $mysqli->close();
        }else{
            file_put_contents('mysql_bat.txt', '[connect error] '.$v.PHP_EOL, FILE_APPEND);
            continue;
        }
        
        // sleep(1);
    }

清空系统日志、文件脚本

clear_log.sh 批量清空系统日志文件

    #!/bin/bash
    
    #---------------------------------------
    # 清空访问日志及错误日志(清理前务必保存6个月以上数据)
    # author: SenSen 1050575278
    # date: 2022/04/14
    # 注意:所有脚本需测试后方可使用!!!
    #---------------------------------------
    
    #所在目录
    cd /www/wwwlogs/
    sysDir=`ls /web/oa`
    
    for f in ${sysDir}
      do
        echo > ${f}".speaklaw.cn.log"
        echo > ${f}".speaklaw.cn.error.log"
        echo "${f} done"
      done


`clear_file.sh` 批量删除系统中的垃圾文件

    #!/bin/bash
    
    #---------------------------------------
    # 清理指定文件
    # author: SenSen 1050575278
    # date: 2021/11/30
    # 注意:所有脚本需测试后方可使用!!!
    #---------------------------------------
    
    read -p "Warning! Enter 'y' to continue : " input
    
    #判断是否存在参数,不存在则取消
    if [ "$input" == 'y' ] || [ "$input" == 'Y' ]; then
      #所在目录
      dir='/web/oa/'
    
      #自动获取系统目录文件 仅可包含oa系统文件
      sysDir=`ls /web/oa`
    
      #排除目录
      excluded=()
    
      for f in ${sysDir}
        do
          #获取当前时间
          curtime=`date +"%Y/%m/%d %H:%M:%S"`
    
          #排除指定目录
          if [[ ${excluded[@]/${f}/} != ${excluded[@]} ]]; then
            echo "jump"
            continue
          fi
    
          #进入目录
         cd ${dir}${f}
         #执行对应操作 务必将要删除的文件路径填写准确
         rm -rf public/tmp/*
         rm -rf runtime/*
    
          echo "${curtime} ${f} done"
        done
    else
      echo "Error: invalid input"
    fi

复制创建一份新系统脚本

create.sh
通过已有的系统文件,排除当前系统的附件等目录,创建为一份新的系统。$1为被复制的老系统,$2为新系统目录名称,create.exclude为排除复制的目录。

#!/bin/bash

#---------------------------------------
# 创建新的OA系统
# author: SenSen 1050575278
# date: 2021/11/29
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

if [ "$1" ] && [ "$2" ]; then

  #获取当前时间
  curtime=`date +"%Y/%m/%d %H:%M:%S"`

  #所在目录
  cd /web/oa

  rsync -av --exclude-from="/web/shell/create.exclude" ${1}/ ${2}/

  #拷贝原env配置
  cd ${2}
  cp -r public/install/.env ./.env

  #todo 暂不考虑自动创建网站+配置
else
    echo "Error: param1 is source ('like a001') && param2 is target ('like a999')"
fi

create.exlude

runtime/*
public/install/install.lock
public/phpExcel/*
public/uploads/attach/*
public/uploads/doc/*