定时备份数据脚本分享

一.配置文件备份脚本

    1.区块链底层节点配置文件备份

    2.数据库配置文件备份(my.cnf、redis.conf)

    3.应用程序配置文件备份(springboort程序配置文件、tomcat程序配置文件)

    以下是脚本分享:

#!/bin/bash

dates="$(date +%Y%m%d)/"
back_dir="/data/backup/$dates"
port="22"
user="root"
PASSWD='123456'

##区块链底层节点配置文件备份##
node_file="/usr/local/bubichain/config/*"
node_conf=(
172.16.16.77:$node_file
172.16.16.66:$node_file
172.16.16.69:$node_file
172.16.16.15:$node_file
)

for node in  ${node_conf[@]}
do
    node_ip=$(echo $node | awk -F: '{print $1}') 
    if [ ! -d ${back_dir}/node/$node_ip ];then
       mkdir -p ${back_dir}/node/$node_ip
    fi

##bak备份文件失败,重新尝试次数3##
    net_status="`echo ""|telnet $node_ip $port 2>/dev/null|grep "\^]"|wc -l`"
    if [ $net_status -eq 1 ];then
         sshpass -p $PASSWD scp -r -P $port $user@$node ${back_dir}/node/$node_ip
         if [ ! $? -eq 0 ];then
           echo "失败! 失败!! 失败!!!"
         fi
    else
       for i in `seq 3`
       do
          sshpass -p $PASSWD scp -r -P$port $user@$node ${back_dir}/node/$node_ip    
          if [ $? -eq 0 ];then
            break
          else
            echo "backup 失败!"
          fi
       done
    fi
done

##数据库配置文件备份##
db_conf=(
172.16.16.74:/etc/my.cnf
172.16.16.74:/bubidata/server/redis/conf/redis.conf
)


for db in ${db_conf[@]}
do
    db_ip=$(echo $db |awk -F: '{print $1}')
    if [ ! -d ${back_dir}/db/$db_ip ];then
    mkdir -p ${back_dir}/db/$db_ip
    fi




    net_status="`echo ""|telnet $db_ip $port 2>/dev/null|grep "\^]"|wc -l`"
    if [ $net_status -eq 1 ];then
         sshpass -p $PASSWD scp -r -P$port $user@$db ${back_dir}/db/$db_ip
         if [ ! $? -eq 0 ];then
           echo "失败! 失败!! 失败!!!"
         fi
    else
         for i in `seq 3`
         do
            sshpass -p $PASSWD scp -r -P$port $user@$db ${back_dir}/db/$db_ip    
            if [ $? -eq 0 ];then
              break
            else
              echo "backup 失败!"
            fi
         done
    fi
done


##应用程序配置文件备份##
app_dir="/bubidata/server/"
app_conf=(
172.16.16.15:${app_dir}data/scf-core-1.1.0-SNAPSHOT/config
172.16.16.15:${app_dir}data/bunuo-adapter-guiyangbank-0.1.0-SNAPSHOT/config
172.16.16.15:${app_dir}data/tomcat-settlement-8081/webapps/settlement/WEB-INF/classes

)

for app in ${app_conf[@]}
do
  #app_ip="$(echo $app |awk -F: '{print $1}')"
  app_dir="$(echo $app |awk -F '[/]' '{print $5}')"
  if [ ! -d ${back_dir}/app/$app_dir ];then
    mkdir -p ${back_dir}/app/$app_dir
  fi
 
  net_status="`echo ""|telnet $app_ip $port 2>/dev/null|grep "\^]"|wc -l`"
  if [ $net_status -eq 1 ];then
       sshpass -p $PASSWD  scp -r -P$port $user@$app ${back_dir}/app/$app_dir
       if [ ! $? -eq 0 ];then
         echo "失败! 失败!! 失败!!!"
       fi
  else
       for i in `seq 3`
       do
          sshpass -p $PASSWD scp -r -P$port $user@$app ${back_dir}/app/$app_dir
          if [ $? -eq 0 ];then
            break
          else
            echo "backup 失败!"
          fi
       done
  fi

done
[root@node ~]# crontab -l
#每天凌晨5点备份网站数据
0 5 * * * /bin/bash  /data/shell/file_backup.sh > /dev/null 2>&1

二.Mysql数据库备份(通过xtrabackup进行备份)

备份包含全量和增量进行备份,备份结果通过微信报警脚本进行通知

以下是备份脚本及python告警脚本

mysql备份脚本:

cat mysqlback.sh
#!/bin/bash
mysql_port=47029
#获取CPU核数
core_num=$(cat /proc/cpuinfo |grep "cores"|uniq|awk -F[':'] '{print $NF}'| tr -d " ")
#mysql备份的用户
user="backup"
#mysql备份的密码
password="123456"
#socket文件路径
socket_dir=$(grep "socket" /etc/my.cnf|uniq|awk -F['='] '{print $NF}')
#mysql配置文件
mysql_conf="/etc/my.cnf"
#innobackupex命令的路径
bak_commands=$(which innobackupex)
#备份目录
dirs="/data/backup"
#日志目录
log_dirs="$dirs/logs"
#获取当前年月日
dates=$(date +%F-%H-%M)
#完整备份的目录
full_dir="$dirs/full"
#增量备份的目录
zl_dir="$dirs/incre"
#7天做一次完整备份
FULLBACKUP_INTERVAL="604800"
#每天做一次增量备份
INC_INTERVAL="86400"



