一.配置文件备份脚本
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备份一次