#记录脚本运行的日志
record_log(){
  echo "$(date +%F_%T) ----  $1" >>$log_dirs/$(date +%F)_bak.log
}

#mysql状态
mysql_status=$(netstat  -lntp | grep $mysql_port | wc -l)
#判断socket路径
[[ -z "$socket_dir" ]]&&recored_log  "Mysql Socket文件找不到"
#判断innobackupex命令是否存在
[[ -z "$bak_commands"  ]]&&record_log "innobackupex 命令找不到,请先安装"
#判断完整备份的目录是否存在
[ -d $full_dir ]||mkdir -p $full_dir
#判断增量备份的目录是否存在
[ -d $zl_dir ]||mkdir -p $zl_dir
#判断日志文件目录
[ -d $log_dirs ]||mkdir -p $log_dirs



if [ "$mysql_status" == "0" ];then  
     record_log  "MySQL 没有启动运行."
    exit 1
fi  



while true  
do
#查找最新的完全备份  
LATEST_FULL_BACKUP=$(find ${full_dir} -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1)
# 查找最近一次的完整备份目录大于5M,否则删除目录 
if [  $(du -s $full_dir/$LATEST_FULL_BACKUP|awk '{print $1}')  -lt 50000 ];then
   if [[ -z   $full_dir/$LATEST_FULL_BACKUP ]];then
     rm -rf  $full_dir/$LATEST_FULL_BACKUP
   fi
fi
   break
done






#完整备份
fullbackup(){
    record_log "开始进行Mysql完整备份"
    result=$($bak_commands   --defaults-file=$mysql_conf --socket=$socket_dir --user=$user --password=$password --parallel=$core_num  --no-timestamp   $full_dir/$dates 2>/tmp/temp.log) 
    status=$(tail  -1 /tmp/temp.log |grep 'completed OK!'|wc -l)
    if [[ $status -eq 1 ]];then
	record_log  "[INFO]  完整备份成功   包路径:[$full_dir/${dates}]"
        python /data/shell/weixin.py   8 "【mysql数据备份】"   "完整备份成功"
    else
	record_log  "[ERROR] 完整备份失败   包路径:[$full_dir/${dates}]"
        python /data/shell/weixin.py   8 "【mysql数据备份】"   "完整备份失败"
        if [  -d $full_dir/$dates  ];then
           echo  "error:$full_dir/$dates"
           rm -rf  $full_dir/$dates 
        fi
    fi
    >/tmp/temp.log


}

#压缩完整备份
fullbackup_tar(){
    record_log "开始进行Mysql完整备份"
    $bak_commands   --defaults-file=$mysql_conf --socket=$socket_dir --user=$user --password=$password  --parallel=$core_num   --stream=tar --no-timestamp  $full_dir/$dates 2>/tmp/temp.log|gzip > $full_dir/${dates}.tar.gz             
    status=$(tail  -1 /tmp/temp.log |grep 'completed OK!'|wc -l)
    if [[ $status -eq 1 ]];then
        record_log  "[INFO] 完整备份成功 tar包路径:[$full_dir/${dates}.tar.gz]"
    else
        record_log  "[ERROR]  完整备份失败  tar包路径:[$full_dir/${dates}.tar.gz]"
    fi
    >/tmp/temp.log
}


#增量备份1
zlbackup_one(){
        record_log "开始进行Mysql第一次增量备份"
        $bak_commands --defaults-file=$mysql_conf  --user=$user --password=$password  --socket=$socket_dir --no-timestamp --incremental $zl_dir --incremental-basedir=$full_dir 2>/tmp/temp.log  --parallel=$core_num
       status=$(tail  -1 /tmp/temp.log |grep 'completed OK!'|wc -l)
       echo "status:$status"
    if [ $status ==  1 ];then
        record_log  "[INFO]  增量备份成功   路径:[$zl_dir]"
        python /data/shell/weixin.py   8 "【mysql数据备份】"   "第一次增量备份成功"
    else
        record_log  "[ERROR] 增量备份失败  路径:[$zl_dir]"
        python /data/shell/weixin.py   8 "【mysql数据备份】"   "第一次增量备份失败"
    if [  -d $zl_dir  ];then
       echo "error:$zl_dir"
       rm -rf $zl_dir 
    fi 
    fi
    >/tmp/temp.log
}


#增量备份2
zlbackup_two(){
        record_log "开始进行Mysql第二次增量备份"
        $bak_commands --defaults-file=$mysql_conf  --user=$user --password=$password  --socket=$socket_dir --no-timestamp --incremental $zl_dir --incremental-basedir=$full_dir 2>/tmp/temp.log  --parallel=$core_num
       status=$(tail  -1 /tmp/temp.log |grep 'completed OK!'|wc -l)
    if [ $status ==  1 ];then
        record_log  "[INFO]  增量备份成功   路径:[$zl_dir]"
        python /data/shell/weixin.py   8 "【mysql数据备份】"   "第二次增量备份成功"
    else
        record_log  "[ERROR] 增量备份失败  路径:[$zl_dir]"
        python /data/shell/weixin.py   8 "【mysql数据备份】"   "第二次增量备份失败"
        if [  -d $zl_dir  ];then
           echo "error:$zl_dir"
           rm -rf  $zl_dir 
        fi
    fi
    >/tmp/temp.log
}


#获取最近一次备份的目录名
LATEST_FULL_BACKUP=$(find ${full_dir} -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1)
#根据最近一次备份的时间目录获取到时间戳
LATEST_FULL_BACKUP_CREATED_TIME=`stat -c %Y $full_dir/$LATEST_FULL_BACKUP`
#获取当前时间戳
CURRENT_TIME=$(date +%s)

if   [ -z $LATEST_FULL_BACKUP ];then
      #查找最近一次的完整备份,如果没有就进行一次完整备份
      echo '创建完整备份'
      fullbackup

elif [  -d $full_dir/$LATEST_FULL_BACKUP  -a   `expr   $(date +%s) -  $LATEST_FULL_BACKUP_CREATED_TIME`  -gt $FULLBACKUP_INTERVAL  ];then
      #最近一次完整备份的目录是否存在,并且根据当前的时间戳 - 上一次完整备份的时间戳是否大于7天,也就是要保证每7天做一次完整备份 

      echo `expr   $(date +%s) -  $LATEST_FULL_BACKUP_CREATED_TIME`
      echo '创建新的完整备份'
      fullbackup
elif  [ ! -d $dirs/incre/${LATEST_FULL_BACKUP}-zl1 -a  $LATEST_FULL_BACKUP  ];then
      zl_dir=$dirs/incre/${LATEST_FULL_BACKUP}-zl1 
      full_dir="/data/backup/full/$LATEST_FULL_BACKUP"
      echo '第一次增量备份'
      zlbackup_one
elif  [ ! -d $dirs/incre/${LATEST_FULL_BACKUP}-zl2  -a $LATEST_FULL_BACKUP ];then
      zl_dir=$dirs/incre/${LATEST_FULL_BACKUP}-zl2 
      full_dir="/data/backup/full/$LATEST_FULL_BACKUP"
      echo '第二次增量备份'
      zlbackup_two
else
      echo "现在不需要备份"
      python /data/shell/weixin.py   8 "【mysql数据备份】"   "时间未到,现在不需要备份"

fi

python微信告警脚本

#!/usr/bin/python
#_*_coding:utf-8 _*_
 
  
import urllib,urllib2
import json
import sys
import simplejson
import datetime
 
reload(sys)
sys.setdefaultencoding('utf-8')
 
 
def gettoken(corpid,corpsecret):
    gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + corpsecret
    print  gettoken_url
    try:
        token_file = urllib2.urlopen(gettoken_url)
    except urllib2.HTTPError as e:
        print e.code
        print e.read().decode("utf8")
        sys.exit()
    token_data = token_file.read().decode('utf-8')
    token_json = json.loads(token_data)
    token_json.keys()
    token = token_json['access_token']
    return token
  
  
  
def senddata(access_token,subject,content):
  
    send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + access_token
    nowDate = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    contentMsg = subject +'\n\n' + '备份对象:测试环境-测试链' + '\n' + '备份状态:' + content + '\n备份时间:' + nowDate
    send_values = {
        "toparty":"2",
        "msgtype":"text",
        "agentid":"1000002",
        "text":{
            "content": contentMsg
           },
        "safe":"0"
        }
#    send_data = json.dumps(send_values, ensure_ascii=False)
    send_data = simplejson.dumps(send_values, ensure_ascii=False).encode('utf-8')
    send_request = urllib2.Request(send_url, send_data)
    response = json.loads(urllib2.urlopen(send_request).read())
    print str(response)
  
  
if __name__ == '__main__':
    user = str(sys.argv[1])
    subject = str(sys.argv[2])
    content = str(sys.argv[3])
     
    corpid =  'wwdasdas74d24732db'
    corpsecret = 'FoYOhn3ITNfxzRngJItrgG59qPG-rRwqeqwU_3IAXZTE'
    accesstoken = gettoken(corpid,corpsecret)
    senddata(accesstoken,subject,content)
 
 
定时任务
01 03 * * 1,3,5 /data/shell/mysqlbackup.sh

每周1,3,5备份一次

猜你喜欢

转载自www.cnblogs.com/brucetang/p/9755260.html
今日推荐